diff --git a/changelog.d/1106-policyengine-uk-2-123.changed.md b/changelog.d/1106-policyengine-uk-2-123.changed.md new file mode 100644 index 000000000..88bd6e1f0 --- /dev/null +++ b/changelog.d/1106-policyengine-uk-2-123.changed.md @@ -0,0 +1 @@ +The lock's UK side moves to policyengine-uk 2.123.0, and the UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0 (microcosm#1106). Nothing else in the lock moves: policyengine-core stays at 3.32.19 on the UK side and at the US side's own 3.32.5 pin (microcosm#1086). 2.123.0 carries PolicyEngine/policyengine-uk#2172: the landlord inputs `property_rental_income`, `property_finance_costs` and `property_finance_costs_brought_forward`, `property_income` documented as the SPI profit concept, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit, so a profit above £1,000 with no receipts gets no allowance (#2172 measured +£0.68bn income tax on Microcosm UK in 2025). The move also brings #2160 (UC work-related requirements at the State Pension Credit qualifying age), #2096 (the VAT reduced-rate history), #2097 (a tax credits rate date) and #2144 (a guarantee credit boundary). Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs; the three new property inputs are uncovered), the concept mapping reviewed against 2.123.0 (the `property_income` note quotes the new documentation), the H2 fixture's numerical dependency, the coverage manifest's source digests and `APPROVED_UV_LOCK_SHA256`. diff --git a/changelog.d/1106-property-wealth-not-exported.fixed.md b/changelog.d/1106-property-wealth-not-exported.fixed.md new file mode 100644 index 000000000..0d4edd49c --- /dev/null +++ b/changelog.d/1106-property-wealth-not-exported.fixed.md @@ -0,0 +1 @@ +The UK release and the calibration engine no longer receive the Wealth and Assets Survey `property_wealth` total (microcosm#1106, the uk-data#543 defect). policyengine-uk derives `property_wealth` from `main_residence_value`, `other_residential_property_value` and `non_residential_property_value`; a persisted copy overrode that sum, has no uprating index (the published aa31bdf6 year files hold it flat from 2026 to 2030 while the sum grows 13%), and also counted owned land and the overseas and other-property remainder. The release export and the measure resolver's scratch H5 now drop it, and the resolver's receipt names what it left out; the spine keeps it for the WAS stage's own checks. It is a reviewed export exclusion, a declared engine-derived exclusion in the coverage ledger (144 required inputs and one reviewed exclusion), and the coverage gate now reads the frame the release writes. diff --git a/changelog.d/1106-spi-property-finance-costs.added.md b/changelog.d/1106-spi-property-finance-costs.added.md new file mode 100644 index 000000000..b9f65157b --- /dev/null +++ b/changelog.d/1106-spi-property-finance-costs.added.md @@ -0,0 +1 @@ +The SPI channel draws landlords' restricted residential finance costs into the new `property_finance_costs` input (microcosm#1106). The donor tape's `LLIR_RESTRICT_AMT_TOT` is the "restricted land property finance cost", the costs of dwelling-related loans that ITTOIA 2005 s. 272A no longer deducts and s. 274A relieves as a tax reduction (SPI Public Use Tape 2022-23 documentation). It joins the first-stage SPI model as its last output, so it conditions on every income leaf, property income included, and leaves every earlier draw unchanged; the band donors copy it with the rest of the record. It is uprated from 2022 by the index policyengine-uk gives the variable, `obr.mortgage_interest`. The donor is refused unless `TAX_CRED`, which carries the 20% relief with the other tax credits, has a median ratio to the costs between 0.195 and 0.205; the stage receipt records the check. FRS-channel rows start at zero; the next stage imputes their landlords' costs. The column joins the export allow-list (the frozen enhanced FRS has no such column) and the gate-battery pins move with `gates.json`. diff --git a/changelog.d/1106-spi-property-income-amounts-bound.changed.md b/changelog.d/1106-spi-property-income-amounts-bound.changed.md new file mode 100644 index 000000000..036378d4a --- /dev/null +++ b/changelog.d/1106-spi-property-income-amounts-bound.changed.md @@ -0,0 +1 @@ +The 13 SPI Table 3.7 net property-income amounts by total-income band are bound (microcosm#1106, María's ruling of 2026-10-05). They had been signed out over the incumbent's x1.9 scaling (uk-data#311), which set HMRC Property Rental Income Statistics receipts against the SPI's net concept; HMRC confirmed those statistics are before allowable expenses. The facts now bind unscaled on `property_income`, landlords' profit after allowable expenses and before residential finance costs, uprated from 2023-24 to 2025 by the pinned per-capita GDP index (factor 1.0826): £31.78bn in all against the incumbent fixture's £55.78bn (1.9 × £29.36bn), for example £5.85bn against £10.26bn in the £50,000 to £70,000 band and £2.76bn against £4.85bn in the £100,000 to £150,000 band. Active national references go from 1,231 to 1,244. Both national compile-parity receipts gain the 13 rows (the 2025 incumbent receipt as calibration drift, with the retired scaling as the reason); the local surface is unchanged. The 13 new specs move the compiled register, so uk-candidate-eval's frozen scoring register needs a re-freeze before the next national solve. diff --git a/changelog.d/1106-uk-property-components-stage.added.md b/changelog.d/1106-uk-property-components-stage.added.md new file mode 100644 index 000000000..5ec747258 --- /dev/null +++ b/changelog.d/1106-uk-property-components-stage.added.md @@ -0,0 +1,11 @@ +A person-grain `property_components` stage joins the UK spine after `regional_property_uprating` (microcosm#1106). It fills the two landlord inputs policyengine-uk 2.123.0 reads beside `property_income` (PolicyEngine/policyengine-uk#2172): `property_rental_income`, the receipts before expenses, on every landlord, and `property_finance_costs` on the FRS concept. + +Finance costs on the FRS concept. FRS landlords report ROYYR1 after show card K6, which nets mortgage payments and loan interest, so their profit sits below the SPI concept. The stage draws their restricted finance costs from the SPI 2022-23 tape, prepared and rebased exactly as `hmrc_spi_income_spine` does (profit by `obr.per_capita.gdp`, finance costs by `obr.mortgage_interest`), among the tape's landlords whose profit after finance costs is positive, the analog of an FRS landlord reporting a profit. Whether a landlord has costs follows a person-keyed uniform against the tape's share in their decile of profit after finance costs; how much comes from the regime-gated QRF fitted on the analog landlords with costs, given that profit and age, at a second person-keyed quantile. The drawn costs are added back to `property_income`, so the engine relieves the interest once, as the s. 274A tax reduction; the mortgage capital the card also nets stays netted. The add-back is the recommended ruling of decision 6 and is to be confirmed with Max before merge. The SPI channel keeps the costs the income stage drew. + +Receipts for every landlord. No microdata carries receipts beside profit, so they are constructed from HMRC's Property Rental Income Statistics for 2024-25, vendored from the pinned Chronicle feed as `hmrc_property_rental_income_facts.json` (Tables 1, 2, 6, 8 and 13) with a typed loader (`uk_runtime.hmrc_property_rental`). Landlords on both channels are ranked by profit and walked top band first into Table 13's eleven bands of rental income with the CGT Table 3 walk's rule (whole persons, one seeded systematic offset), each band filled to its share of the individuals-basis landlords (the all-entity counts times Table 1's individuals' share) times the spine's landlord weight. The spine carries fewer landlords than PRIS before calibration (2.21m against 2.85m), so filling the published counts would push every profit rank into a higher band. Within a bounded band receipts are linear in the weight-ranked position, from the upper bound down, never below profit; the open top band takes `max(100,000, k x profit)` with `k` solved so that receipts per landlord reach the individuals' Table 2 receipts per landlord. Receipts less profit are the deductible expenses. Sub-letting rent keeps equal receipts and no expenses until Rent a Room is released (PolicyEngine/policyengine-uk#2002). Landlords without profit carry no receipts, a recorded residual. + +PRIS is a diagnostic, not a calibration target. Receipts are a fixed function of profit rank, so every PRIS count or receipts target measured moved weight across the SPI's total-income bands and pushed the SPI property amounts out of their bound (`experiments/1106-uk-property-income-receipts.md`). PRIS's landlords also include those whose expenses meet or exceed their receipts, whom the spine carries with no profit and no receipts. The stage receipt reports the spine against PRIS instead. + +Gates. `uk_stage_property_components` (stage health, release-blocking) joins the spine gate scope: no receipts below profit, every band above the lowest within twice the largest landlord weight of its share of the spine's landlords, and the top band's multiplier below its cap. The receipt also records the tape incidence and its realisation, the totals against PRIS, the channel split and the share of landlords whose household holds rental property. + +Surfaces that move in lockstep: the sources manifest and its projection, two schema branches and the operation-kind allow-list, the graph roster, kernel registry and spine tool, the H2 fixture (40 stages; synthetic PRIS facts sized to the fixture frame) and the coverage manifest, the vendoring register and the country package, the export allow-list, `gates.json` and the gate-battery digests. diff --git a/docs/concept-coverage/policyengine-uk.md b/docs/concept-coverage/policyengine-uk.md index a5fb8216e..03ee38520 100644 --- a/docs/concept-coverage/policyengine-uk.md +++ b/docs/concept-coverage/policyengine-uk.md @@ -1,11 +1,11 @@ # Concept coverage: policyengine-uk -Engine version `2.122.2`; concept schema `d824f5e97d58`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand. +Engine version `2.123.0`; concept schema `d824f5e97d58`. Generated by `tools/refresh_concept_coverage.py`; do not edit by hand. -- Engine inputs: 285 +- Engine inputs: 288 - Fed by a concept: 40 - Structural: 11 -- Uncovered: 234 +- Uncovered: 237 - Mapped but missing from the engine: 0 ## Inputs each concept feeds @@ -57,6 +57,6 @@ Engine version `2.122.2`; concept schema `d824f5e97d58`. Generated by `tools/ref `accommodation_type`, `alcohol_and_tobacco_consumption`, `beer_draught_share`, `beer_litres`, `brma`, `bus_fare_spending_reported`, `bus_subsidy_spending`, `cash_isa`, `cider_draught_share`, `cider_litres`, `cigarettes_per_week`, `cigars_grams_per_week`, `clothing_and_footwear_consumption`, `communication_consumption`, `consumer_debt`, `corporate_wealth`, `council_tax_band`, `cumulative_non_residential_rent`, `cumulative_residential_rent`, `dfe_education_spending`, `diesel_spending`, `domestic_energy_consumption`, `domestic_rates`, `education_consumption`, `electricity_consumption`, `external_child_payments`, `food_and_non_alcoholic_beverages_consumption`, `full_rate_vat_expenditure_rate`, `gas_consumption`, `gross_financial_wealth`, `hand_rolling_tobacco_grams_per_week`, `health_consumption`, `heated_tobacco_grams_per_week`, `household_furnishings_consumption`, `household_owns_tv`, `housing_service_charges`, `housing_water_and_electricity_consumption`, `in_original_frs`, `in_rural_fuel_duty_relief_area`, `is_shared_accommodation`, `local_authority`, `lpg_kg`, `main_residence_value`, `main_residential_property_purchased_is_first_home`, `miscellaneous_consumption`, `mortgage_debt`, `natural_gas_kg`, `net_financial_wealth`, `non_residential_property_value`, `non_residential_rent`, `num_bedrooms`, `num_vehicles`, `other_fermented_draught_share`, `other_fermented_litres`, `other_residential_property_value`, `other_tobacco_grams_per_week`, `owned_land`, `petrol_spending`, `private_pension_wealth`, `property_purchased`, `rail_usage`, `recreation_consumption`, `region`, `restaurants_and_hotels_consumption`, `savings`, `sparkling_cider_draught_share`, `sparkling_cider_litres`, `spi_imputed`, `spirits_draught_share`, `spirits_litres`, `stocks_and_shares_isa`, `structural_insurance_payments`, `transport_consumption`, `uc_migrated`, `water_and_sewerage_charges`, `wine_draught_share`, `wine_litres`, `would_evade_tv_licence_fee` -### person (144) +### person (147) -`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `pension_contributions_via_salary_sacrifice`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_category`, `pip_m_category`, `private_transfer_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `trading_loss`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_limited_capability_for_work`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_ineligible_partner`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported` +`a_and_e_visits`, `aa_category`, `access_fund`, `admitted_patient_visits`, `adult_dependants_grant_has_other_adult_dependant`, `adult_dependants_grant_other_adult_income`, `adult_dependants_grant_receives_postgraduate_loan`, `adult_ema`, `afcs_reported`, `age_started_or_accepted_current_education_or_training`, `armed_forces_independence_payment`, `attends_private_school_random_draw`, `base_net_income`, `blind_persons_allowance`, `bsp_reported`, `bursary_fund_16_to_19_in_care_or_care_leaver`, `bursary_fund_16_to_19_participation_costs`, `bursary_fund_16_to_19_self_supporting`, `bus_in_london_trips`, `bus_pass_eligible`, `capital_allowances`, `capital_gains_badr`, `capital_gains_carried_interest`, `capital_gains_residential_property`, `car_co2_emissions`, `car_engine_size`, `car_first_registration_date`, `car_fuel_type`, `car_is_ved_exempt`, `car_list_price`, `care_hours`, `carers_allowance_reported`, `charitable_investment_gifts`, `child_benefit_reported`, `child_ema`, `child_tax_credit_reported`, `childcare_expenses`, `childcare_grant_child_has_special_educational_needs`, `childcare_grant_provider_is_nanny`, `childcare_grant_receives_nhs_childcare_support`, `childcare_grant_receives_postgraduate_loan`, `council_tax_benefit_reported`, `covenanted_payments`, `deficiency_relief`, `disabled_students_allowance_eligible_expenses`, `disabled_students_allowance_receives_equivalent_support`, `dla_m_category`, `dla_sc_category`, `education_grants`, `employee_pension_contributions_reported`, `employer_pension_contributions`, `employment_expenses`, `employment_sector`, `employment_status`, `esa_contrib_reported`, `esa_income_reported`, `free_school_fruit_veg`, `free_school_meals`, `free_school_milk`, `gift_aid`, `healthy_start_vouchers`, `housing_benefit_reported`, `iidb_reported`, `in_FE`, `incapacity_benefit_reported`, `income_support_reported`, `is_about_to_start_paid_work`, `is_apprentice`, `is_before_universal_credit_qualifying_young_person_terminal_date`, `is_blind`, `is_in_approved_training`, `is_looked_after_by_local_authority`, `is_newly_self_employed`, `jsa_contrib_reported`, `jsa_income_reported`, `lifetime_isa_balance`, `lump_sum_income`, `maintenance_expenses`, `maintenance_income`, `married_couples_allowance`, `maternity_allowance_reported`, `max_free_entitlement_hours_used`, `miscellaneous_income`, `nhs_a_and_e_spending`, `nhs_admitted_patient_spending`, `nhs_outpatient_spending`, `ni_class_3`, `other_deductions`, `other_investment_income`, `other_local_bus_trips`, `other_tax_credits`, `outpatient_visits`, `pension_contributions_via_salary_sacrifice`, `pension_credit_reported`, `pension_income`, `person_benunit_role`, `person_household_role`, `personal_pension_contributions`, `pip_dl_category`, `pip_m_category`, `private_transfer_income`, `property_finance_costs`, `property_finance_costs_brought_forward`, `property_rental_income`, `receives_benefits_in_own_right`, `receives_limited_capability_for_work_credits`, `rent_paid_as_boarder`, `rent_paid_as_lodger`, `role`, `scottish_funded_early_learning_childcare_start_date_reached`, `sda_reported`, `self_employment_gross_receipts`, `sic_industry_division`, `ssmg_reported`, `statutory_maternity_pay`, `statutory_paternity_pay`, `statutory_sick_pay`, `student_loan_balance`, `student_loan_plan`, `student_loans`, `sublet_income`, `tax_free_childcare_on_adoption_leave`, `tax_free_childcare_on_carers_leave`, `tax_free_childcare_on_qualifying_leave`, `tax_free_childcare_on_shared_parental_leave`, `tax_free_childcare_self_employment_start_up_period`, `tax_free_childcare_spend_routed_share`, `tax_free_childcare_uses_qualifying_provider`, `tax_reported`, `trading_loss`, `travel_grant_abroad_placement`, `travel_grant_clinical_placement`, `travel_grant_eligible_expenses`, `travel_grant_receives_means_tested_nhs_bursary`, `uc_has_limited_capability_for_work`, `uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period`, `uc_is_adopter_in_first_year`, `uc_is_foster_parent_or_new_friend_or_family_carer`, `uc_is_in_pregnancy_or_post_confinement_period`, `uc_is_in_startup_period`, `uc_is_ineligible_partner`, `uc_is_responsible_foster_parent_of_child_under_one`, `uc_is_student_with_no_work_related_requirements`, `uc_is_temporarily_absent_from_claimant_household`, `universal_credit_reported`, `winter_fuel_allowance_reported`, `working_tax_credit_reported` diff --git a/docs/uk-full-build-graph.md b/docs/uk-full-build-graph.md index 9d76af74c..0f75b1ebd 100644 --- a/docs/uk-full-build-graph.md +++ b/docs/uk-full-build-graph.md @@ -60,7 +60,7 @@ For smaller outputs, add `--dataset-households 100000` to use the common informe ## Graph owners and shared contracts -The spine graph is the 35-stage source roster declared by the UK spec, built by `uk_runtime.spine_build` (the spine tool moved into the package; `tools/build_uk_frs_spine.py` is a six-line shim over it). The superseded `frs_hmrc_retained_leaves` and `hmrc_spi_income` stages and the `UK_SPINE_EXCLUSIONS` list that hid them are removed; the active HMRC path is `frs_hmrc_spine_leaves`, `spi_support_channel`, `spi_income_band_donors` and `hmrc_spi_income_spine`, and the FRS HMRC leaf columns come from `uk_runtime.frs_hmrc_source`. The spine's assembled and transferred gate batteries are graph nodes (`uk_runtime.graph_evidence`); stage evidence and fit-weight records are read back from the content store through the shared `stage_evidence` artifact rather than from in-memory collectors; the HMRC replay sidecar is rebuilt from the SPI stage's checkpoint metadata; the spine sidecar records the operation inventory and the graph manifest, and the graph manifest is saved as `spine.graph.json` under the checkpoint root. +The spine graph is the 40-stage source roster declared by the UK spec, built by `uk_runtime.spine_build` (the spine tool moved into the package; `tools/build_uk_frs_spine.py` is a six-line shim over it). The superseded `frs_hmrc_retained_leaves` and `hmrc_spi_income` stages and the `UK_SPINE_EXCLUSIONS` list that hid them are removed; the active HMRC path is `frs_hmrc_spine_leaves`, `spi_support_channel`, `spi_income_band_donors` and `hmrc_spi_income_spine`, and the FRS HMRC leaf columns come from `uk_runtime.frs_hmrc_source`. The spine's assembled and transferred gate batteries are graph nodes (`uk_runtime.graph_evidence`); stage evidence and fit-weight records are read back from the content store through the shared `stage_evidence` artifact rather than from in-memory collectors; the HMRC replay sidecar is rebuilt from the SPI stage's checkpoint metadata; the spine sidecar records the operation inventory and the graph manifest, and the graph manifest is saved as `spine.graph.json` under the checkpoint root. | Operation | Graph owner | | --- | --- | diff --git a/docs/uk-income-anchors-280.md b/docs/uk-income-anchors-280.md index 08e32bab6..8dba6753e 100644 --- a/docs/uk-income-anchors-280.md +++ b/docs/uk-income-anchors-280.md @@ -360,11 +360,14 @@ after the reorder were still falling 0.11 to 0.75 points). ## Not done here -- The property-income amount rows stay signed out: the spine's - `property_income` is FRS rent from other property (before tax, after the - expenses on show card K6, which include mortgage payments and loan - interest) plus sub-letting rent as reported, which SUBALLOW records as - before or after expenses, while the SPI concept is landlords' profit after - allowable expenses and before residential finance costs. +- The property-income amount rows are bound since microcosm#1106: the 13 SPI + Table 3.7 net amounts bind unscaled on `property_income`, landlords' profit + after allowable expenses and before residential finance costs, and the + incumbent's x1.9 scaling is retired (María's ruling of 2026-10-05). The FRS + side is not done: the spine's FRS landlords hold rent from other property + (before tax, after the expenses on show card K6, which include mortgage + payments and loan interest) plus sub-letting rent as reported, which + SUBALLOW records as before or after expenses, so they sit below the SPI + concept and the binding leans on the SPI records and the weights. - The ESA rows' migration residual and the SPI support channel's benefit fill (microcosm#840, #867, #869) are spine items. diff --git a/experiments/1106-uk-property-income-receipts.md b/experiments/1106-uk-property-income-receipts.md new file mode 100644 index 000000000..9599bb7c9 --- /dev/null +++ b/experiments/1106-uk-property-income-receipts.md @@ -0,0 +1,91 @@ +# microcosm#1106 receipts: UK property income and property wealth + +Aggregates and counts of 10 or more only. Scripts and licensed outputs live in `data/ukds/acceptance/1106-property-income/`. + +## A. SPI net property-income amounts bound + +Regenerated from the pinned Chronicle feed 825406f on #1121's head (`c098fdcc4` when first measured, rebased to `692e8b7b3` with the values unchanged; policyengine-uk 2.122.2). + +- The 13 SPI Table 3.7 amount rows by total-income band compile to £31.78bn for 2025: the 2023-24 net amounts (£29.36bn) times the pinned per-capita GDP ratio 1.0826. +- The incumbent fixture holds £55.78bn for the same rows, 1.9 times the SPI amounts. Example bands: £50,000 to £70,000 is £5.85bn against £10.26bn; £100,000 to £150,000 is £2.76bn against £4.85bn. +- Active national references: 1,231 → 1,244 (13 added, none changed). Signed-out references: 16 → 15. The local surface is unchanged. +- #1121's re-derived uprating pins at 2.122.2 leave the per-capita GDP ratio, and so these values, exactly as on main. +- The 13 new specs move the compiled register, so uk-candidate-eval's frozen scoring register needs a re-freeze before the next national solve. + +## B. The WAS property total kept off the engine + +Measured with `scripts/measure_property_wealth_drop.py` on the A9 national candidate (main after #1100, calibrated weights, 63,941 households, 29.22m weighted), running policyengine-uk 2.100.0 at 2025 twice: on the frame as the release wrote it before this PR, and with the release-export drops applied. + +| Total, 2025 | Persisted WAS total | Engine-derived | Change | Target | +|---|---|---|---|---| +| `property_wealth` | £7,469.5bn | £7,633.4bn | +2.2% | none | +| `household_land_value` | £4,595.0bn (+0.8%) | £4,697.3bn (+3.0%) | +2.2% | £4,559.8bn | +| `land_value` | £6,653.6bn (−6.5%) | £6,755.9bn (−5.1%) | +1.5% | £7,117.8bn | +| `total_wealth` | £15,030.7bn | £15,194.6bn | +1.1% | none | + +- With the column dropped, the engine's `property_wealth` equals the sum of the three persisted components on every household. +- With it persisted, the saved 2024 total is below the 2025 component sum for 45,232 of 63,941 households, and below the 2025 main residence value for 34,731 of 47,046 owners: the saved total is not uprated while its parts are. +- By region, `household_land_value` moves between −2.6% (Wales) and +3.7% (West Midlands); Northern Ireland −0.2%, London +2.8%. `corporate_land_value` does not move. +- These are measurements at fixed A9 weights. A calibration of this head reweights against the land targets, so the head-to-head against the incumbent (rule 1, `direct_h5` on a pre-#1106 H5) shows the land rows moving for the fix, not the weights. + +## C3 feasibility: landlords' receipts from profit (before implementation) + +Measured with `scripts/receipts_schedule_feasibility.py` on the A9 candidate's landlords (9,759 records with `property_income` > 0, 2.820m weighted, £29.99bn profit at the 2024 base), against PRIS 2024-25: individuals' receipts £49.81bn, allowable expenses other than residential finance costs about £18.9bn, and Table 13's landlord counts by receipts band scaled to individuals (2.85m of 2.88m). + +- **A constant expense share of 0.40** gives receipts of £49.98bn and expenses of £19.99bn, but leaves the spine's lumps in the band counts: 0.073m landlords at £60,000 to £70,000 against PRIS's 0.030m, and 0.029m at £80,000 to £90,000 against 0.010m. +- **A schedule matched on quantiles** maps each landlord's profit rank to the same rank of PRIS's receipts distribution and keeps receipts at least equal to profit. It reproduces all eleven band counts within 0.016m (the largest gap is £10,000 to £20,000: 0.835m against 0.851m). Its implied expense share has median 0.39, with 80% of landlords between 0.33 and 0.45. Its totals run above PRIS (receipts £51.46bn, expenses £21.47bn) because the top band's spread is assumed; the stage fits that spread to the totals. +- So decision 7's band schedule is feasible with plausible shares. These figures use calibrated A9 weights; the stage runs on design weights, and the PRIS targets in C4 then hold the fit through calibration. + +## C3. Landlords' receipts and finance costs on the licensed spine + +Measured on the C3 arm's spine (`48a277264`, built 2026-10-08 with `scripts/arm.sh` from the measurement tree `repos/populace-1106-arm`, licensed inputs, local staging only) with `scripts/property_receipt.py`. The ledger is the 825406f consumer artifact rebuilt the same day in `repos/arch-data-825406f`, whose two digests equal `uk/chronicle_feed.json`'s pin; the original artifact directory lost its `consumer_facts.jsonl` at 00:02 that day. Figures are at stage-time design weights (2.21m weighted landlords with profit, 2,635 records before the CGT stages clone households) unless marked calibrated. + +- **The tape.** Rebased to 2024 prices as the income stage rebases it (profit x1.0924, finance costs x1.9380), the SPI 2022-23 tape's 2.88m landlords carry £33.9bn of profit and £11.18bn of restricted finance costs, 38% of them with costs. PRIS 2024-25 puts individuals' residential finance costs at £11.08bn. +- **FRS finance costs.** Of the 1.03m weighted FRS-concept landlords, 32% draw finance costs, matching the tape's share in each of the ten deciles of profit after finance costs (for example 45% in the lowest cell against 48% realised, 27% in the highest against 27%). The draws total £2.37bn, added back to FRS profit (FRS channel: £9.5bn reported, £11.9bn after the add-back). The SPI channel's 1.17m landlords carry £16.8bn of profit and £7.78bn of finance costs from the tape draw. In all, finance costs are £10.15bn on 0.82m landlords. +- **Receipts.** £47.01bn in all (£0.28bn of it sub-letting rent on 38 records), so deductible expenses come to £18.30bn against PRIS individuals' £18.95bn. The median expense share is 0.52 (10th to 90th percentile 0.37 to 0.56). No receipts fall below profit; no landlord's profit exceeds the band the walk put them in. +- **Band fit.** Every band from £10,000 holds its individuals-basis count to within 1,100 landlords, against a largest landlord weight of 9,562 (for example £10,000 to £20,000: 850,918 against 851,042). The lowest band takes the remainder: 644,691 against PRIS's 1,286,458, because the spine carries 2.21m landlords at design weights against PRIS's 2.85m individuals. +- **The top band's multiplier pins at 1.0.** The 39,583 landlords of the open band would need mean receipts of £145,858 for the receipts total, after the bounded bands' realised means (their midpoints) at PRIS counts; the spine's top landlords by profit already average £150,583 at `max(100,000, profit)` (mean profit £139,550, median £113,607, 87% on the SPI channel), so their receipts equal their profit and they carry no deductible expenses. Two causes are visible: midpoint means overstate the bounded bands if density falls within each band, and PRIS counts UK property only ("UK property income declared") while the SPI's `INCPROP` and the engine's receipts concept include overseas property. The stage gate passes (the cap is 5). +- **Coherence.** 87.8% of landlords' weight sits in households holding other residential or non-residential property (WAS). +- **Spine gates.** All 33 pass, the new `uk_stage_property_components` included. + +## C6. Calibration arms + +Each arm builds the spine (licensed inputs, local staging only) and runs the national calibration with `scripts/arm.sh`; `scripts/arm_summary.py` summarises them. C3 and C4 were calibrated twice: once as committed, and once with a measurement-only edit recorded in the arm's `tree.diff` (never committed). + +- **Control, #1121's head `692e8b7b3` (policyengine-uk 2.122.2).** Loss 0.27534 to 0.00712; 98.3% of 1,167 targets within 10%; 7 of 7 calibrated-seam gates pass. +- **C3, `48a277264` (A, B, C0, C1 and the stage; no PRIS targets).** Loss 0.27890 to 0.00714; 98.1% of 1,180 within 10%. The 13 SPI property amounts, unbound on the control, fit to 0.1% (48.0% off at design weights). The only gate failure is `uk_target_fit` on #1121's West Midlands deferral, now stale: that cell sits at +23.1%, inside the 25% bound. With the deferral dropped (arm `c3x`), 7 of 7 gates pass. +- **C4, `82c744ccc` (+ the 13 PRIS targets).** Loss 0.27259 to 0.00708; 98.0% of 1,193 within 10%; every PRIS row within 0.3% (receipts £51.93bn against £51.99bn, residential finance costs £12.12bn against £12.13bn). Three regressions against C3: the SPI property amounts slip (£20,000 to £30,000 of total income −17.8%, £15,000 to £20,000 −6.9%, £40,000 to £50,000 −7.0%); `uk_weight_ratio` fails (family-folded maximum-to-median weight 1,213 against 1,151); and the West Midlands cell is back out at +26.8%. +- **C4 without PRIS's lowest band (arm `c4b`, measurement only).** Loss 0.00704; the SPI amounts still slip (worst −17.7%) and `uk_weight_ratio` still fails. The lowest band is not the cause. + +**Why the PRIS targets pull against the SPI amounts.** At the C3 calibration's weights, which fit the SPI profit and bind no receipts, receipts come to £55.39bn against PRIS's £49.81bn (2024 values) and the expense share to 0.42 against 0.38. Landlords sit too high in receipts: 1.16m in the £10,000 to £20,000 band against PRIS's 0.85m, 0.47m against 0.33m in the next, and 0.71m in the lowest against 1.29m. The walk fills each band to PRIS's absolute count, but at stage time the spine carries 2.21m weighted landlords against PRIS's 2.85m, so each landlord's profit rank lands in a higher receipts band than PRIS's shares imply, and the calibration scales that up. Binding the PRIS targets then has to move weight across total-income bands. + +**A walk filled by PRIS's shares (offline, `scripts/walk_variants.py`).** Re-running the walk on the C3 spine with each band's mass set to its PRIS share of the spine's own landlord total, and evaluating at the `c3x` weights (an approximation for an arm calibrated with that walk: the calibration reads receipts only through income tax, where the engine chooses between the property allowance and actual expenses): receipts £46.11bn, expense share 0.30, and band counts of 1.19m, 0.90m, 0.35m, 0.16m and 0.06m from the lowest band up, against PRIS's 1.29m, 0.85m, 0.33m, 0.15m and 0.08m. The total band misallocation falls from about 1.12m landlords to about 0.25m. The bands from £70,000 run below PRIS (the open band 24,100 against 39,600) and the top band's multiplier still pins at 1. + +**Engine quantities at 2025 (`scripts/engine_effects.py`, policyengine-uk 2.123.0 on both calibrated candidates; control against `c3x`).** +- Income tax: £327.05bn to £326.40bn. The two candidates are calibrated separately, so this is not a policy effect. +- `property_income` £31.68bn to £34.01bn (2.80m landlords); `property_rental_income` £58.22bn; `property_finance_costs` £11.71bn on 1.07m landlords (PRIS 2025: £12.13bn). +- `property_finance_cost_relief` £1.90bn for 1.03m landlords (pe-uk#2172's illustration on Microcosm: £1.14bn to £2.52bn); finance costs carried forward £2.21bn for 0.31m. +- The property allowance deduction falls from £0.117bn (0.22m landlords) to £0.062bn (0.12m). +- Means tests that now read property income after finance costs: Housing Benefit −£21m, Council Tax Reduction −£26m, Pension Credit +£10m, Universal Credit +£3m. +- Computing `income_tax` took 0.33 s against 0.23 s, the cost of the allowance-or-expenses branching. + +## C7. The walk filled by PRIS shares (`c57765505`, arm `c5`) + +Each band now takes its share of the individuals-basis landlords times the spine's landlord weight (scale 0.775 at stage time: 2.21m against 2.85m). + +- **On the licensed spine.** Every band, the lowest included, holds its target to within rounding (the lowest: 996,007 against 996,725). Receipts are £39.12bn at design weights; deductible expenses £10.68bn on £28.44bn of profit, an expense share of 0.27 (median 0.32, 10th to 90th percentile 0.26 to 0.38), against PRIS's 0.38: the spine's profit per landlord at design weights is about 19% above PRIS's implied profit per landlord. The open top band still pins at a multiplier of 1. +- **Calibrated, with the 13 PRIS targets.** Loss 0.27690 to 0.00722; 97.9% of 1,193 targets within 10%. The PRIS rows fit (receipts −3.3%, finance costs 0.0%, every band within 0.3%), but the SPI property amounts now overshoot at the top of the middle: £50,000 to £70,000 of total income +15.9% and £70,000 to £100,000 +48.2% (the count-filled walk's C4 arm undershot £15,000 to £50,000 instead, worst −17.8%). `uk_target_fit` fails on the £70,000 to £100,000 row and `uk_weight_ratio` fails again. +- **Reading.** Receipts are a fixed function of profit rank, so the eleven band counts constrain the profit distribution and compete with the SPI's profit-by-income targets whichever rule fills the bands. Without PRIS targets the calibration reads receipts only through the allowance-or-expenses choice in income tax, so "PRIS as diagnostics" comes close to the C3 arm's fit with the receipts the walk gives at its weights (the offline evaluation in C6: £46.11bn, lowest three bands 1.19m, 0.90m, 0.35m). +- **Calibrated with only the two PRIS totals (arm `c5t`, the eleven band counts dropped, measurement only).** Loss 0.27652 to 0.00704; 98.1% of 1,182 within 10%; receipts and finance costs fit exactly. The SPI property amounts still overshoot (£50,000 to £70,000 and £70,000 to £100,000 of total income fail `uk_target_fit`, worst +30.9%) and `uk_weight_ratio` fails. At the C3 weights the share-filled walk gives £46.11bn of receipts at 2024 values (about £48.1bn at 2025), so the receipts total asks for about 8% more receipts than the spine's landlords carry and moves weight toward them. +- **Why the totals conflict too.** PRIS's 2.85m landlords and £49.81bn of receipts include landlords whose expenses meet or exceed their receipts; the FRS records them with a loss, which counts as zero, and the spine gives them no receipts. The spine's landlords are the profit-making subset, so any PRIS count or receipts target lands on them. The FRS identifies few of them, though: in 2024-25, 67 adults (0.11m weighted) report a loss from other property, against 1,022 (1.75m) reporting a profit. Other parts of the gap are in the walk itself: at calibrated weights the bands from £70,000 run below PRIS, and the open band carries no expenses. + +## C8. PRIS as a diagnostic + +María's decision (2026-10-08): PRIS binds no calibration target. The three PRIS targets are reverted (active national references return to 1,244), and the share-filled walk stays. The stage vendors PRIS 2024-25: its receipt reports receipts, deductible expenses, finance costs and the band counts against PRIS at design weights, and the stage gate holds every band above the lowest to its share of the spine's landlords. + +The arms above ran on the commits named there, before the branch was rebased onto main after #1121 merged (the rebased commits keep their subjects). The rebase brought in a changelog sentence, #1121's receipts note and an equivalent rewrite of one weighted share in `frs_uc_start_up_period`. + +**The final head, arm `c6x`** (`7b20ef73c`: the share-filled walk, no PRIS targets; spine and calibration built afresh; #1121's West Midlands deferral dropped at gate time only, which leaves the weights unchanged). +- Loss 0.27889 to 0.00710; 98.1% of 1,180 targets within 10%; all 7 calibrated-seam gates and all 33 spine gates pass. The 13 SPI property amounts and the 11 counts fit to 0.2%. The West Midlands cell sits at +23.4%, inside the 25% bound, so the deferral is stale on this head as on C3. +- PRIS at the calibrated weights (2024 values): 2.77m landlords with receipts against PRIS's 2.85m individuals; receipts £45.72bn against £49.81bn (−8.2%), for an expense share of 0.29 against 0.38; finance costs £10.59bn on 1.06m landlords against £11.08bn (−4.4%). From the lowest band up the counts run −7.4%, +5.5%, +8.2% and +6.6% of PRIS, then −3% to −75% from £40,000 (the open band −39.3%); the misallocation totals 0.24m landlords. The offline evaluation in C6 predicted these closely (£46.11bn; 1.19m, 0.90m and 0.35m in the lowest three bands, as here). +- Engine quantities at 2025 (`scripts/engine_effects.py`, policyengine-uk 2.123.0): `property_rental_income` £48.07bn (PRIS uprated: £51.99bn); `property_finance_costs` £11.69bn on 1.06m (£12.13bn); the finance-cost relief £1.89bn for 1.01m landlords, with £2.21bn carried forward for 0.30m. The property allowance deduction is £0.142bn for 0.33m landlords, against £0.117bn for 0.22m on the control and £0.062bn for 0.12m with the count-filled walk: the share-filled walk leaves more landlords with deductible expenses under £1,000, where the allowance is worth more. Income tax is £326.47bn (control £327.05bn; the candidates are calibrated separately, so this is not a policy effect), and `income_tax` takes 0.35 s against 0.23 s. diff --git a/packages/microcosm-build/pyproject.toml b/packages/microcosm-build/pyproject.toml index aef5e0f4c..c18475838 100644 --- a/packages/microcosm-build/pyproject.toml +++ b/packages/microcosm-build/pyproject.toml @@ -47,7 +47,7 @@ us = [ # The UK extra adds the rules engine for local metric generation from a # Microcosm UK H5. Target tables remain explicit inputs, and the base package # still does not import policyengine-uk at import time. -uk = ["policyengine-uk>=2.122.2", "microcosm-data>=0.1,<0.2", "h5py>=3", "tables>=3", "openpyxl>=3.1"] +uk = ["policyengine-uk>=2.123.0", "microcosm-data>=0.1,<0.2", "h5py>=3", "tables>=3", "openpyxl>=3.1"] [project.scripts] microcosm-build-uk = "microcosm.build.uk_runtime.full_build_cli:main" diff --git a/packages/microcosm-build/src/microcosm/build/source_manifest.py b/packages/microcosm-build/src/microcosm/build/source_manifest.py index 2588173e1..150459b0d 100644 --- a/packages/microcosm-build/src/microcosm/build/source_manifest.py +++ b/packages/microcosm-build/src/microcosm/build/source_manifest.py @@ -60,6 +60,7 @@ "assign_uniform_draw", "aggregate_person_to_benunit", "allocate_per_capita_from_cell_table", + "allocate_property_rental_income", "allocate_within_group_waterfall", "allocate_zero_weight_prior_mass", "annualize_periodic_amounts", @@ -125,6 +126,7 @@ "gate_zero_weight_strata", "head_carry", "impute_bus_use_band", + "impute_frs_property_finance_costs", "impute_lifetime_isa_balance", "impute_lifetime_isa_ownership", "join", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 839249b19..b5e24ea82 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -10393,6 +10393,177 @@ } } }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "output", + "add_back_to", + "population", + "tape_preparation", + "tape_preparation_seed", + "donor_income_period", + "income_uprating_variables", + "donor", + "incidence_cells", + "incidence", + "incidence_seed", + "incidence_salt", + "model", + "n_estimators", + "training_rows", + "expected_regime", + "predictors", + "amount_seed", + "amount_salt", + "draw", + "add_back" + ], + "properties": { + "kind": { + "const": "impute_frs_property_finance_costs" + }, + "output": { + "type": "string" + }, + "add_back_to": { + "type": "string" + }, + "population": { + "type": "string" + }, + "tape_preparation": { + "type": "string" + }, + "tape_preparation_seed": { + "type": "integer" + }, + "donor_income_period": { + "type": "integer" + }, + "income_uprating_variables": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "donor": { + "type": "string" + }, + "incidence_cells": { + "type": "integer" + }, + "incidence": { + "type": "string" + }, + "incidence_seed": { + "type": "integer" + }, + "incidence_salt": { + "type": "string" + }, + "model": { + "enum": [ + "regime_gated_qrf" + ] + }, + "n_estimators": { + "type": "integer" + }, + "training_rows": { + "type": "string" + }, + "expected_regime": { + "type": "string" + }, + "predictors": { + "type": "array", + "items": { + "type": "string" + } + }, + "amount_seed": { + "type": "integer" + }, + "amount_salt": { + "type": "string" + }, + "draw": { + "type": "string" + }, + "add_back": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "output", + "resource", + "population", + "band_lower_bounds", + "band_basis", + "order", + "walk", + "walk_seed", + "within_band", + "top_band", + "maximum_top_band_multiplier", + "sublet_receipts", + "residuals" + ], + "properties": { + "kind": { + "const": "allocate_property_rental_income" + }, + "output": { + "type": "string" + }, + "resource": { + "type": "string" + }, + "population": { + "type": "string" + }, + "band_lower_bounds": { + "type": "array", + "items": { + "type": "integer" + } + }, + "band_basis": { + "type": "string" + }, + "order": { + "type": "string" + }, + "walk": { + "type": "string" + }, + "walk_seed": { + "type": "integer" + }, + "within_band": { + "type": "string" + }, + "top_band": { + "type": "string" + }, + "maximum_top_band_multiplier": { + "type": "number" + }, + "sublet_receipts": { + "type": "string" + }, + "residuals": { + "type": "string" + } + } + }, { "type": "object", "additionalProperties": false, diff --git a/packages/microcosm-build/src/microcosm/build/uk/country_package.json b/packages/microcosm-build/src/microcosm/build/uk/country_package.json index 7b8b05313..fcde9acf9 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/country_package.json +++ b/packages/microcosm-build/src/microcosm/build/uk/country_package.json @@ -87,6 +87,11 @@ "kind": "legacy_json", "schema_id": "legacy_json" }, + { + "path": "hmrc_property_rental_income_facts.json", + "kind": "legacy_json", + "schema_id": "legacy_json" + }, { "path": "hmrc_itl_taxpayer_counts.json", "kind": "legacy_json", diff --git a/packages/microcosm-build/src/microcosm/build/uk/efrs_parity_known_gaps.json b/packages/microcosm-build/src/microcosm/build/uk/efrs_parity_known_gaps.json index e8577cb51..825a529f1 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/efrs_parity_known_gaps.json +++ b/packages/microcosm-build/src/microcosm/build/uk/efrs_parity_known_gaps.json @@ -631,6 +631,12 @@ } }, "description": "Canonical UK enhanced-FRS parity debt ledger. A reference-populated loader input appears in known_gaps when neither the sha-pinned certified Microcosm UK candidate nor a pinned post-candidate source-family restoration carries non-default signal on the reviewed minimum share of effective population mass.", + "engine_derived_exclusions": { + "property_wealth": { + "reason": "formula-owned in policyengine-uk and derived from persisted components; a persisted copy overrides the formula and is not uprated", + "tracking_note": "microcosm#1106 (the uk-data#543 defect): the release and calibration boundaries drop the WAS total, and policyengine-uk sums main_residence_value, other_residential_property_value and non_residential_property_value, which stay required." + } + }, "exclusion_policy": { "reason": "not yet ported from enhanced FRS pipeline — pending review", "tracking_note": "Tracked in UK_COVERAGE_PROGRESS.md; assign this column to a named source-family restoration milestone before promoting it to required." diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 83982de50..dbd30a168 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -178,6 +178,20 @@ }, "notes": "Stage-time support-clip health gate over the WAS Lifetime ISA receipt (microcosm#1003): the balance is drawn from the QRF fitted on the credible donor holders, so every draw lies inside their realised range and non-holders are zero; the zero allowances make any clip a signal." }, + { + "id": "uk_stage_property_components", + "gate": "stage_health", + "phase": "transferred", + "criticality": "release_blocking", + "evidence_absent_blocks": true, + "parameters": { + "stage": "property_components", + "check": "property_components", + "maximum_rows_receipts_below_profit": 0, + "maximum_band_error_in_landlord_weights": 2.0 + }, + "notes": "Stage-time gate over the landlords' receipts and finance costs receipt (microcosm#1106). No row may carry property_rental_income below its property_income: the engine reads such receipts as unknown and withholds the property allowance. Every PRIS Table 13 band above the lowest holds its share of the spine's landlord weight (the band's share of the individuals-basis landlords) to within twice the largest landlord weight, the whole-person rounding of the walk (each band boundary is reached within one person; the lowest band takes the remainder). The open top band's profit multiplier must stay below the declared cap, so the band reaches the individuals' Table 2 receipts rather than stopping at the cap. The finance-cost incidence, its realisation by cell, the totals against PRIS, the channel split, the residuals and the coherence share are recorded in the receipt and carry no threshold." + }, { "id": "uk_stage_nts_bus_travel_support", "gate": "stage_health", @@ -929,6 +943,8 @@ "person.pension_contributions_via_salary_sacrifice", "person.pip_dl_category", "person.pip_m_category", + "person.property_finance_costs", + "person.property_rental_income", "person.receives_benefits_in_own_right", "person.rent_paid_as_boarder", "person.rent_paid_as_lodger", @@ -990,10 +1006,11 @@ "household.ward_code" ], "reviewed_exclusions": { - "person.incapacity_benefit_reported": "The enhanced FRS stores this legacy reported-benefit input as an all-zero layer; the candidate must drop dead zero layers." + "person.incapacity_benefit_reported": "The enhanced FRS stores this legacy reported-benefit input as an all-zero layer; the candidate must drop dead zero layers.", + "household.property_wealth": "policyengine-uk derives property_wealth from main_residence_value, other_residential_property_value and non_residential_property_value; a persisted copy overrides that sum and has no uprating index, so the candidate must drop it (microcosm#1106, the uk-data#543 defect)." } }, - "notes": "Reviewed candidate-only fields from the June UK prototype (source provenance or genuine additional model inputs, not incumbent-surface losses) plus the one reviewed reference-side exclusion. The two hard-required columns that may never be waived stay a code-level guard, per the microcosm#327 rule that a parity comparison's registers are declared inputs. During the migration window the runtime merges the exclusion register with the legacy constant and the spec-pin tests hold the two equal; the register becomes solely load-bearing when the constant retires." + "notes": "Reviewed candidate-only fields from the June UK prototype (source provenance or genuine additional model inputs, not incumbent-surface losses) plus the two reviewed reference-side exclusions (the all-zero incapacity benefit layer and the formula-owned property_wealth total, microcosm#1106). The two hard-required columns that may never be waived stay a code-level guard, per the microcosm#327 rule that a parity comparison's registers are declared inputs. During the migration window the runtime merges the exclusion register with the legacy constant and the spec-pin tests hold the two equal; the register becomes solely load-bearing when the constant retires." }, { "id": "uk_take_up_signal", diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_property_rental_income_facts.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_property_rental_income_facts.json new file mode 100644 index 000000000..8d4fd3bef --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_property_rental_income_facts.json @@ -0,0 +1,2048 @@ +{ + "schema_version": 1, + "country": "uk", + "kind": "uk_vendored_ledger_facts", + "resource": "hmrc_property_rental_income_facts.json", + "purpose": "HMRC Property Rental Income Statistics 2026 release, tax year 2024-25 rows the property components stage allocates landlords' receipts from and reports against (microcosm#1106): Table 1 unincorporated landlords by type of tax entity (individuals, partnerships, all; the individuals' share that restates Table 13 on the individuals basis), Table 2 rental income before allowable expenses by type of tax entity (the individuals' receipts the open top band is solved to), Table 6 allowable expenses by type of tax entity (the individuals' share of expenses), Table 8 allowable expenses by expense type, all tax entities (residential finance costs among them, although ITTOIA 2005 s. 272A no longer deducts them) and Table 13 landlords by size of rental income, all tax entities (the eleven bands the receipts walk fills). No value is derived here.", + "consumers": [ + "uk_runtime.hmrc_property_rental", + "uk_runtime.property_components" + ], + "planned_consumers": [], + "policy": "Rows are copied verbatim from the pinned Chronicle consumer feed named in source_fact_feed; every value is a publisher-stated fact. Consumers declare their own arithmetic on these rows and never edit this file by hand: regenerate it with tools/vendor_uk_ledger_facts.py.", + "generator": { + "tool": "tools/vendor_uk_ledger_facts.py", + "version": 1 + }, + "source_fact_feed": { + "source_repo": "PolicyEngine/chronicle", + "source_commit": "825406f98913ab7324c834c3642804e9317a2256", + "build": "build-bundle --suite uk -> build-consumer-artifact", + "artifact_schema_version": "policyengine_ledger.consumer_artifact.v2", + "fact_row_count": 344402, + "facts_sha256": "28b7105761be48ff01244bd0e28f4b579bac103f2c4a98473a04e2cc4303eb3d", + "manifest_sha256": "6e04a43d7dca4d398e14c0ec59ec983477633ba3e9bef062a8843f554dcb7119" + }, + "selections": [ + { + "label": "table1_ty2024_landlords_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_1.ty2024" + }, + "row_count": 3 + }, + { + "label": "table2_ty2024_rental_income_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_2.ty2024" + }, + "row_count": 3 + }, + { + "label": "table6_ty2024_allowable_expenses_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_6.ty2024" + }, + "row_count": 3 + }, + { + "label": "table8_ty2024_allowable_expenses_by_expense_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024" + }, + "row_count": 24 + }, + { + "label": "table13_ty2024_landlords_by_size_of_rental_income", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024" + }, + "row_count": 11 + } + ], + "row_count": 44, + "rows": [ + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_0be3cfca02357112dff851ae", + "semantic_fact_key": "ledger_semantic_fact_v2_3ec6c35cd33d916661f9a105", + "source_record_id": "hmrc.property_rental_2026.table_6.ty2024.all.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_6.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "all", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 34750000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_08b34cb0a7dbce92833156e7", + "semantic_fact_key": "ledger_semantic_fact_v2_3ec6c35cd33d916661f9a105", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.all_expense_types.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "all_expense_types", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 34750000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9f3690a9e2896a9d6f184eb9", + "semantic_fact_key": "ledger_semantic_fact_v2_ca8da4885fd56e157291d361", + "source_record_id": "hmrc.property_rental_2026.table_6.ty2024.individual.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_6.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "individual", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "individual" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 30030000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_265310299fc694bb30852898", + "semantic_fact_key": "ledger_semantic_fact_v2_ce418455ea279a7eb515a140", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.legal_management_and_professional_fees.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "legal_management_and_professional_fees", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "legal_management_and_professional_fees" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 4160000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_dd1339101545d58b1c186874", + "semantic_fact_key": "ledger_semantic_fact_v2_0127dcbfeed9acfd83d48a96", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.non_residential_finance_costs.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "non_residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "non_residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1330000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2047d7ebb869b93acf8df02f", + "semantic_fact_key": "ledger_semantic_fact_v2_c8841f681af8f098df240e53", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.other_allowable_expenses.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "other_allowable_expenses", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "other_allowable_expenses" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 4580000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_3f13fc0d641b1856a3f41157", + "semantic_fact_key": "ledger_semantic_fact_v2_7f735ebfd9f6b48906266b2c", + "source_record_id": "hmrc.property_rental_2026.table_6.ty2024.partnership.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_6.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "partnership", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "partnership" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 4720000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_02d8e1510f1742d94136faa9", + "semantic_fact_key": "ledger_semantic_fact_v2_d0cbbbef62bd653bc8b174c4", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.rent_rates_and_insurance.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "rent_rates_and_insurance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "rent_rates_and_insurance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 3810000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1b129a28498f0d3c406ae05a", + "semantic_fact_key": "ledger_semantic_fact_v2_359cca144864b81543b38784", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.repairs_and_maintenance.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "repairs_and_maintenance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "repairs_and_maintenance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 6410000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b9c719a5d6b045c819614707", + "semantic_fact_key": "ledger_semantic_fact_v2_8a5d88ebd47e5e198906910a", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.residential_finance_costs.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 12820000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_df145408e9ff8d6d7e7cc9e6", + "semantic_fact_key": "ledger_semantic_fact_v2_5051024521f6be292cb98a5e", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.services_including_wages.property_expenses_amount", + "concept": "hmrc.property_expenses_amount", + "measure_id": "property_expenses_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "services_including_wages", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "services_including_wages" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1640000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d7e2b475ca27c044f4a2f5ef", + "semantic_fact_key": "ledger_semantic_fact_v2_7f945a071e81daae75fc439d", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.all_expense_types.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "all_expense_types", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 2540000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6028c5568d2a7cc1e0db4c86", + "semantic_fact_key": "ledger_semantic_fact_v2_151644cad45c954bf84abd3b", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.legal_management_and_professional_fees.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "legal_management_and_professional_fees", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "legal_management_and_professional_fees" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1790000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_6bfa13c5b171152cd5bec7a9", + "semantic_fact_key": "ledger_semantic_fact_v2_33ea74ff7abeebd5f13c1fa7", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.non_residential_finance_costs.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "non_residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "non_residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 100000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b938abfc2efe4f0c2d7b0353", + "semantic_fact_key": "ledger_semantic_fact_v2_7dd5eb831524da44dfba1d50", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.other_allowable_expenses.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "other_allowable_expenses", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "other_allowable_expenses" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1160000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9e6e56342abb9a4df8fe6790", + "semantic_fact_key": "ledger_semantic_fact_v2_fed933b0fc4a074a36b56841", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.rent_rates_and_insurance.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "rent_rates_and_insurance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "rent_rates_and_insurance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1910000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b3813e2de969e2e921358899", + "semantic_fact_key": "ledger_semantic_fact_v2_284da1ef67be1c9a2e0496bb", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.repairs_and_maintenance.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "repairs_and_maintenance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "repairs_and_maintenance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1920000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_dafc7c9140b1d72eb805a964", + "semantic_fact_key": "ledger_semantic_fact_v2_12540b2f85267e67c14ca813", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.residential_finance_costs.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1150000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_a3bc46bb332083649df08984", + "semantic_fact_key": "ledger_semantic_fact_v2_583c7e10bda5c56ea9da801b", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.services_including_wages.expenses_landlord_count", + "concept": "hmrc.property_expenses_landlord_count", + "measure_id": "expenses_landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "services_including_wages", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "services_including_wages" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 450000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_272d788bcbcb03ca702ab026", + "semantic_fact_key": "ledger_semantic_fact_v2_0a8292556ce0f6cae1fd4e8a", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.all_expense_types.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "all_expense_types", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 87.7 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9ac8a82051297ed12cf057e7", + "semantic_fact_key": "ledger_semantic_fact_v2_d5869314b5e0122dc93fcb2e", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.legal_management_and_professional_fees.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "legal_management_and_professional_fees", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "legal_management_and_professional_fees" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 61.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_14d60b59991266366a027996", + "semantic_fact_key": "ledger_semantic_fact_v2_3c0b6f9c91d3ee74a2354cb1", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.non_residential_finance_costs.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "non_residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "non_residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 3.3 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_1db3f4a747a6ff2be8c2f471", + "semantic_fact_key": "ledger_semantic_fact_v2_132f0e1af11425921d0617c9", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.other_allowable_expenses.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "other_allowable_expenses", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "other_allowable_expenses" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 40.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_52055997da3456bbb055816d", + "semantic_fact_key": "ledger_semantic_fact_v2_d99422f32484142a71f10d63", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.rent_rates_and_insurance.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "rent_rates_and_insurance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "rent_rates_and_insurance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 66.1 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d95e489e7ea0218a92a7f690", + "semantic_fact_key": "ledger_semantic_fact_v2_20a651c4e2ac839f1dd38357", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.repairs_and_maintenance.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "repairs_and_maintenance", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "repairs_and_maintenance" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 66.2 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_387ac49b18282fa458c2149a", + "semantic_fact_key": "ledger_semantic_fact_v2_be0353d3c5c724b320477a18", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.residential_finance_costs.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "residential_finance_costs", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "residential_finance_costs" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 39.8 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_491e744ea3b5528dfe34d7db", + "semantic_fact_key": "ledger_semantic_fact_v2_6e6b969e3e257ee3ed15353d", + "source_record_id": "hmrc.property_rental_2026.table_8.ty2024.services_including_wages.expenses_landlord_share", + "concept": "hmrc.property_expenses_landlord_share", + "measure_id": "expenses_landlord_share", + "unit": "percent", + "aggregation": "share", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024", + "groupby_dimension": "hmrc.property_expense_type", + "groupby_value_id": "services_including_wages", + "table_record_kind": "detail" + }, + "dimensions": { + "property_expense_type": "services_including_wages" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 15.4 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9a6f23d57d690da8808b6b06", + "semantic_fact_key": "ledger_semantic_fact_v2_5b7fb5478cf3872af8d226b0", + "source_record_id": "hmrc.property_rental_2026.table_2.ty2024.all.property_income_amount", + "concept": "hmrc.property_income_amount", + "measure_id": "property_income_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_2.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "all", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 58990000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_978db11b4c8829ce6e426bf6", + "semantic_fact_key": "ledger_semantic_fact_v2_ea38313a3aefd6833dd62749", + "source_record_id": "hmrc.property_rental_2026.table_2.ty2024.individual.property_income_amount", + "concept": "hmrc.property_income_amount", + "measure_id": "property_income_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_2.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "individual", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "individual" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 49810000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_911942d2773d4144fc232cc9", + "semantic_fact_key": "ledger_semantic_fact_v2_f2cb0b8ef4ad8cdb1ae655a6", + "source_record_id": "hmrc.property_rental_2026.table_2.ty2024.partnership.property_income_amount", + "concept": "hmrc.property_income_amount", + "measure_id": "property_income_amount", + "unit": "gbp", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_2.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "partnership", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "partnership" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 9180000000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_9610abce2477ffb84bee9072", + "semantic_fact_key": "ledger_semantic_fact_v2_3589e0eadb29d3d089a0a17b", + "source_record_id": "hmrc.property_rental_2026.table_1.ty2024.all.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_1.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "all", + "table_record_kind": "total" + }, + "dimensions": {}, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 2880000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_e47ffa5a653a4eac29901b8a", + "semantic_fact_key": "ledger_semantic_fact_v2_1778dd3488d43253b23d54a9", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_0_10000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_0_10000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_upper_bound": 10000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 1300000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_53e749163b06fbd82685be88", + "semantic_fact_key": "ledger_semantic_fact_v2_3f664b61cb27b92d9ad02c98", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_100000_plus.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_100000_plus", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 100000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 40000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_d5d7908eb3cb74c6bb0f0c65", + "semantic_fact_key": "ledger_semantic_fact_v2_433456e9b3fac1c6fab49fe6", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_10000_20000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_10000_20000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 10000, + "property_income_upper_bound": 20000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 860000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_09b52ca1b68ccb3aba5787dd", + "semantic_fact_key": "ledger_semantic_fact_v2_e0bfff8b28f05204102c201e", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_20000_30000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_20000_30000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 20000, + "property_income_upper_bound": 30000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 330000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_705be2fa800cfeae3559c1fe", + "semantic_fact_key": "ledger_semantic_fact_v2_6eeceb656cd6e2f3ace58b70", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_30000_40000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_30000_40000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 30000, + "property_income_upper_bound": 40000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 150000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_fcbbf66f7850ba13b203f450", + "semantic_fact_key": "ledger_semantic_fact_v2_4b6005e9c2ee0133c9538423", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_40000_50000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_40000_50000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 40000, + "property_income_upper_bound": 50000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 80000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_ceeebd434e8b36275f962162", + "semantic_fact_key": "ledger_semantic_fact_v2_60935459663aa4b0f2029dee", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_50000_60000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_50000_60000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 50000, + "property_income_upper_bound": 60000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 50000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_f2b1ef7be83d42fc731f1a7c", + "semantic_fact_key": "ledger_semantic_fact_v2_b894da40534b784994fa55f7", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_60000_70000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_60000_70000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 60000, + "property_income_upper_bound": 70000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 30000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_57846a30fead137f6886397f", + "semantic_fact_key": "ledger_semantic_fact_v2_488c943e7ce5485a6a5cee14", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_70000_80000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_70000_80000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 70000, + "property_income_upper_bound": 80000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 20000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_4440bdd15eb9c90e52f31244", + "semantic_fact_key": "ledger_semantic_fact_v2_8a7a2399ebd8b6c9c9549124", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_80000_90000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_80000_90000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 80000, + "property_income_upper_bound": 90000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 10000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_b31f15e239f53d947239b6a2", + "semantic_fact_key": "ledger_semantic_fact_v2_e851355729fa9000dfaf08e4", + "source_record_id": "hmrc.property_rental_2026.table_13.ty2024.band_90000_100000.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024", + "groupby_dimension": "hmrc.property_income_band", + "groupby_value_id": "band_90000_100000", + "table_record_kind": "detail" + }, + "dimensions": { + "property_income_lower_bound": 90000, + "property_income_upper_bound": 100000 + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 10000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_642f3b532484d795fdec62f1", + "semantic_fact_key": "ledger_semantic_fact_v2_9ef912d437ef0f09ab5a266d", + "source_record_id": "hmrc.property_rental_2026.table_1.ty2024.individual.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_1.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "individual", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "individual" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 2850000 + }, + { + "aggregate_fact_key": "ledger_aggregate_fact_v2_2dfca9700b141e332ee68b64", + "semantic_fact_key": "ledger_semantic_fact_v2_3c3db9c624e7af34057aad61", + "source_record_id": "hmrc.property_rental_2026.table_1.ty2024.partnership.landlord_count", + "concept": "hmrc.property_income_landlord_count", + "measure_id": "landlord_count", + "unit": "count", + "aggregation": "sum", + "entity": { + "name": "tax_unit", + "role": "landlord" + }, + "geography": { + "id": "K02000001", + "level": "country", + "vintage": "current" + }, + "period": { + "type": "tax_year", + "value": 2024 + }, + "period_coverage": { + "start_date": null, + "end_date": null, + "basis": null + }, + "layout": { + "record_set_id": "hmrc.property_rental_2026.table_1.ty2024", + "groupby_dimension": "hmrc.tax_entity_type", + "groupby_value_id": "partnership", + "table_record_kind": "detail" + }, + "dimensions": { + "tax_entity_type": "partnership" + }, + "source": { + "source_name": "hmrc", + "source_table": "HMRC property rental income statistics 2026: unincorporated landlords, property income and allowable expenses", + "source_file": "property_rental_income_statistics_tables_2026.ods", + "source_sha256": "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846", + "vintage": "property_rental_2026", + "raw_r2_key": "raw/uk/hmrc/hmrc-property-rental-income-2026/2026/87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846/property_rental_income_statistics_tables_2026.ods" + }, + "value": 30000 + } + ] +} diff --git a/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json b/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json index 5ed139578..a635145ef 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json +++ b/packages/microcosm-build/src/microcosm/build/uk/hmrc_uprating_engine_pins.json @@ -2,7 +2,7 @@ "schema_version": 1, "engine": { "package": "policyengine-uk", - "version": "2.122.2" + "version": "2.123.0" }, "basis": "policyengine-uk parameter ratio between 1 January of the fact's opening year and 1 January of the calibration year (the SPI donor rebasing convention)", "written_by": "tools/pin_uk_uprating_engine_values.py", diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json index 7615ebb4d..cc76528aa 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_incumbent_2025_signed_differences.json @@ -1,8 +1,8 @@ { - "compiled_count": 1231, + "compiled_count": 1244, "counts_by_kind": { - "calibration_drift": 553, - "fixture_only": 55, + "calibration_drift": 566, + "fixture_only": 42, "ledger_only": 649 }, "difference_count": 1257, @@ -63,97 +63,6 @@ "period": 2025, "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." }, - { - "fixture_value": 4845000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_100_000_to_150_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 1273000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_12_570_to_15_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 2185000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_150_000_to_200_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 3211000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_15_000_to_20_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 834100000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_1_000_000_to_inf", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 1995000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_200_000_to_300_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 7258000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_20_000_to_30_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 1453500000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_300_000_to_500_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 7220000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_30_000_to_40_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 7182000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_40_000_to_50_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 900600000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_500_000_to_1_000_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 10260000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_50_000_to_70_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, - { - "fixture_value": 7163000000.0, - "kind": "fixture_only", - "name": "hmrc/property_income_income_band_70_000_to_100_000", - "period": 2025, - "reason": "Fixture row has no Ledger-compiled counterpart at this comparison period." - }, { "fixture_value": 24720000000.0, "kind": "fixture_only", @@ -6767,6 +6676,110 @@ "period": 2025, "reason": "Declared uprating (PolicyEngine/chronicle#280 lane, María's ruling of 2026-09-22): ours moves the SPI 2023-24 band value to the 2025 calibration year by the index the reference declares (amounts by the pinned engine's per-variable OBR and ONS indices between 1 January 2023 and 1 January 2025, the state pension by the new State Pension rate the engine pays, counts by HMRC's projected taxpayer growth in the containing Table 2.5 band as the calendar-2025 window); the frozen incumbent fixture holds the 2023-24 values it projects one year forward with its own income-projection ratios." }, + { + "fixture_value": 4845000000.0, + "kind": "calibration_drift", + "ledger_value": 2760698221.4869194, + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 1273000000.0, + "kind": "calibration_drift", + "ledger_value": 725359924.861269, + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 2185000000.0, + "kind": "calibration_drift", + "ledger_value": 1245020766.5529244, + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 3211000000.0, + "kind": "calibration_drift", + "ledger_value": 1829639213.4560368, + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 834100000.0, + "kind": "calibration_drift", + "ledger_value": 475273144.79715985, + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 1995000000.0, + "kind": "calibration_drift", + "ledger_value": 1136758091.2004962, + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 7258000000.0, + "kind": "calibration_drift", + "ledger_value": 4135634198.462758, + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 1453500000.0, + "kind": "calibration_drift", + "ledger_value": 828209466.4460759, + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 7220000000.0, + "kind": "calibration_drift", + "ledger_value": 4113981663.3922725, + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 7182000000.0, + "kind": "calibration_drift", + "ledger_value": 4092329128.3217864, + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 900600000.0, + "kind": "calibration_drift", + "ledger_value": 513165081.17050976, + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 10260000000.0, + "kind": "calibration_drift", + "ledger_value": 5846184469.031124, + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, + { + "fixture_value": 7163000000.0, + "kind": "calibration_drift", + "ledger_value": 4081502860.786544, + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "period": 2025, + "reason": "The x1.9 adjustment is retired (microcosm#1106, María's ruling of 2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from property, landlords' profit after allowable expenses and before residential finance costs, moved to the 2025 calibration year by the pinned engine's per-capita GDP index; the frozen incumbent fixture holds 1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net concept." + }, { "fixture_value": 85000.0, "kind": "calibration_drift", diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json index ca5181790..5ce6569ef 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_compile_parity_production_2023_signed_differences.json @@ -1,11 +1,11 @@ { - "compiled_count": 919, + "compiled_count": 932, "counts_by_kind": { "calibration_drift": 120, "fixture_only": 17, - "ledger_only": 787 + "ledger_only": 800 }, - "difference_count": 924, + "difference_count": 937, "differences": [ { "fixture_value": 82000.0, @@ -4256,6 +4256,97 @@ "period": 2023, "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." }, + { + "kind": "ledger_only", + "ledger_value": 2550000000.0, + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 670000000.0, + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1150000000.0, + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1690000000.0, + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 439000000.0, + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 1050000000.0, + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3820000000.0, + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 765000000.0, + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3800000000.0, + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3780000000.0, + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 474000000.0, + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 5400000000.0, + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, + { + "kind": "ledger_only", + "ledger_value": 3770000000.0, + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "period": 2023, + "reason": "Ledger-compiled row has no fixture counterpart at this comparison period." + }, { "kind": "ledger_only", "ledger_value": 85000.0, diff --git a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json index 95a83f4ef..77221be37 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json +++ b/packages/microcosm-build/src/microcosm/build/uk/ledger_fact_vendor_selections.json @@ -1049,6 +1049,57 @@ "expected_row_count": 21 } ] + }, + { + "resource": "hmrc_property_rental_income_facts.json", + "purpose": "HMRC Property Rental Income Statistics 2026 release, tax year 2024-25 rows the property components stage allocates landlords' receipts from and reports against (microcosm#1106): Table 1 unincorporated landlords by type of tax entity (individuals, partnerships, all; the individuals' share that restates Table 13 on the individuals basis), Table 2 rental income before allowable expenses by type of tax entity (the individuals' receipts the open top band is solved to), Table 6 allowable expenses by type of tax entity (the individuals' share of expenses), Table 8 allowable expenses by expense type, all tax entities (residential finance costs among them, although ITTOIA 2005 s. 272A no longer deducts them) and Table 13 landlords by size of rental income, all tax entities (the eleven bands the receipts walk fills). No value is derived here.", + "consumers": [ + "uk_runtime.hmrc_property_rental", + "uk_runtime.property_components" + ], + "planned_consumers": [], + "selections": [ + { + "label": "table1_ty2024_landlords_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_1.ty2024" + }, + "expected_row_count": 3 + }, + { + "label": "table2_ty2024_rental_income_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_2.ty2024" + }, + "expected_row_count": 3 + }, + { + "label": "table6_ty2024_allowable_expenses_by_tax_entity_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_6.ty2024" + }, + "expected_row_count": 3 + }, + { + "label": "table8_ty2024_allowable_expenses_by_expense_type", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_8.ty2024" + }, + "expected_row_count": 24 + }, + { + "label": "table13_ty2024_landlords_by_size_of_rental_income", + "selector": { + "source_name": "hmrc", + "record_set_id": "hmrc.property_rental_2026.table_13.ty2024" + }, + "expected_row_count": 11 + } + ] } ] } diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 662ea2616..fd47927bf 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -330,7 +330,9 @@ "status": "required" }, "property_wealth": { - "status": "required" + "reason": "formula-owned in policyengine-uk and derived from persisted components; a persisted copy overrides the formula and is not uprated", + "status": "reviewed_exclusion", + "tracking_note": "microcosm#1106 (the uk-data#543 defect): the release and calibration boundaries drop the WAS total, and policyengine-uk sums main_residence_value, other_residential_property_value and non_residential_property_value, which stay required." }, "rail_subsidy_spending": { "status": "required" @@ -445,11 +447,11 @@ } }, "counts": { - "required": 145, - "reviewed_exclusion": 0, + "required": 144, + "reviewed_exclusion": 1, "total": 145 }, - "derivation": "Surface = efrs_parity_reference.json populated effective loader inputs. status='required' when the sha-pinned candidate evidence records non-default signal on at least the reviewed owning-entity effective-mass share OR the column is pinned in restored_required_columns after a source-family restoration; all remaining surface columns are reviewed_exclusion with reason 'not yet ported from enhanced FRS pipeline — pending review' and a UK_COVERAGE_PROGRESS.md tracking note. The final release gate applies the same effective-mass floor, and distributional restorations must pass it on their required source channel.", + "derivation": "Surface = efrs_parity_reference.json populated effective loader inputs. status='required' when the sha-pinned candidate evidence records non-default signal on at least the reviewed owning-entity effective-mass share OR the column is pinned in restored_required_columns after a source-family restoration; all remaining surface columns are reviewed_exclusion with reason 'not yet ported from enhanced FRS pipeline — pending review' and a UK_COVERAGE_PROGRESS.md tracking note, except the engine_derived_exclusions, which are reviewed_exclusion with their own reason because the engine computes them from persisted inputs. The final release gate applies the same effective-mass floor, and distributional restorations must pass it on their required source channel.", "description": "Declared full-coverage contract for a UK release: every populated effective loader input in the pinned enhanced FRS must be persisted with non-default signal, or carry a reviewed exclusion with the campaign reason and tracking note.", "effective_mass_coverage": { "minimum_nondefault_mass_share": 1e-06, @@ -468,7 +470,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -491,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -514,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -536,7 +538,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -565,7 +567,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -585,7 +587,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -606,7 +608,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -630,7 +632,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "067ba21c12aeb4e95e6a8a16141dbaa075e8787ed875a005f549cab6e91a6b56", @@ -719,7 +721,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -760,7 +762,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "UK Data Service SN 9468 Living Costs and Food Survey 2023-24 household/person tabs and the vendored Chronicle facts for NEED 2023 mean kWh, the FY2024-25 Ofgem cap levels, road-fuel outturn (DESNZ, HMRC, ONS), the DfT VEH1103 licensed-car stock, NTS bus use and the DfT and devolved bus finance tables.", "survey": "Living Costs and Food Survey 2023-24" @@ -786,7 +788,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -794,6 +796,29 @@ "stage": "nts_bus_travel", "status": "required_at_build" }, + "property_components": { + "base_candidate_sha256": "f17306ccb2aad7ff0130be3589b560afb2e2a12a943570911cd0c77f07934833", + "base_candidate_tier": "frs", + "effective_mass_requirements": {}, + "mass_change_semantics": "mass_conserving", + "output_weight_kind": "importance", + "outputs": [ + "property_rental_income" + ], + "required_mass_change_reason": "Landlords' receipts and finance costs on the source spine: household weights pass through unchanged and total household mass is conserved.", + "rewrites": [ + "property_income", + "property_finance_costs" + ], + "source_manifest": "source_stages.json", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", + "source_vintages": { + "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", + "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" + }, + "stage": "property_components", + "status": "required_at_build" + }, "regional_property_uprating": { "base_candidate_sha256": "f17306ccb2aad7ff0130be3589b560afb2e2a12a943570911cd0c77f07934833", "base_candidate_tier": "frs", @@ -810,7 +835,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -837,7 +862,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -870,7 +895,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -892,7 +917,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -914,7 +939,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -949,7 +974,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "5c1c704066c0bba26859c57617b72b57d1f56399c600f2f65b6c19a6c0ece570", + "source_manifest_sha256": "d034dab6b204253778a7217e6e6924fdc7a1f99ad0c961317c62dfe0ab536b1a", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index ccd88f519..65bea4a2d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1662,6 +1662,8 @@ "OTHERINV", "GIFTAID", "GIFTINV", + "LLIR_RESTRICT_AMT_TOT", + "TAX_CRED", "TEI", "TII", "TI" @@ -1705,7 +1707,8 @@ "hmrc_spi_unemployment_benefit_income": null, "hmrc_spi_miscellaneous_employment_income": "employment_income_before_lsr", "hmrc_spi_other_income": "miscellaneous_income", - "hmrc_spi_state_pension_income": null + "hmrc_spi_state_pension_income": null, + "property_finance_costs": "property_finance_costs" }, "predictors": [ "age", @@ -1778,6 +1781,9 @@ ], "hmrc_spi_state_pension_income": [ "SRP" + ], + "property_finance_costs": [ + "LLIR_RESTRICT_AMT_TOT" ] }, "derived_policyengine_outputs": { @@ -1809,7 +1815,8 @@ "hmrc_spi_unemployment_benefit_income", "hmrc_spi_miscellaneous_employment_income", "hmrc_spi_other_income", - "hmrc_spi_state_pension_income" + "hmrc_spi_state_pension_income", + "property_finance_costs" ], "joint_draw": true, "savings_interest_source_semantics": "INCBBS is taxable bank/building-society interest before reconstruction to the PolicyEngine gross input", @@ -2246,6 +2253,7 @@ "other_investment_income", "gift_aid", "charitable_investment_gifts", + "property_finance_costs", "hmrc_spi_employment_benefits", "hmrc_spi_employment_expenses", "hmrc_spi_other_social_security_income", @@ -2262,6 +2270,7 @@ "other_investment_income", "gift_aid", "charitable_investment_gifts", + "property_finance_costs", "hmrc_spi_employment_benefits", "hmrc_spi_employment_expenses", "hmrc_spi_other_social_security_income", @@ -2908,6 +2917,135 @@ ], "notes": "Deterministically rescales owner rows so regional unweighted owner means match the public house-price reference. Northern Ireland has no reference row and is never scaled; empty and nonpositive regions are skipped. The unweighted mean follows the incumbent behavior. The factor is read off the main residence and has always scaled the property total; since microcosm#1063 it scales the total's other components in the frame as well (land, other houses, buildings), so an owner's property_wealth stays the sum of its components after the uprating. Mortgage debt is never uprated." }, + { + "stage": "property_components", + "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)", + "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", + "grain": "person", + "artifacts": [ + { + "role": "qrf_donor", + "kind": "private_microdata", + "format": "tab_delimited", + "survey": "Survey of Personal Incomes Public Use Tape 2022-23", + "vintage": "2022-23", + "tax_year_start": 2022, + "ukds_study_number": "SN 9422", + "doi": "10.5255/UKDA-SN-9422-1", + "filename": "put2223uk.tab", + "sha256": "5ef829461060c91a2a47be59ad541d9b519fc3976d66ca80d4920f711bb96f66", + "size_bytes": 141323762, + "reviewed_source": "PolicyEngine licensed UKDS mirror (private Hugging Face repository), spi_2022_23.zip", + "access": "private_local_input", + "locator": "caller-supplied local input", + "runtime_sha256_required": true + }, + { + "role": "property_rental_facts", + "kind": "public_aggregate_reference", + "resource": "hmrc_property_rental_income_facts.json", + "format": "json", + "runtime_sha256_required": true + } + ], + "operations": [ + { + "kind": "verify_vendored_fact_resource", + "artifact_role": "property_rental_facts", + "resource": "hmrc_property_rental_income_facts.json", + "feed_pin": "chronicle_feed.json", + "record_sets": [ + "hmrc.property_rental_2026.table_1.ty2024", + "hmrc.property_rental_2026.table_2.ty2024", + "hmrc.property_rental_2026.table_6.ty2024", + "hmrc.property_rental_2026.table_8.ty2024", + "hmrc.property_rental_2026.table_13.ty2024" + ], + "source_vintage": "2024-25", + "mapped_build_period": 2024, + "period_mapping": "published_tax_year_equals_build_period", + "require_before_source_read": true, + "runtime_sha256_required": true, + "fail_on_mismatch": true + }, + { + "kind": "impute_frs_property_finance_costs", + "output": "property_finance_costs", + "add_back_to": "property_income", + "population": "FRS-concept landlords: rows whose income leaves the income stage did not draw from the SPI tape (the FRS base channel, and the SPI channel's dependants on their twin values) with property income other than the household reference person's sub-letting rent above zero", + "tape_preparation": "as hmrc_spi_income_spine prepares the tape: its stage-1 seed and draw_spi_donor_ages_by_population", + "tape_preparation_seed": 42, + "donor_income_period": 2022, + "income_uprating_variables": { + "property_income": "property_income", + "property_finance_costs": "property_finance_costs" + }, + "donor": "SPI 2022-23 landlords (INCPROP above zero) at build-period prices whose profit after restricted finance costs (INCPROP less LLIR_RESTRICT_AMT_TOT) is above zero: the analog of an FRS landlord reporting a profit, since show card K6 nets loan interest from ROYYR1", + "incidence_cells": 10, + "incidence": "a person-keyed uniform below the tape's FACT-weighted share of analog landlords with finance costs in the landlord's cell of profit after finance costs; the cells are the FACT-weighted deciles of the analog landlords' profit after finance costs, so every cell has tape support", + "incidence_seed": 0, + "incidence_salt": "property_components:has_finance_costs", + "model": "regime_gated_qrf", + "n_estimators": 100, + "training_rows": "analog tape landlords with finance costs", + "expected_regime": "positive_only", + "predictors": [ + "profit_after_finance_costs", + "age" + ], + "amount_seed": 0, + "amount_salt": "property_components:finance_costs", + "draw": "predict_positive_from_uniforms at the person-keyed quantile", + "add_back": "the drawn finance costs are added to the landlord's property_income, so the FRS profit reaches the SPI concept and the engine relieves the interest once, as the s. 274A tax reduction; the mortgage capital show card K6 also nets stays netted" + }, + { + "kind": "allocate_property_rental_income", + "output": "property_rental_income", + "resource": "hmrc_property_rental_income_facts.json", + "population": "persons with profit from property other than sub-letting above zero, on both channels, after the finance-cost add-back", + "band_lower_bounds": [ + 0, + 10000, + 20000, + 30000, + 40000, + 50000, + 60000, + 70000, + 80000, + 90000, + 100000 + ], + "band_basis": "PRIS 2024-25 Table 13 (all tax entities) scaled by Table 1's individuals' share of landlords", + "order": "profit descending, person_id ascending", + "walk": "top band first, each band filled with whole persons to its share of the individuals-basis landlords times the spine's landlord weight (the spine's total before calibration differs from PRIS's, and filling the published counts would push every profit rank into a higher band), at one seeded systematic offset (the CGT Table 3 walk's rule); the lowest band takes every remaining landlord", + "walk_seed": 0, + "within_band": "linear in the weight-ranked position within the band, from its upper bound for the highest profit to its lower bound; never below the landlord's profit", + "top_band": "max(100,000, k x profit) with k at least 1 solved by bisection so the band's weighted mean receipts equal the individuals' Table 2 receipts less the bounded bands' realised mean receipts at their individuals-basis counts, over the top band's count", + "maximum_top_band_multiplier": 5.0, + "sublet_receipts": "the household reference person's sub-letting rent adds to receipts with no expenses; Rent a Room receipts, which the engine's receipts concept excludes, until PolicyEngine/policyengine-uk#2002 is released", + "residuals": "landlords without profit (FRS loss-makers, whose loss counts as zero, and tape landlords at zero) carry no receipts although PRIS counts them; property_finance_costs_brought_forward stays unset" + }, + { + "kind": "record_mass_conservation_receipt", + "entity": "household", + "reason": "Landlords' receipts and finance costs on the source spine: household weights pass through unchanged and total household mass is conserved.", + "declared_factor": 1.0, + "gate_coupling": "The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason." + } + ], + "outputs": [ + "property_rental_income" + ], + "rewrites": [ + "property_income", + "property_finance_costs" + ], + "nonnegative_outputs": [ + "property_rental_income" + ], + "notes": "Fills the two landlord inputs policyengine-uk 2.123.0 adds beside property_income (microcosm#1106; PolicyEngine/policyengine-uk#2172). FRS landlords report ROYYR1 after show card K6, which nets mortgage payments and loan interest, so their profit sits below the SPI concept; the stage draws their restricted finance costs from the SPI 2022-23 tape at build-period prices (incidence by band of profit after finance costs, amount from the regime-gated QRF on the analog landlords with costs, both keyed on person_id) and adds them back to property_income, so the engine relieves the interest once as a tax reduction (decision 6, to be confirmed with Max before merge). The SPI channel keeps the costs the income stage drew. Receipts for every landlord come from PRIS 2024-25: ranked by profit, walked into Table 13's bands at their shares of the individuals-basis landlords times the spine's landlord weight, linear within a band, never below profit, the open top band proportional to profit with the multiplier solved to the individuals' receipts per landlord; receipts less profit are the deductible expenses (PRIS allowable expenses other than residential finance costs). Sub-letting rent keeps equal receipts and no expenses until Rent a Room is released. Household weights are unchanged; the receipt records the tape incidence and its realisation, the band fit, the totals against PRIS, the channel split, the residuals and the share of landlords whose household holds rental property." + }, { "stage": "nts_bus_travel", "survey": "National Travel Survey 2002-2024", @@ -5292,7 +5430,7 @@ { "role": "policy_parameters", "kind": "versioned_parameter_tree", - "dependency": "policyengine-uk>=2.122.2 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.123.0 via microcosm-build[uk]", "parameters": [ "gov.hmrc.cgt.annual_exempt_amount" ], @@ -5373,7 +5511,7 @@ { "role": "policy_parameters", "kind": "versioned_parameter_tree", - "dependency": "policyengine-uk>=2.122.2 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.123.0 via microcosm-build[uk]", "parameters": [ "gov.hmrc.cgt.annual_exempt_amount", "gov.hmrc.cgt.badr.lifetime_limit", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 2bad0fece..eecc2e227 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1439,6 +1439,8 @@ stages: - OTHERINV - GIFTAID - GIFTINV + - LLIR_RESTRICT_AMT_TOT + - TAX_CRED - TEI - TII - TI @@ -1478,6 +1480,7 @@ stages: hmrc_spi_miscellaneous_employment_income: employment_income_before_lsr hmrc_spi_other_income: miscellaneous_income hmrc_spi_state_pension_income: null + property_finance_costs: property_finance_costs predictors: - age - gender @@ -1530,6 +1533,8 @@ stages: - OTHERINC hmrc_spi_state_pension_income: - SRP + property_finance_costs: + - LLIR_RESTRICT_AMT_TOT derived_policyengine_outputs: employment_income: source_columns: @@ -1557,6 +1562,7 @@ stages: - hmrc_spi_miscellaneous_employment_income - hmrc_spi_other_income - hmrc_spi_state_pension_income + - property_finance_costs joint_draw: true savings_interest_source_semantics: INCBBS is taxable bank/building-society interest before reconstruction to the PolicyEngine gross input employment_income_source_semantics: PolicyEngine input = PAY + EPB + TAXTERM, matching the pinned enhanced-FRS pipeline; it is not the Table 3.6 measure @@ -1912,6 +1918,7 @@ stages: - other_investment_income - gift_aid - charitable_investment_gifts + - property_finance_costs - hmrc_spi_employment_benefits - hmrc_spi_employment_expenses - hmrc_spi_other_social_security_income @@ -1927,6 +1934,7 @@ stages: - other_investment_income - gift_aid - charitable_investment_gifts + - property_finance_costs - hmrc_spi_employment_benefits - hmrc_spi_employment_expenses - hmrc_spi_other_social_security_income @@ -2436,6 +2444,101 @@ stages: - other_residential_property_value - non_residential_property_value notes: Deterministically rescales owner rows so regional unweighted owner means match the public house-price reference. Northern Ireland has no reference row and is never scaled; empty and nonpositive regions are skipped. The unweighted mean follows the incumbent behavior. The factor is read off the main residence and has always scaled the property total; since microcosm#1063 it scales the total's other components in the frame as well (land, other houses, buildings), so an owner's property_wealth stays the sum of its components after the uprating. Mortgage debt is never uprated. +- stage: property_components + survey: Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25) + source: https://www.gov.uk/government/statistics/property-rental-income-statistics + grain: person + artifacts: + - role: qrf_donor + kind: private_microdata + format: tab_delimited + survey: Survey of Personal Incomes Public Use Tape 2022-23 + vintage: 2022-23 + tax_year_start: 2022 + ukds_study_number: SN 9422 + doi: 10.5255/UKDA-SN-9422-1 + filename: put2223uk.tab + sha256: 5ef829461060c91a2a47be59ad541d9b519fc3976d66ca80d4920f711bb96f66 + size_bytes: 141323762 + reviewed_source: PolicyEngine licensed UKDS mirror (private Hugging Face repository), spi_2022_23.zip + access: private_local_input + locator: caller-supplied local input + runtime_sha256_required: true + - role: property_rental_facts + kind: public_aggregate_reference + resource: hmrc_property_rental_income_facts.json + format: json + runtime_sha256_required: true + operations: + - kind: verify_vendored_fact_resource + artifact_role: property_rental_facts + resource: hmrc_property_rental_income_facts.json + feed_pin: chronicle_feed.json + record_sets: + - hmrc.property_rental_2026.table_1.ty2024 + - hmrc.property_rental_2026.table_2.ty2024 + - hmrc.property_rental_2026.table_6.ty2024 + - hmrc.property_rental_2026.table_8.ty2024 + - hmrc.property_rental_2026.table_13.ty2024 + source_vintage: 2024-25 + mapped_build_period: 2024 + period_mapping: published_tax_year_equals_build_period + require_before_source_read: true + runtime_sha256_required: true + fail_on_mismatch: true + - kind: impute_frs_property_finance_costs + output: property_finance_costs + add_back_to: property_income + population: 'FRS-concept landlords: rows whose income leaves the income stage did not draw from the SPI tape (the FRS base channel, and the SPI channel''s dependants on their twin values) with property income other than the household reference person''s sub-letting rent above zero' + tape_preparation: 'as hmrc_spi_income_spine prepares the tape: its stage-1 seed and draw_spi_donor_ages_by_population' + tape_preparation_seed: 42 + donor_income_period: 2022 + income_uprating_variables: + property_income: property_income + property_finance_costs: property_finance_costs + donor: 'SPI 2022-23 landlords (INCPROP above zero) at build-period prices whose profit after restricted finance costs (INCPROP less LLIR_RESTRICT_AMT_TOT) is above zero: the analog of an FRS landlord reporting a profit, since show card K6 nets loan interest from ROYYR1' + incidence_cells: 10 + incidence: a person-keyed uniform below the tape's FACT-weighted share of analog landlords with finance costs in the landlord's cell of profit after finance costs; the cells are the FACT-weighted deciles of the analog landlords' profit after finance costs, so every cell has tape support + incidence_seed: 0 + incidence_salt: property_components:has_finance_costs + model: regime_gated_qrf + n_estimators: 100 + training_rows: analog tape landlords with finance costs + expected_regime: positive_only + predictors: + - profit_after_finance_costs + - age + amount_seed: 0 + amount_salt: property_components:finance_costs + draw: predict_positive_from_uniforms at the person-keyed quantile + add_back: the drawn finance costs are added to the landlord's property_income, so the FRS profit reaches the SPI concept and the engine relieves the interest once, as the s. 274A tax reduction; the mortgage capital show card K6 also nets stays netted + - kind: allocate_property_rental_income + output: property_rental_income + resource: hmrc_property_rental_income_facts.json + population: persons with profit from property other than sub-letting above zero, on both channels, after the finance-cost add-back + band_lower_bounds: [0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000] + band_basis: PRIS 2024-25 Table 13 (all tax entities) scaled by Table 1's individuals' share of landlords + order: profit descending, person_id ascending + walk: top band first, each band filled with whole persons to its share of the individuals-basis landlords times the spine's landlord weight (the spine's total before calibration differs from PRIS's, and filling the published counts would push every profit rank into a higher band), at one seeded systematic offset (the CGT Table 3 walk's rule); the lowest band takes every remaining landlord + walk_seed: 0 + within_band: linear in the weight-ranked position within the band, from its upper bound for the highest profit to its lower bound; never below the landlord's profit + top_band: max(100,000, k x profit) with k at least 1 solved by bisection so the band's weighted mean receipts equal the individuals' Table 2 receipts less the bounded bands' realised mean receipts at their individuals-basis counts, over the top band's count + maximum_top_band_multiplier: 5.0 + sublet_receipts: the household reference person's sub-letting rent adds to receipts with no expenses; Rent a Room receipts, which the engine's receipts concept excludes, until PolicyEngine/policyengine-uk#2002 is released + residuals: landlords without profit (FRS loss-makers, whose loss counts as zero, and tape landlords at zero) carry no receipts although PRIS counts them; property_finance_costs_brought_forward stays unset + - kind: record_mass_conservation_receipt + entity: household + reason: 'Landlords'' receipts and finance costs on the source spine: household weights pass through unchanged and total household mass is conserved.' + declared_factor: 1.0 + gate_coupling: The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason. + outputs: + - property_rental_income + rewrites: + - property_income + - property_finance_costs + nonnegative_outputs: + - property_rental_income + notes: 'Fills the two landlord inputs policyengine-uk 2.123.0 adds beside property_income (microcosm#1106; PolicyEngine/policyengine-uk#2172). FRS landlords report ROYYR1 after show card K6, which nets mortgage payments and loan interest, so their profit sits below the SPI concept; the stage draws their restricted finance costs from the SPI 2022-23 tape at build-period prices (incidence by band of profit after finance costs, amount from the regime-gated QRF on the analog landlords with costs, both keyed on person_id) and adds them back to property_income, so the engine relieves the interest once as a tax reduction (decision 6, to be confirmed with Max before merge). The SPI channel keeps the costs the income stage drew. Receipts for every landlord come from PRIS 2024-25: ranked by profit, walked into Table 13''s bands at their shares of the individuals-basis landlords times the spine''s landlord weight, linear within a band, never below profit, the open top band proportional to profit with the multiplier solved to the individuals'' receipts per landlord; receipts less profit are the deductible expenses (PRIS allowable expenses other than residential finance costs). Sub-letting rent keeps equal receipts and no expenses until Rent a Room is released. Household weights are unchanged; the receipt records the tape incidence and its realisation, the band fit, the totals against PRIS, the channel split, the residuals and the share of landlords whose household holds rental property.' - stage: nts_bus_travel survey: National Travel Survey 2002-2024 source: Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013. @@ -4275,7 +4378,7 @@ stages: artifacts: - role: policy_parameters kind: versioned_parameter_tree - dependency: policyengine-uk>=2.122.2 via microcosm-build[uk] + dependency: policyengine-uk>=2.123.0 via microcosm-build[uk] parameters: - gov.hmrc.cgt.annual_exempt_amount instant_rule: raw dated parameter files evaluated at 1 June of the build period's tax year @@ -4340,7 +4443,7 @@ stages: artifacts: - role: policy_parameters kind: versioned_parameter_tree - dependency: policyengine-uk>=2.122.2 via microcosm-build[uk] + dependency: policyengine-uk>=2.123.0 via microcosm-build[uk] parameters: - gov.hmrc.cgt.annual_exempt_amount - gov.hmrc.cgt.badr.lifetime_limit diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json index afac8edda..40af1c5f5 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_membership.json @@ -1,13 +1,13 @@ { "source_fact_feed": "chronicle-uk-825406f9-consumer-facts", "target_period": 2025, - "candidate_count": 1254, + "candidate_count": 1266, "contract_target_count": 341, - "active_reference_count": 1231, + "active_reference_count": 1244, "status_counts": { - "active": 1231, + "active": 1244, "no_fact_at_or_before_period": 7, - "signed_excluded": 16 + "signed_excluded": 15 }, "geography_pins": { "obr.income_tax": { @@ -4905,6 +4905,110 @@ "factor": "1.21716287215412", "value_before_uprating": "336000.0" }, + { + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "2550000000.0" + }, + { + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "439000000.0" + }, + { + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "670000000.0" + }, + { + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1690000000.0" + }, + { + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1150000000.0" + }, + { + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3820000000.0" + }, + { + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1050000000.0" + }, + { + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3800000000.0" + }, + { + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "765000000.0" + }, + { + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3780000000.0" + }, + { + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "5400000000.0" + }, + { + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "474000000.0" + }, + { + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "from": "2023", + "to": "2025", + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3770000000.0" + }, { "name": "hmrc/property_income_count_income_band_100_000_to_150_000", "from": "2023", @@ -12762,14 +12866,202 @@ ] }, "hmrc.spi.property_income.amount_by_total_income_band": { - "status": "signed_excluded", + "status": "active", "candidates": [ { - "name": "hmrc.spi.property_income.amount_by_total_income_band", - "status": "signed_excluded", - "matched_fact_count_overall": 13, - "matched_fact_count_at_or_before_period": 13, - "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 2760698221.4869194, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_9d10f6e51a5dcb04f54f9fae", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "2550000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 475273144.79715985, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_51eeeeb41e0c6dc54bc0d407", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "439000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 725359924.861269, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_e177c50af86589dd859592e8", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "670000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1829639213.4560368, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_87ed04807ef839bd818e526d", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1690000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1245020766.5529244, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_5e148f28371c7b8c5d72e716", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1150000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4135634198.462758, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_a793597e38fe8f9240136d5e", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3820000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 1136758091.2004962, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_968f0c586e0de9ec29bde5b5", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "1050000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4113981663.3922725, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_6a693f190800a2604ffd1c69", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3800000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 828209466.4460759, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_03b3c75a46af68646f0d8eb2", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "765000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4092329128.3217864, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_41f2ee883cc817a3f04d4b84", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3780000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 5846184469.031124, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_161cfda7cbd0fd9ad69ed477", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "5400000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 513165081.17050976, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_16a6a0e6c9bbd738d853fda8", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "474000000.0" + } + }, + { + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "status": "active", + "matched_fact_count_overall": 1, + "matched_fact_count_at_or_before_period": 1, + "resolved_period": 2025, + "resolved_value": 4081502860.786544, + "resolved_fact_period": "2023", + "resolved_fact_key": "ledger_aggregate_fact_v2_9335b51ae0737d222433f03e", + "uprating": { + "index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "factor": "1.08262675352428", + "value_before_uprating": "3770000000.0" + } } ] }, @@ -29211,9 +29503,9 @@ "fanout_family_outcomes": [ { "family": "hmrc_spi", - "status": "active_with_signed_property_amount_exclusion", - "active_reference_count": 169, - "signed_rationale": "SPI income-band targets fan out by strict total-income-band dimension pins, except the HMRC property-income amount surface. Those 13 rows are signed out because Ledger carries the official SPI Table 3.7 net property-income amounts, while the incumbent target applies the populace-side x1.9 property-income undercount adjustment traced to policyengine-uk-data PR #311 / issue #230 and HMRC Property Rental Income Statistics." + "status": "active_strict_band_pins", + "active_reference_count": 182, + "signed_rationale": "SPI income-band targets fan out by strict total-income-band dimension pins. The 13 property-income amount rows bind the SPI Table 3.7 net concept unscaled: landlords' profit after allowable expenses and before residential finance costs, which is what policyengine-uk's property_income means. The incumbent's x1.9 scaling (uk-data#311, uk-data#230) set the Property Rental Income Statistics' receipts before expenses against this net amount, so it is retired; the receipts bind on their own variable (microcosm#1106, Mar\u00eda's ruling of 2026-10-05)." }, { "family": "hmrc_itl", @@ -29260,12 +29552,6 @@ } ], "signed_exclusion_rationales": [ - { - "family": "hmrc_spi", - "target_id": "hmrc.spi.property_income.amount_by_total_income_band", - "status": "signed_excluded", - "signed_rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface." - }, { "family": "ons_population", "target_id": "ons.population.scotland_households_3plus_children", diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json index c7fb3ae25..11e698287 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_reference_signed_exclusions.json @@ -1,14 +1,6 @@ { "schema_version": 1, "exclusions": [ - { - "target_id": "hmrc.spi.property_income.amount_by_total_income_band", - "reason_id": "property_income_undercount_adjustment_missing", - "rationale": "Signed out pending a first-class value-scaling operation or a Chronicle package for HMRC Property Rental Income Statistics with declared reconciliation: the Ledger facts are official HMRC SPI Table 3.7 net property-income amounts, while the incumbent calibration target applies the populace-side x1.9 property-income undercount adjustment. The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI covers only taxpayers with liability, and HMRC Property Rental Income Statistics show GBP 46.68bn versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI facts would knowingly calibrate to 10/19 of the incumbent surface.", - "tracking": "uk-data#230", - "approved_by": "juaristi22", - "approved_on": "2026-09-05" - }, { "target_id": "ons.population.scotland_households_3plus_children", "reason_id": "no_household_composition_fact", diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_references.json b/packages/microcosm-build/src/microcosm/build/uk/target_references.json index d31d3812c..89e27a4ec 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -383,6 +383,7 @@ "hmrc.spi.employment_income.count_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.private_pension_income.amount_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.private_pension_income.count_by_total_income_band": "hmrc.survey_of_personal_incomes", + "hmrc.spi.property_income.amount_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.property_income.count_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.savings_interest_income.amount_by_total_income_band": "hmrc.survey_of_personal_incomes", "hmrc.spi.savings_interest_income.count_by_total_income_band": "hmrc.survey_of_personal_incomes", @@ -711,6 +712,7 @@ "hmrc.spi.employment_income.count_by_total_income_band": "Count by total income band", "hmrc.spi.private_pension_income.amount_by_total_income_band": "Amount by total income band", "hmrc.spi.private_pension_income.count_by_total_income_band": "Count by total income band", + "hmrc.spi.property_income.amount_by_total_income_band": "Amount by total income band", "hmrc.spi.property_income.count_by_total_income_band": "Count by total income band", "hmrc.spi.savings_interest_income.amount_by_total_income_band": "Amount by total income band", "hmrc.spi.savings_interest_income.count_by_total_income_band": "Count by total income band", @@ -3419,6 +3421,331 @@ "uprating_from_period": "2023", "uprating_to_period": 2025 }, + { + "name": "hmrc/property_income_income_band_100_000_to_150_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 100000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_100_000_to_150_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_1_000_000_to_inf", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 1000000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_1_000_000_to_inf", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_12_570_to_15_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 12570 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_12_570_to_15_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_15_000_to_20_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 15000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_15_000_to_20_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_150_000_to_200_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 150000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_150_000_to_200_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_20_000_to_30_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 20000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_20_000_to_30_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_200_000_to_300_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 200000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_200_000_to_300_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_30_000_to_40_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 30000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_30_000_to_40_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_300_000_to_500_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 300000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_300_000_to_500_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_40_000_to_50_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 40000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_40_000_to_50_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_50_000_to_70_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 50000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_50_000_to_70_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_500_000_to_1_000_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 500000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_500_000_to_1_000_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, + { + "name": "hmrc/property_income_income_band_70_000_to_100_000", + "ledger_selector": { + "source_name": "hmrc", + "source_concept": "hmrc.spi_property_income_amount", + "groupby_dimension": "hmrc.total_income_band", + "entity_name": "person", + "geography_level": "country", + "geography_id": "K02000001", + "dimension_values": { + "total_income_lower_bound": 70000 + } + }, + "entity": "person", + "measure": "hmrc/property_income_income_band_70_000_to_100_000", + "family": "hmrc_spi", + "period": 2025, + "metadata": { + "contract_target_id": "hmrc.spi.property_income.amount_by_total_income_band", + "measure_kind": "prepared_column" + }, + "uprating_index": "policyengine_uk_parameter:gov.economic_assumptions.indices.obr.per_capita.gdp", + "uprating_from_period": "2023", + "uprating_to_period": 2025 + }, { "name": "hmrc/property_income_count_income_band_100_000_to_150_000", "ledger_selector": { diff --git a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json index 6ff16117b..54113c71d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json +++ b/packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json @@ -3639,7 +3639,7 @@ "from_entity": "person", "map_to": "household", "groupby_variable": "total_income", - "notes": "Banded by person-level total income; band edges come from the fact dimension (compute/income.py:8-20). The x1.9 property-income undercount adjustment is a populace-side value declaration, not a fact property." + "notes": "Banded by person-level total income; band edges come from the fact dimension (compute/income.py:8-20). SPI Table 3.7 net income from property is landlords' profit after allowable expenses and before residential finance costs, the concept property_income holds, so the facts bind unscaled. The incumbent's x1.9 adjustment set HMRC Property Rental Income Statistics receipts, which are before expenses, against this net amount and is retired (microcosm#1106, ruled 2026-10-05: the receipts are a separate concept with their own variable)." }, "axiom": { "metric_name": "hmrc/property_income_income_band", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py index 96e923319..2423a2b9f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/__init__.py @@ -416,6 +416,7 @@ EfrsParityKnownGap, EfrsParityReference, EfrsParitySource, + load_efrs_engine_derived_exclusions, load_efrs_parity_known_gaps, load_efrs_parity_reference, ) @@ -887,6 +888,7 @@ "load_england_wales_oa_population", "load_england_wales_oa_ward_lookup", "load_ew_oa_lad23_lookup", + "load_efrs_engine_derived_exclusions", "load_efrs_parity_known_gaps", "load_efrs_parity_reference", "load_lad_itl_lookup", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py index ca573aef0..a766b0ea0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/battery_bindings.py @@ -81,6 +81,7 @@ from microcosm.build.uk_runtime.national_frame import ( UK_RELEASE_EXPORT_DROPPED_COLUMNS, _uk_gate_surface, + uk_release_export_frame, ) from microcosm.build.uk_runtime.release_input_coverage import ( assert_uk_release_input_coverage_build_stages, @@ -229,7 +230,11 @@ def _evaluate_release_input_coverage( ) # The release cut supplies the spine frame the stages produced, so the # family build-state half reads importance weights and stage receipts - # where they live; the coverage halves read the release frame. + # where they live; the coverage halves read the frame the release writes. + # On the full build the terminal gates hold the raw calibrated frame, so + # the export drops leave first: a column the release drops (the + # formula-owned property_wealth, microcosm#1106) is a reviewed exclusion, + # and the raw frame would otherwise report it as a stale exclusion. # The spine frame itself (the certifier's ``--spine-h5``), or the spine # checkpoint's published build state (weight kind, period, mass log: all # the build-state half reads) when a graph build hands it over. @@ -251,7 +256,7 @@ def _evaluate_release_input_coverage( else: build_state = spine_frame return uk_release_input_coverage_gate( - _uk_gate_surface(context.frame), + _uk_gate_surface(uk_release_export_frame(context.frame)), engine, manifest=manifest, build_state_frame=build_state, @@ -1787,6 +1792,10 @@ def _ledger_compile_parity_required_artifacts( # #1063 wealth_coherence check: the reviewed excess of owner # households without a main-residence value over the donor's. "maximum_owner_share_without_main_residence_excess", + # #1106 property_components check: no receipts below profit, + # the walk's whole-person rounding in landlord weights. + "maximum_rows_receipts_below_profit", + "maximum_band_error_in_landlord_weights", } ), artifact_keys=frozenset({"stage_evidence"}), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py index 37044ffaf..a0d87529f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/calibration_run.py @@ -91,6 +91,7 @@ "uk_stage_was_wealth_support", "uk_stage_was_wealth_coherence", "uk_stage_was_lisa_support", + "uk_stage_property_components", "uk_stage_nts_bus_travel_support", "uk_stage_nts_bus_travel_facts", "uk_stage_uc_deduction_attributes", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py index 817abd876..9991e4e7f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -143,6 +143,8 @@ "frs_legacy_proxies": ("frs",), "was_wealth": ("was",), "was_lisa": ("was", "was_person"), + # The finance-cost model trains on the SPI tape (microcosm#1106). + "property_components": ("spi",), "nts_bus_travel": ( "nts_household", "nts_individual", @@ -250,6 +252,23 @@ ("household", "household_support_channel"), } ), + # Engine-free: the landlords' profit and finance costs, the inputs that + # split the two income concepts (the SPI recipient rule and the household + # reference person's sub-letting rent) and the rental property values the + # coherence receipt reads (microcosm#1106). + "property_components": frozenset( + { + ("person", "age"), + ("person", "is_household_head"), + ("person", "is_uc_claimant"), + ("person", "person_support_channel"), + ("person", "property_income"), + ("person", "property_finance_costs"), + ("household", "subrent"), + ("household", "other_residential_property_value"), + ("household", "non_residential_property_value"), + } + ), # The NTS band model materializes an engine predictor (household gross # income) over the whole frame, an open surface like the LCFS QRF. "nts_bus_travel": None, @@ -723,6 +742,12 @@ def _cells( "non_residential_property_value", ), ), + # FRS landlords' profit gains the imputed finance costs; receipts are new + # (microcosm#1106). + "property_components": _cells( + "person", + ("property_income", "property_finance_costs", "property_rental_income"), + ), "lcfs_consumption": ( *_cells( "household", @@ -944,6 +969,8 @@ def _cells( "hmrc_spi_miscellaneous_employment_income", "hmrc_spi_other_income", "hmrc_spi_state_pension_income", + # Drawn last of the first-stage outputs, so it lands after them (#1106). + "property_finance_costs", "hmrc_spi_employed_income", "hmrc_spi_total_earned_income", "hmrc_spi_total_investment_income", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py index ed2051e68..b3f76b460 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph_kernels.py @@ -51,6 +51,8 @@ frs_education, frs_hmrc_source, frs_take_up, + hmrc_property_rental, + spi_income, spi_support, uc_capital_coherence, uc_relationships, @@ -90,6 +92,7 @@ "was_lisa": "was_lisa", "nts_bus_travel": "nts_bus_travel", "regional_property_uprating": "regional_uprating", + "property_components": "property_components", "lcfs_consumption": "lcfs_consumption", "etb_vat": "etb_vat", "etb_services": "etb_services", @@ -127,6 +130,10 @@ # The LISA stage reads its household donor through the WAS cleaning and its # household predictors through the WAS recipient surface. "was_lisa": (uk_engine_adapter, was_wealth), + # Landlords' receipts read the vendored PRIS rows through their typed + # loader, the tape through the income stage's preparation and uprating, + # and the support channel's names (microcosm#1106). + "property_components": (hmrc_property_rental, spi_income, spi_support), "nts_bus_travel": (uk_engine_adapter, bus_use_incidence), "lcfs_consumption": (uk_engine_adapter,), "etb_vat": (uk_engine_adapter,), @@ -365,6 +372,22 @@ def records(name: str) -> list[Mapping[str, object]]: ) +def _fixture_property_rental_facts(path: Path): + from .hmrc_property_rental import HMRCPropertyRentalBand, HMRCPropertyRentalFacts + + payload = dict(_json_mapping(path, label="PRIS property rental facts")) + raw_bands = payload.pop("receipts_bands") + if not isinstance(raw_bands, list): + raise ValueError("UK parity fixture PRIS receipts_bands must be a list.") + return HMRCPropertyRentalFacts( + **payload, + receipts_bands=tuple( + HMRCPropertyRentalBand(**dict(_mapping(row, label="Table 13 band"))) + for row in raw_bands + ), + ) + + def _fixture_asset_type_facts(path: Path): from .cgt_asset_type import ( HMRCCGTAssetTypeFacts, @@ -457,6 +480,7 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: from .lcfs_consumption import UKLCFSConsumptionStageTransform from .nts_bus_travel import UKNTSBusTravelStageTransform from .pension_credit_take_up import UKPensionCreditTakeUpStageTransform + from .property_components import UKPropertyComponentsStageTransform from .regional_uprating import UKRegionalPropertyUpratingStageTransform from .salary_sacrifice import UKSalarySacrificeStageTransform from .spi_band_donors import UKSPIIncomeBandDonorStageTransform @@ -522,6 +546,9 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: cgt_asset_type_facts = _fixture_asset_type_facts( _fixture_input(source, inputs, "cgt_asset_type_facts") ) + property_rental_facts = _fixture_property_rental_facts( + _fixture_input(source, inputs, "property_rental_facts") + ) cgt_parameters = UKCGTPolicyParameters( **dict(_mapping(descriptor.get("cgt_parameters"), label="CGT parameters")) ) @@ -595,6 +622,12 @@ def _fixture_implementations(source: Path) -> Mapping[str, object]: "regional_property_uprating": UKRegionalPropertyUpratingStageTransform( stage=stages["regional_property_uprating"] ), + "property_components": UKPropertyComponentsStageTransform( + stage=stages["property_components"], + spi_tab_path=spi_path, + donor_table=spi_donor, + facts=property_rental_facts, + ), "lcfs_consumption": UKLCFSConsumptionStageTransform( stage=stages["lcfs_consumption"], engine=engine, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_property_rental.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_property_rental.py new file mode 100644 index 000000000..836c9d9a3 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_property_rental.py @@ -0,0 +1,347 @@ +"""HMRC's property rental income statistics, typed from the pinned Chronicle feed. + +HMRC's Property Rental Income Statistics (PRIS, 2026 release) describe +unincorporated landlords from the Self Assessment property pages for tax year +2024-25: how many there are, their rental income, their allowable expenses +by type, and how many fall in each band of rental income. HMRC confirmed that +the published income is **before** allowable expenses (microcosm#1106), so it +is the landlords' receipts, and receipts less expenses is a derived cell. The +expense table lists residential finance costs beside the deductible expenses, +although ITTOIA 2005 s. 272A no longer deducts them: they are relieved as a +tax reduction (s. 274A) instead. + +Every row is copied verbatim from the pinned Chronicle consumer feed into one +vendored resource (``hmrc_property_rental_income_facts.json``, regenerated by +``tools/vendor_uk_ledger_facts.py``): Table 1 (landlords by type of tax +entity), Table 2 (rental income by type of tax entity), Table 6 (allowable +expenses by type of tax entity), Table 8 (allowable expenses by type) and +Table 13 (landlords by size of rental income). The loader types those rows, +refuses a resource that was not vendored from the committed feed pin or from +the pinned workbook, and refuses a roster that has drifted from the module +constants. + +Read the basis before using these facts. Tables 1, 2 and 6 split individuals +from partnerships; Tables 8 and 13 count every tax entity, partnerships +included, so a consumer that needs them on the individuals basis declares the +translation (the individuals' share of landlords from Table 1, of expenses +from Table 6). Counts publish in millions to two decimals (Table 13 to the +nearest 10,000) and amounts in billions of pounds to two decimals; the feed +carries both in people and pounds. +""" + +from __future__ import annotations + +import hashlib +from collections.abc import Mapping +from dataclasses import dataclass +from importlib.resources import files +from typing import Any + +from microcosm.build.uk_runtime.ledger_fact_vendoring import ( + load_vendored_resource, + verify_vendored_resource_feed_identity, +) + +__all__ = [ + "HMRC_PROPERTY_RENTAL_EXPENSE_TYPES", + "HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS", + "HMRC_PROPERTY_RENTAL_RECORD_SETS", + "HMRC_PROPERTY_RENTAL_RESIDENTIAL_FINANCE_COSTS", + "HMRC_PROPERTY_RENTAL_RESOURCE", + "HMRC_PROPERTY_RENTAL_SOURCE_FILE", + "HMRC_PROPERTY_RENTAL_SOURCE_SHA256", + "HMRC_PROPERTY_RENTAL_TAX_YEAR", + "HMRCPropertyRentalBand", + "HMRCPropertyRentalFacts", + "load_hmrc_property_rental_facts", +] + +#: The per-concern vendored resource; never edited by hand. +HMRC_PROPERTY_RENTAL_RESOURCE = "hmrc_property_rental_income_facts.json" + +#: Tax year (start year) of every row: 2024-25, the build period's tax year. +HMRC_PROPERTY_RENTAL_TAX_YEAR = 2024 + +#: The publisher workbook every vendored row must trace back to. A resource +#: re-vendored from a later release fails on this pin, so revised statistics +#: are a reviewed change. +HMRC_PROPERTY_RENTAL_SOURCE_FILE = "property_rental_income_statistics_tables_2026.ods" +HMRC_PROPERTY_RENTAL_SOURCE_SHA256 = ( + "87627fbf6122a88f9d20ce7c98d31c103d423fb10d66d661d87324d67227c846" +) + +_TABLE1_RECORD_SET_ID = "hmrc.property_rental_2026.table_1.ty2024" +_TABLE2_RECORD_SET_ID = "hmrc.property_rental_2026.table_2.ty2024" +_TABLE6_RECORD_SET_ID = "hmrc.property_rental_2026.table_6.ty2024" +_TABLE8_RECORD_SET_ID = "hmrc.property_rental_2026.table_8.ty2024" +_TABLE13_RECORD_SET_ID = "hmrc.property_rental_2026.table_13.ty2024" + +#: Every Chronicle record set the stage reads from the vendored resource, as +#: the manifests' ``verify_vendored_fact_resource`` operation declares them. +HMRC_PROPERTY_RENTAL_RECORD_SETS: tuple[str, ...] = ( + _TABLE1_RECORD_SET_ID, + _TABLE2_RECORD_SET_ID, + _TABLE6_RECORD_SET_ID, + _TABLE8_RECORD_SET_ID, + _TABLE13_RECORD_SET_ID, +) + +#: Lower bound of each Table 13 band of rental income, in pounds. The top +#: band is open. +HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS: tuple[int, ...] = ( + 0, + 10_000, + 20_000, + 30_000, + 40_000, + 50_000, + 60_000, + 70_000, + 80_000, + 90_000, + 100_000, +) + +#: The Table 8 expense types, all tax entities. Non-residential finance costs +#: stay deductible; only residential (dwelling-related) finance costs are +#: restricted. +HMRC_PROPERTY_RENTAL_RESIDENTIAL_FINANCE_COSTS = "residential_finance_costs" +HMRC_PROPERTY_RENTAL_EXPENSE_TYPES: tuple[str, ...] = ( + "rent_rates_and_insurance", + "repairs_and_maintenance", + HMRC_PROPERTY_RENTAL_RESIDENTIAL_FINANCE_COSTS, + "non_residential_finance_costs", + "legal_management_and_professional_fees", + "services_including_wages", + "other_allowable_expenses", +) + +_ENTITY_TYPES = ("individual", "partnership") +_UK_GEOGRAPHY_ID = "K02000001" +#: Table 8's types sum to Table 6's all-entity total up to the publication's +#: rounding (seven amounts each rounded to GBP 10m). +_EXPENSE_TOTAL_ROUNDING_GBP = 7 * 5_000_000.0 + + +@dataclass(frozen=True) +class HMRCPropertyRentalBand: + """One Table 13 row: tax entities by size of rental income.""" + + lower_bound: int + upper_bound: int | None + landlords: float + + +@dataclass(frozen=True) +class HMRCPropertyRentalFacts: + """The 2024-25 PRIS rows the property components stage reads.""" + + tax_year: int + #: Tables 1, 2 and 6 by type of tax entity: ``individual``, + #: ``partnership`` and ``all``. + landlords: Mapping[str, float] + receipts: Mapping[str, float] + expenses: Mapping[str, float] + #: Table 8 amounts and landlord counts by expense type, all tax entities. + expenses_by_type: Mapping[str, float] + expense_landlords_by_type: Mapping[str, float] + #: Table 13, all tax entities, lowest band first. + receipts_bands: tuple[HMRCPropertyRentalBand, ...] + resource_sha256: str + + def individuals_share(self, measure: str) -> float: + """Individuals ÷ all tax entities for ``landlords``, ``receipts`` or + ``expenses`` (Tables 1, 2 and 6).""" + + values = getattr(self, measure) + total = float(values["all"]) + if total <= 0.0: + raise ValueError(f"PRIS all-entity {measure} must be positive.") + return float(values["individual"]) / total + + def individuals_receipts_bands(self) -> tuple[HMRCPropertyRentalBand, ...]: + """Table 13 on the individuals basis. + + Declared translation: every band is scaled by the individuals' share + of landlords (Table 1), on the assumption that partnerships spread + across bands like all tax entities. Partnerships' mean receipts are + several times individuals', so the assumption overstates the + individuals in the top bands; the stage receipt records it. + """ + + share = self.individuals_share("landlords") + return tuple( + HMRCPropertyRentalBand( + band.lower_bound, band.upper_bound, band.landlords * share + ) + for band in self.receipts_bands + ) + + def individuals_residential_finance_costs(self) -> float: + """Table 8's residential finance costs scaled by the individuals' + share of expenses (Table 6), the declared translation.""" + + return float( + self.expenses_by_type[HMRC_PROPERTY_RENTAL_RESIDENTIAL_FINANCE_COSTS] + ) * self.individuals_share("expenses") + + def individuals_deductible_expenses(self) -> float: + """Individuals' allowable expenses other than residential finance + costs: the expenses that separate receipts from the SPI's profit.""" + + return float(self.expenses["individual"]) - ( + self.individuals_residential_finance_costs() + ) + + def evidence(self) -> dict[str, object]: + return { + "resource": HMRC_PROPERTY_RENTAL_RESOURCE, + "resource_sha256": self.resource_sha256, + "tax_year": self.tax_year, + "landlords": dict(self.landlords), + "receipts_gbp": dict(self.receipts), + "expenses_gbp": dict(self.expenses), + "expenses_by_type_gbp": dict(self.expenses_by_type), + "individuals_share": { + measure: self.individuals_share(measure) + for measure in ("landlords", "receipts", "expenses") + }, + "individuals_residential_finance_costs_gbp": ( + self.individuals_residential_finance_costs() + ), + "individuals_deductible_expenses_gbp": ( + self.individuals_deductible_expenses() + ), + "receipts_bands": [ + { + "lower_bound": band.lower_bound, + "upper_bound": band.upper_bound, + "landlords": band.landlords, + } + for band in self.receipts_bands + ], + } + + +def _rows(payload: Mapping[str, Any], record_set_id: str) -> list[Mapping[str, Any]]: + rows = [ + row + for row in payload["rows"] + if (row.get("layout") or {}).get("record_set_id") == record_set_id + ] + if not rows: + raise ValueError( + f"{HMRC_PROPERTY_RENTAL_RESOURCE} carries no {record_set_id} rows." + ) + for row in rows: + source = row.get("source") or {} + if ( + source.get("source_file") != HMRC_PROPERTY_RENTAL_SOURCE_FILE + or source.get("source_sha256") != HMRC_PROPERTY_RENTAL_SOURCE_SHA256 + ): + raise ValueError( + f"{record_set_id} row {row.get('aggregate_fact_key')} does not " + f"trace to {HMRC_PROPERTY_RENTAL_SOURCE_FILE} at the pinned sha256." + ) + period = row.get("period") or {} + if period.get("type") != "tax_year" or int(period.get("value", -1)) != int( + HMRC_PROPERTY_RENTAL_TAX_YEAR + ): + raise ValueError(f"{record_set_id} carries a row outside tax year 2024.") + if (row.get("geography") or {}).get("id") != _UK_GEOGRAPHY_ID: + raise ValueError(f"{record_set_id} carries a row outside the UK.") + return rows + + +def _by_entity_type(rows: list[Mapping[str, Any]], *, label: str) -> dict[str, float]: + values: dict[str, float] = {} + for row in rows: + key = str((row.get("dimensions") or {}).get("tax_entity_type", "all")) + if key in values: + raise ValueError(f"{label} repeats tax entity type {key!r}.") + values[key] = float(row["value"]) + if set(values) != {*_ENTITY_TYPES, "all"}: + raise ValueError(f"{label} must carry individuals, partnerships and all.") + if abs(values["individual"] + values["partnership"] - values["all"]) > max( + 0.011 * values["all"], 1.0 + ): + raise ValueError(f"{label}: individuals and partnerships do not sum to all.") + return values + + +def load_hmrc_property_rental_facts( + resource: str = HMRC_PROPERTY_RENTAL_RESOURCE, + *, + verify_feed_identity: bool = True, +) -> HMRCPropertyRentalFacts: + """Type the vendored PRIS 2024-25 rows; refuse drift by name.""" + + payload = load_vendored_resource(resource) + if verify_feed_identity: + verify_vendored_resource_feed_identity(payload) + digest = hashlib.sha256( + files("microcosm.build.uk").joinpath(resource).read_bytes() + ).hexdigest() + landlords = _by_entity_type(_rows(payload, _TABLE1_RECORD_SET_ID), label="Table 1") + receipts = _by_entity_type(_rows(payload, _TABLE2_RECORD_SET_ID), label="Table 2") + expenses = _by_entity_type(_rows(payload, _TABLE6_RECORD_SET_ID), label="Table 6") + + amounts: dict[str, float] = {} + counts: dict[str, float] = {} + for row in _rows(payload, _TABLE8_RECORD_SET_ID): + kind = (row.get("dimensions") or {}).get("property_expense_type") + if kind is None: + continue + measure = str(row.get("measure_id", "")) + target = { + "property_expenses_amount": amounts, + "expenses_landlord_count": counts, + }.get(measure) + if target is None: + continue + if kind in target: + raise ValueError(f"Table 8 repeats {kind!r} for {measure!r}.") + target[str(kind)] = float(row["value"]) + if tuple(sorted(amounts)) != tuple(sorted(HMRC_PROPERTY_RENTAL_EXPENSE_TYPES)): + raise ValueError( + "Table 8 expense types drifted from the module roster: " + f"{sorted(amounts)} against {sorted(HMRC_PROPERTY_RENTAL_EXPENSE_TYPES)}." + ) + if abs(sum(amounts.values()) - expenses["all"]) > _EXPENSE_TOTAL_ROUNDING_GBP: + raise ValueError( + "Table 8's expense types do not sum to Table 6's all-entity " + f"expenses: {sum(amounts.values()):.0f} against {expenses['all']:.0f}." + ) + + bands: list[HMRCPropertyRentalBand] = [] + for row in _rows(payload, _TABLE13_RECORD_SET_ID): + dimensions = row.get("dimensions") or {} + lower = int(dimensions.get("property_income_lower_bound", 0)) + upper = dimensions.get("property_income_upper_bound") + bands.append( + HMRCPropertyRentalBand( + lower, None if upper is None else int(upper), float(row["value"]) + ) + ) + bands.sort(key=lambda band: band.lower_bound) + lowers = tuple(band.lower_bound for band in bands) + if lowers != HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS: + raise ValueError( + f"Table 13 bands drifted from the module roster: {lowers} against " + f"{HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS}." + ) + for band, following in zip(bands, bands[1:], strict=False): + if band.upper_bound != following.lower_bound: + raise ValueError("Table 13 bands must be contiguous.") + if bands[-1].upper_bound is not None: + raise ValueError("Table 13's top band must be open.") + return HMRCPropertyRentalFacts( + tax_year=HMRC_PROPERTY_RENTAL_TAX_YEAR, + landlords=landlords, + receipts=receipts, + expenses=expenses, + expenses_by_type=amounts, + expense_landlords_by_type=counts, + receipts_bands=tuple(bands), + resource_sha256=digest, + ) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py index c4ccbfef6..a2c715b6d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/measure_simulation.py @@ -18,6 +18,7 @@ without_uk_native_alias_columns, ) from microcosm.build.uk_runtime.national_frame import ( + UK_RELEASE_EXPORT_DROPPED_COLUMNS, load_uk_national_frame, write_uk_national_frame, ) @@ -359,6 +360,14 @@ def _engine_scratch_frame( ) -> tuple[Any, tuple[str, ...]]: """The frame a scratch-mode engine loads, and the columns it leaves behind. + The scratch H5 is an engine boundary like the release export, so the + release export's reviewed drops (``UK_RELEASE_EXPORT_DROPPED_COLUMNS``) + leave here too. Among them ``property_wealth`` is formula-owned in + policyengine-uk: a persisted copy would override the engine's sum of the + three persisted property components in the calibration year + (microcosm#1106). The resolver's own frame keeps every column; + frame-column measures read it. + The nation-native alias codes of the derived geography layers (microcosm#931) are NA outside their own nation by design and are never engine inputs; the single-year dataset policyengine-uk loads refuses any @@ -373,18 +382,30 @@ def _engine_scratch_frame( the pool's and the formula is exact for identical clone copies. The scaling is declared on the engine frame's mass log. - A frame carrying no alias columns and no scale is returned as is. + A frame carrying none of those columns and no scale is returned as is. """ - household = frame.table("household") + trimmed: dict[str, pd.DataFrame] = {} + for entity, columns in UK_RELEASE_EXPORT_DROPPED_COLUMNS.items(): + table = frame.table(entity) + present = [column for column in columns if column in table.columns] + if present: + trimmed[entity] = table.drop(columns=present) + household = trimmed.get("household", frame.table("household")) kept = without_uk_native_alias_columns(household) scale = None if engine_weight_scale is None else float(engine_weight_scale) if scale is not None and not (np.isfinite(scale) and scale > 0.0): raise ValueError("engine weight scale must be a positive finite factor.") - if kept is household and (scale is None or scale == 1.0): + if not trimmed and kept is household and (scale is None or scale == 1.0): return frame, () - dropped = tuple(c for c in household.columns if c not in kept.columns) + dropped = tuple( + column + for entity in UK_RELEASE_EXPORT_DROPPED_COLUMNS + for column in frame.table(entity).columns + if entity in trimmed and column not in trimmed[entity].columns + ) + tuple(c for c in household.columns if c not in kept.columns) tables = {name: frame.table(name) for name in frame.entities} + tables.update(trimmed) tables["household"] = kept weights = {entity: frame.weights_for(entity) for entity in frame.weighted_entities} mass_log = frame.mass_log diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_frame.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_frame.py index c5db4c442..3d7e3a9c7 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/national_frame.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/national_frame.py @@ -463,6 +463,18 @@ def _write_uk_single_year_tables( #: five internal disability carriers (``frs_disability``'s #: ``UK_INTERNAL_DISABILITY_REPORTED_COLUMNS``) are stage-internal inputs #: that the export registers keep off the release (review of #1089). +#: +#: ``household.property_wealth`` (microcosm#1106, the uk-data#543 defect) is +#: formula-owned in policyengine-uk: it adds ``residential_property_value`` +#: (itself ``main_residence_value`` + ``other_residential_property_value``) +#: and ``non_residential_property_value``. A persisted copy overrides that +#: sum, and the variable has no uprating index, so a saved WAS total stays at +#: its base-year level in every later year while the components grow (the +#: published aa31bdf6 year files hold it at growth 1.0000 from 2026 to 2030 +#: against 1.1303 for the sum), and it also counts ``owned_land`` and the +#: ``other_property_value`` remainder the engine sum leaves out. The spine +#: keeps it (the WAS stage's identity gate, donor-range cap and later +#: segments read it); the engine derives it from the persisted components. UK_RELEASE_EXPORT_DROPPED_COLUMNS: Mapping[str, tuple[str, ...]] = { "person": ( "incapacity_benefit_reported", @@ -477,6 +489,7 @@ def _write_uk_single_year_tables( # converted record's pay, and is no engine input. "salary_sacrifice_pre_conversion_pay", ), + "household": ("property_wealth",), } diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/parity_reference.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/parity_reference.py index 3fd02e527..705ba3e4d 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/parity_reference.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/parity_reference.py @@ -21,6 +21,7 @@ "EfrsParityKnownGap", "EfrsParityReference", "EfrsParitySource", + "load_efrs_engine_derived_exclusions", "load_efrs_parity_known_gaps", "load_efrs_parity_reference", ] @@ -179,7 +180,9 @@ def load_efrs_parity_reference( } expected_entities = {"person", "benunit", "household"} invalid_entities = { - name: entity for name, entity in entities.items() if entity not in expected_entities + name: entity + for name, entity in entities.items() + if entity not in expected_entities } if invalid_entities: raise ValueError( @@ -205,33 +208,59 @@ def load_efrs_parity_reference( ) -def load_efrs_parity_known_gaps( - resource: str = EFRS_PARITY_KNOWN_GAPS_RESOURCE, +def _ledger_entries( + raw: object, *, section: str, resource: str ) -> tuple[EfrsParityKnownGap, ...]: - """Load the canonical UK exclusion ledger (which may honestly be empty).""" - payload = _resource_payload(resource) - raw_gaps = payload.get("known_gaps") - if not isinstance(raw_gaps, Mapping): - raise ValueError(f"{resource}: 'known_gaps' must be a JSON object.") - gaps: list[EfrsParityKnownGap] = [] - for variable, entry in sorted(raw_gaps.items()): + if not isinstance(raw, Mapping): + raise ValueError(f"{resource}: {section!r} must be a JSON object.") + entries: list[EfrsParityKnownGap] = [] + for variable, entry in sorted(raw.items()): if not isinstance(entry, Mapping): raise ValueError( f"{resource}: entry for {variable!r} must be a JSON object." ) - gaps.append( + entries.append( EfrsParityKnownGap( variable=str(variable), reason=_require_str( entry.get("reason"), - field_name=f"known_gaps[{variable}].reason", + field_name=f"{section}[{variable}].reason", resource=resource, ), tracking_note=_require_str( entry.get("tracking_note"), - field_name=f"known_gaps[{variable}].tracking_note", + field_name=f"{section}[{variable}].tracking_note", resource=resource, ), ) ) - return tuple(gaps) + return tuple(entries) + + +def load_efrs_parity_known_gaps( + resource: str = EFRS_PARITY_KNOWN_GAPS_RESOURCE, +) -> tuple[EfrsParityKnownGap, ...]: + """Load the canonical UK exclusion ledger (which may honestly be empty).""" + payload = _resource_payload(resource) + return _ledger_entries( + payload.get("known_gaps"), section="known_gaps", resource=resource + ) + + +def load_efrs_engine_derived_exclusions( + resource: str = EFRS_PARITY_KNOWN_GAPS_RESOURCE, +) -> tuple[EfrsParityKnownGap, ...]: + """Load the reference inputs a release leaves for the engine to derive. + + These are not parity debt. The enhanced FRS persists them, but + policyengine-uk computes them from inputs the candidate does persist, and a + persisted copy would override the formula (microcosm#1106: a saved + ``property_wealth`` overrides the engine's sum of the three property + components and is never uprated). A ledger without the section has none. + """ + payload = _resource_payload(resource) + return _ledger_entries( + payload.get("engine_derived_exclusions", {}), + section="engine_derived_exclusions", + resource=resource, + ) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py new file mode 100644 index 000000000..4719bf88c --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py @@ -0,0 +1,1083 @@ +"""Landlords' receipts and finance costs on the UK spine (microcosm#1106). + +policyengine-uk 2.123.0 (PolicyEngine/policyengine-uk#2172) reads a landlord's +property business in three persisted inputs: ``property_income``, the profit +after allowable expenses and before the property allowance and before +dwelling-related finance costs (the SPI's concept); ``property_rental_income``, +the receipts before expenses, which decide whether the property allowance or +the expenses route applies (zero, or less than the profit, means unknown); and +``property_finance_costs``, the year's dwelling-related finance costs that +ITTOIA 2005 s. 272A restricts and s. 274A relieves as a tax reduction. The +``property_components`` stage fills the two missing pieces. + +**Finance costs on the FRS concept.** The SPI channel draws its landlords' +restricted finance costs from the tape (``hmrc_spi_income_spine``). FRS +landlords report ROYYR1 after show card K6, which nets mortgage payments and +loan interest, so their profit sits below the SPI concept by the interest. The +stage draws their finance costs from the SPI 2022-23 tape, uprated to the +build period with the engine's indices for each variable, among the tape's +landlords whose profit after restricted finance costs is positive, the analog +of an FRS landlord reporting a profit: + +* whether a landlord has finance costs: a person-keyed uniform below the + tape's FACT-weighted share with finance costs in the landlord's cell of + profit after finance costs (FACT-weighted deciles of the analog landlords, + so every cell has tape support); +* how much: the regime-gated QRF fitted on the analog landlords with finance + costs, given their profit after finance costs and their age, drawn at a + second person-keyed quantile (``predict_positive_from_uniforms``). + +The drawn costs are added back to the landlord's ``property_income`` (the +recommended ruling of decision 6, to be confirmed with Max before merge), so +the engine relieves the interest once, as a tax reduction. The card also nets +mortgage capital, which stays netted: a known shortfall in FRS profit. + +**Receipts for every landlord.** No microdata source carries receipts beside +profit, so the stage constructs them from PRIS 2024-25 (the vendored +``hmrc_property_rental_income_facts.json``), the way the CGT stage allocates +its Table 3 bands: landlords are ranked by profit (both channels, after the +add-back), walked top band first into Table 13's eleven bands of rental +income (one seeded systematic offset, whole persons), and given receipts +linear in their weight-ranked position within the band, from its upper bound +for the highest profit down to its lower bound, never below their profit. +Each band is filled to its share of PRIS's individual landlords applied to +the spine's own landlord weight, not to PRIS's count: before calibration the +spine carries fewer landlords than PRIS (2.21m against 2.85m), and filling +the published counts would push every profit rank into a higher band. The open top band takes +receipts proportional to profit, ``max(100,000, k x profit)``, with ``k >= 1`` +solved so that receipts reach the individuals' Table 2 total. Receipts less +profit are the deductible expenses: PRIS's allowable expenses other than +residential finance costs. + +Sub-letting rent (SUBRENT, on the household reference person) stays in +``property_income`` as reported until Rent a Room is released +(PolicyEngine/policyengine-uk#2002); its receipts are the same amount, with no +expenses. Landlords with no profit (FRS loss-makers, whose loss counts as +zero, and tape landlords at zero) get no receipts: a recorded residual, since +PRIS counts them among its landlords. +""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +import numpy as np +import pandas as pd + +from microcosm.build.gates import FitWeightRecord +from microcosm.build.source_manifest import SourceStageSpec +from microcosm.build.stochastic_assignment import stable_identity_uniforms +from microcosm.build.uk_runtime.hmrc_property_rental import ( + HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS, + HMRC_PROPERTY_RENTAL_RECORD_SETS, + HMRC_PROPERTY_RENTAL_RESOURCE, + HMRCPropertyRentalFacts, + load_hmrc_property_rental_facts, +) +from microcosm.build.uk_runtime.national_frame import ( + uk_household_mass_conservation_receipt, + uk_household_weight_kind, + uk_national_frame, + uk_time_period, + validate_uk_national_frame, +) +from microcosm.build.uk_runtime.spi_income import ( + SPI_DONOR_INCOME_YEAR, + SPI_INCOME_UPRATING_VARIABLES, + SPI_MINIMUM_RECIPIENT_AGE, + SPI_RECIPIENT_ROLE_COLUMN, + SPIDonorAgeModel, + load_spi_donor_age_model, + prepare_spi_donor_table, + verify_spi_donor_identity, +) +from microcosm.build.uk_runtime.spi_support import ( + SPI_SYNTHETIC_SUPPORT_CHANNEL, + support_channel_column, +) +from microcosm.frame import Frame + +__all__ = [ + "ALLOCATE_PROPERTY_RENTAL_INCOME_KIND", + "IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND", + "UK_PROPERTY_COMPONENTS_MASS_CONSERVATION_REASON", + "UK_PROPERTY_COMPONENTS_NONNEGATIVE_OUTPUT_COLUMNS", + "UK_PROPERTY_COMPONENTS_OUTPUT_COLUMNS", + "UK_PROPERTY_COMPONENTS_REWRITE_COLUMNS", + "UK_PROPERTY_COMPONENTS_STAGE_NAME", + "FinanceCostModelSpec", + "PropertyComponentsError", + "ReceiptsAllocationSpec", + "UKPropertyComponentsStageTransform", + "allocate_property_rental_income", + "frs_concept_rental_profit", + "impute_frs_property_finance_costs", + "spi_tape_finance_cost_donor", +] + +UK_PROPERTY_COMPONENTS_STAGE_NAME = "property_components" +#: The household-mass receipt this stage records (the manifest's +#: ``record_mass_conservation_receipt`` operation repeats it). +UK_PROPERTY_COMPONENTS_MASS_CONSERVATION_REASON = ( + "Landlords' receipts and finance costs on the source spine: household " + "weights pass through unchanged and total household mass is conserved." +) + +IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND = "impute_frs_property_finance_costs" +ALLOCATE_PROPERTY_RENTAL_INCOME_KIND = "allocate_property_rental_income" +VERIFY_VENDORED_FACT_RESOURCE_KIND = "verify_vendored_fact_resource" + +PROFIT_COLUMN = "property_income" +FINANCE_COSTS_COLUMN = "property_finance_costs" +RECEIPTS_COLUMN = "property_rental_income" +SUBLET_COLUMN = "subrent" +HOUSEHOLD_HEAD_COLUMN = "is_household_head" +#: The tape's profit after restricted finance costs: the FRS PropRent concept. +PROFIT_AFTER_FINANCE_COSTS = "profit_after_finance_costs" + +UK_PROPERTY_COMPONENTS_OUTPUT_COLUMNS: tuple[str, ...] = (RECEIPTS_COLUMN,) +UK_PROPERTY_COMPONENTS_REWRITE_COLUMNS: tuple[str, ...] = ( + PROFIT_COLUMN, + FINANCE_COSTS_COLUMN, +) +UK_PROPERTY_COMPONENTS_NONNEGATIVE_OUTPUT_COLUMNS: tuple[str, ...] = ( + RECEIPTS_COLUMN, + PROFIT_COLUMN, + FINANCE_COSTS_COLUMN, +) +UK_PROPERTY_COMPONENTS_FIT_NAME = "uk_spi_2022_23_property_finance_costs" + +#: The income stage's stage-1 seed: the tape is prepared exactly as +#: ``hmrc_spi_income_spine`` prepares it (ages drawn by ONS shares). +UK_PROPERTY_COMPONENTS_TAPE_SEED = 42 + +#: Coherence evidence: landlords whose household holds rental property. +_RENTAL_PROPERTY_COLUMNS = ( + "other_residential_property_value", + "non_residential_property_value", +) +_BISECTION_STEPS = 200 + + +class PropertyComponentsError(ValueError): + """The stage's inputs or declarations cannot support the allocation.""" + + +def _operation(stage: SourceStageSpec, kind: str) -> Mapping[str, Any]: + matches = [op for op in stage.operations if op.kind == kind] + if len(matches) != 1: + raise PropertyComponentsError( + f"{UK_PROPERTY_COMPONENTS_STAGE_NAME} must declare exactly one " + f"{kind!r} operation; found {len(matches)}." + ) + return matches[0].parameters + + +def _weighted_quantiles( + values: np.ndarray, weights: np.ndarray, quantiles: Sequence[float] +) -> dict[str, float] | None: + if len(values) == 0 or float(weights.sum()) <= 0.0: + return None + order = np.argsort(values, kind="stable") + cumulative = np.cumsum(weights[order]) + cumulative /= cumulative[-1] + return { + f"p{int(round(q * 100)):02d}": float( + values[order][min(np.searchsorted(cumulative, q), len(values) - 1)] + ) + for q in quantiles + } + + +# -------------------------------------------------------------------------- +# Declared parameters +# -------------------------------------------------------------------------- + + +@dataclass(frozen=True) +class FinanceCostModelSpec: + """The ``impute_frs_property_finance_costs`` operation.""" + + incidence_cells: int + incidence_seed: int + incidence_salt: str + amount_seed: int + amount_salt: str + n_estimators: int + predictors: tuple[str, ...] + expected_regime: str + tape_preparation_seed: int + + @classmethod + def from_parameters(cls, parameters: Mapping[str, Any]) -> FinanceCostModelSpec: + cells = int(parameters["incidence_cells"]) + if cells < 1: + raise PropertyComponentsError("incidence_cells must be at least 1.") + predictors = tuple(str(v) for v in parameters["predictors"]) + if PROFIT_AFTER_FINANCE_COSTS not in predictors: + raise PropertyComponentsError( + f"the finance-cost model must condition on {PROFIT_AFTER_FINANCE_COSTS!r}." + ) + if parameters.get("output") != FINANCE_COSTS_COLUMN: + raise PropertyComponentsError( + f"impute_frs_property_finance_costs must write {FINANCE_COSTS_COLUMN!r}." + ) + if parameters.get("add_back_to") != PROFIT_COLUMN: + raise PropertyComponentsError( + f"the drawn finance costs must be added back to {PROFIT_COLUMN!r}." + ) + spec = cls( + incidence_cells=cells, + incidence_seed=int(parameters["incidence_seed"]), + incidence_salt=str(parameters["incidence_salt"]), + amount_seed=int(parameters["amount_seed"]), + amount_salt=str(parameters["amount_salt"]), + n_estimators=int(parameters["n_estimators"]), + predictors=predictors, + expected_regime=str(parameters["expected_regime"]), + tape_preparation_seed=int(parameters["tape_preparation_seed"]), + ) + if spec.tape_preparation_seed != UK_PROPERTY_COMPONENTS_TAPE_SEED: + raise PropertyComponentsError( + "tape_preparation_seed must be the income stage's stage-1 seed " + f"{UK_PROPERTY_COMPONENTS_TAPE_SEED}." + ) + if spec.incidence_salt == spec.amount_salt: + raise PropertyComponentsError("the two draws need distinct salts.") + uprating = dict(parameters["income_uprating_variables"]) + expected = { + column: SPI_INCOME_UPRATING_VARIABLES[column] + for column in (PROFIT_COLUMN, FINANCE_COSTS_COLUMN) + } + if uprating != expected or int(parameters["donor_income_period"]) != ( + SPI_DONOR_INCOME_YEAR + ): + raise PropertyComponentsError( + "the tape is rebased as the income stage rebases it: " + f"income_uprating_variables {expected} from {SPI_DONOR_INCOME_YEAR}." + ) + return spec + + +@dataclass(frozen=True) +class ReceiptsAllocationSpec: + """The ``allocate_property_rental_income`` operation.""" + + band_lower_bounds: tuple[int, ...] + walk_seed: int + maximum_top_band_multiplier: float + + @classmethod + def from_parameters(cls, parameters: Mapping[str, Any]) -> ReceiptsAllocationSpec: + bounds = tuple(int(v) for v in parameters["band_lower_bounds"]) + if bounds != HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS: + raise PropertyComponentsError( + "band_lower_bounds must be PRIS Table 13's bands " + f"{HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS}." + ) + if parameters.get("output") != RECEIPTS_COLUMN: + raise PropertyComponentsError( + f"allocate_property_rental_income must write {RECEIPTS_COLUMN!r}." + ) + if parameters.get("resource") != HMRC_PROPERTY_RENTAL_RESOURCE: + raise PropertyComponentsError( + f"the allocation reads {HMRC_PROPERTY_RENTAL_RESOURCE}." + ) + multiplier = float(parameters["maximum_top_band_multiplier"]) + if not np.isfinite(multiplier) or multiplier <= 1.0: + raise PropertyComponentsError( + "maximum_top_band_multiplier must be finite and above 1." + ) + return cls( + band_lower_bounds=bounds, + walk_seed=int(parameters["walk_seed"]), + maximum_top_band_multiplier=multiplier, + ) + + +# -------------------------------------------------------------------------- +# The FRS concept and the tape donor +# -------------------------------------------------------------------------- + + +def _person_weights(frame: Frame) -> np.ndarray: + household = frame.table("household") + weights = pd.Series( + np.asarray(frame.weights_for("household").values, dtype=float), + index=household["household_id"].to_numpy(), + ) + person = frame.table("person") + return weights.reindex(person["person_household_id"].to_numpy()).to_numpy( + dtype=float + ) + + +def _tape_concept_rows(person: pd.DataFrame) -> np.ndarray: + """Rows whose income leaves the income stage drew from the SPI tape. + + The SPI support channel's claimants and partners aged 16 and over (the + income stage's recipient rule); every other row keeps FRS-reported + property income, including the channel's dependants on their twin values. + """ + + channel = person[support_channel_column("person")].astype(str).to_numpy() + age = pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float) + role = person[SPI_RECIPIENT_ROLE_COLUMN].to_numpy(dtype=bool) + return ( + (channel == SPI_SYNTHETIC_SUPPORT_CHANNEL) + & (age >= SPI_MINIMUM_RECIPIENT_AGE) + & role + ) + + +def frs_concept_rental_profit( + person: pd.DataFrame, household: pd.DataFrame +) -> tuple[np.ndarray, np.ndarray]: + """Each person's sub-letting rent and their profit from other property. + + ``frs_property_income`` credits the household's SUBRENT (annual, floored + at zero) to its reference person; the rest of an FRS row's + ``property_income`` is ROYYR1. Returns ``(sublet, rental)`` for the FRS + concept; the caller applies them to FRS-concept rows only. + """ + + profit = pd.to_numeric(person[PROFIT_COLUMN], errors="coerce").to_numpy(dtype=float) + if SUBLET_COLUMN in household: + household_sublet = pd.Series( + pd.to_numeric(household[SUBLET_COLUMN], errors="coerce") + .fillna(0.0) + .clip(lower=0.0) + .to_numpy(dtype=float), + index=household["household_id"].to_numpy(), + ) + sublet = household_sublet.reindex( + person["person_household_id"].to_numpy() + ).to_numpy(dtype=float) + sublet = np.where( + person[HOUSEHOLD_HEAD_COLUMN].to_numpy(dtype=bool), sublet, 0.0 + ) + else: + sublet = np.zeros(len(person), dtype=float) + sublet = np.minimum(sublet, np.maximum(profit, 0.0)) + rental = np.maximum(profit - sublet, 0.0) + return sublet, rental + + +@dataclass(frozen=True) +class FinanceCostDonor: + """The tape's analog landlords: profit after finance costs above zero.""" + + analog: pd.DataFrame + #: Interior edges of the incidence cells (profit after finance costs); + #: a value at an edge belongs to the cell above it. + edges: np.ndarray + incidence: tuple[dict[str, float | None], ...] + receipt: Mapping[str, Any] + + def cell(self, values: np.ndarray) -> np.ndarray: + return np.searchsorted( + self.edges, np.asarray(values, dtype=float), side="right" + ) + + +def _incidence_edges(values: np.ndarray, weights: np.ndarray, cells: int) -> np.ndarray: + """Interior edges at the FACT-weighted ``k / cells`` quantiles, every cell + non-empty: repeated quantiles merge, and an edge at the minimum (which + would leave the lowest cell empty) is dropped.""" + + order = np.argsort(values, kind="stable") + cumulative = np.cumsum(weights[order]) + cumulative /= cumulative[-1] + edges = [] + for k in range(1, cells): + value = float( + values[order][min(np.searchsorted(cumulative, k / cells), len(values) - 1)] + ) + if value > float(values.min()) and (not edges or value > edges[-1]): + edges.append(value) + return np.asarray(edges, dtype=float) + + +def spi_tape_finance_cost_donor( + prepared: pd.DataFrame, + *, + uprating_factors: Mapping[str, float], + spec: FinanceCostModelSpec, +) -> FinanceCostDonor: + """The analog landlords of the prepared tape, at build-period prices. + + ``prepared`` is :func:`prepare_spi_donor_table`'s output (2022-23 money); + ``uprating_factors`` are the income stage's factors for the same columns, + so the tape's profit moves with ``obr.per_capita.gdp`` and its finance + costs with ``obr.mortgage_interest``, as the engine uprates the inputs. + """ + + missing = sorted( + {PROFIT_COLUMN, FINANCE_COSTS_COLUMN, "age", "FACT"} - set(prepared.columns) + ) + if missing: + raise PropertyComponentsError(f"the prepared tape lacks {missing}.") + for column in (PROFIT_COLUMN, FINANCE_COSTS_COLUMN): + factor = float(uprating_factors[column]) + if not np.isfinite(factor) or factor <= 0.0: + raise PropertyComponentsError(f"{column} uprating factor must be positive.") + profit = prepared[PROFIT_COLUMN].to_numpy(dtype=float) * float( + uprating_factors[PROFIT_COLUMN] + ) + costs = prepared[FINANCE_COSTS_COLUMN].to_numpy(dtype=float) * float( + uprating_factors[FINANCE_COSTS_COLUMN] + ) + weight = prepared["FACT"].to_numpy(dtype=float) + landlord = profit > 0.0 + after = profit - costs + analog_mask = landlord & (after > 0.0) + if not analog_mask.any(): + raise PropertyComponentsError( + "the tape has no landlord with profit after costs." + ) + analog = pd.DataFrame( + { + PROFIT_AFTER_FINANCE_COSTS: after[analog_mask], + "age": prepared["age"].to_numpy(dtype=float)[analog_mask], + FINANCE_COSTS_COLUMN: costs[analog_mask], + "weight": weight[analog_mask], + } + ).reset_index(drop=True) + edges = _incidence_edges( + analog[PROFIT_AFTER_FINANCE_COSTS].to_numpy(dtype=float), + analog["weight"].to_numpy(dtype=float), + spec.incidence_cells, + ) + cell = np.searchsorted(edges, analog[PROFIT_AFTER_FINANCE_COSTS], side="right") + has = analog[FINANCE_COSTS_COLUMN].to_numpy() > 0.0 + bounds = (0.0, *edges.tolist()) + incidence = [] + for index, lower in enumerate(bounds): + in_cell = cell == index + mass = float(analog["weight"].to_numpy()[in_cell].sum()) + if mass <= 0.0: + raise PropertyComponentsError( + "an incidence cell has no analog tape landlords." + ) + incidence.append( + { + "lower_bound": lower, + "upper_bound": bounds[index + 1] if index + 1 < len(bounds) else None, + "tape_records": int(in_cell.sum()), + "tape_weight": mass, + "share_with_finance_costs": ( + float(analog["weight"].to_numpy()[in_cell & has].sum()) / mass + ), + } + ) + receipt = { + "tape_landlords": int(landlord.sum()), + "tape_landlord_weight": float(weight[landlord].sum()), + "tape_landlords_with_finance_costs_weight": float( + weight[landlord & (costs > 0.0)].sum() + ), + "tape_profit_gbp": float((profit * weight)[landlord].sum()), + "tape_finance_costs_gbp": float((costs * weight)[landlord].sum()), + "analog_landlords": int(analog_mask.sum()), + "analog_weight": float(weight[analog_mask].sum()), + "analog_rule": ( + "tape landlords (property_income above zero) whose profit after " + "restricted finance costs is above zero: the analog of an FRS " + "landlord reporting a profit after show card K6" + ), + "uprating_factors": { + PROFIT_COLUMN: float(uprating_factors[PROFIT_COLUMN]), + FINANCE_COSTS_COLUMN: float(uprating_factors[FINANCE_COSTS_COLUMN]), + }, + "incidence_cells": spec.incidence_cells, + "incidence_by_profit_after_finance_costs": incidence, + } + return FinanceCostDonor( + analog=analog, edges=edges, incidence=tuple(incidence), receipt=receipt + ) + + +@dataclass(frozen=True) +class FinanceCostImputation: + costs: np.ndarray + receipt: Mapping[str, Any] + fit_weight_records: tuple[FitWeightRecord, ...] + + +def impute_frs_property_finance_costs( + donor: FinanceCostDonor, + *, + person_ids: np.ndarray, + profit: np.ndarray, + age: np.ndarray, + weights: np.ndarray, + spec: FinanceCostModelSpec, +) -> FinanceCostImputation: + """Draw finance costs for FRS-concept landlords (``profit`` above zero). + + Incidence: a person-keyed uniform below the tape share of the landlord's + cell of profit after finance costs. Amount: the QRF fitted on the analog + landlords with finance costs, drawn at a second person-keyed quantile. + Rows with no profit get no draw and no costs. + """ + + from microcosm.fit.qrf import RegimeGatedQRF + + profit = np.asarray(profit, dtype=float) + landlord = profit > 0.0 + costs = np.zeros(len(profit), dtype=float) + shares = np.asarray( + [cell["share_with_finance_costs"] for cell in donor.incidence], dtype=float + ) + band = donor.cell(profit) + probability = np.where(landlord, shares[band], 0.0) + uniforms = stable_identity_uniforms( + person_ids, seed=spec.incidence_seed, salt=spec.incidence_salt + ) + has = landlord & (uniforms < probability) + + train = donor.analog.loc[ + donor.analog[FINANCE_COSTS_COLUMN] > 0.0, + [*spec.predictors, FINANCE_COSTS_COLUMN, "weight"], + ].reset_index(drop=True) + if train.empty: + raise PropertyComponentsError("no analog tape landlord has finance costs.") + fitted = RegimeGatedQRF(n_estimators=spec.n_estimators, seed=spec.amount_seed).fit( + train.astype(float), + list(spec.predictors), + [FINANCE_COSTS_COLUMN], + weights="weight", + ) + regime = str(fitted.regimes().get(FINANCE_COSTS_COLUMN, "")) + if regime != spec.expected_regime: + raise PropertyComponentsError( + f"the finance-cost model fitted regime {regime!r}, not the declared " + f"{spec.expected_regime!r}." + ) + if has.any(): + recipients = pd.DataFrame( + {PROFIT_AFTER_FINANCE_COSTS: profit[has], "age": np.asarray(age)[has]} + )[list(spec.predictors)].astype(float) + quantiles = stable_identity_uniforms( + np.asarray(person_ids)[has], seed=spec.amount_seed, salt=spec.amount_salt + ) + costs[has] = fitted.predict_positive_from_uniforms( + recipients, quantiles={FINANCE_COSTS_COLUMN: quantiles} + )[FINANCE_COSTS_COLUMN].to_numpy(dtype=float) + weights = np.asarray(weights, dtype=float) + realised = [] + for index, cell in enumerate(donor.incidence): + in_band = landlord & (band == index) + mass = float(weights[in_band].sum()) + realised.append( + { + "lower_bound": cell["lower_bound"], + "landlords": int(in_band.sum()), + "landlord_weight": mass, + "tape_share": cell["share_with_finance_costs"], + "realised_share": ( + float(weights[in_band & has].sum()) / mass if mass > 0.0 else None + ), + } + ) + receipt = { + "model": "regime_gated_qrf", + "regime": regime, + "predictors": list(spec.predictors), + "n_estimators": spec.n_estimators, + "training_rows": int(len(train)), + "incidence": {"seed": spec.incidence_seed, "salt": spec.incidence_salt}, + "amount": { + "seed": spec.amount_seed, + "salt": spec.amount_salt, + "draw": "predict_positive_from_uniforms at the person-keyed quantile", + }, + "recipients": int(landlord.sum()), + "recipient_weight": float(weights[landlord].sum()), + "drawn": int(has.sum()), + "drawn_weight": float(weights[has].sum()), + "finance_costs_gbp": float((costs * weights).sum()), + "incidence_by_profit_after_finance_costs": realised, + } + records = ( + FitWeightRecord( + f"{UK_PROPERTY_COMPONENTS_FIT_NAME}:{FINANCE_COSTS_COLUMN}", + fitted.weight_kind, + ), + ) + return FinanceCostImputation( + costs=costs, receipt=receipt, fit_weight_records=records + ) + + +# -------------------------------------------------------------------------- +# Receipts +# -------------------------------------------------------------------------- + + +def _walk_bands( + weights: np.ndarray, masses: Sequence[float], offset: float +) -> np.ndarray: + """Band index of each ranked person, highest band first. + + The CGT Table 3 walk's rule (``cgt_imputation._walk_bands``): a person + joins the band whose cumulative boundary first covers ``(1 - offset)`` of + their weight, with one systematic offset per walk, so no person splits + across bands and a band smaller than one person's weight still receives + that person on the share of walks its boundary implies. ``masses`` run + from the top band down; the last entry takes everyone left. + """ + + cumulative = np.cumsum(weights) + position = cumulative - (1.0 - offset) * weights + boundaries = np.cumsum(np.asarray(masses, dtype=float)) + band = np.searchsorted(boundaries, position, side="left") + return np.minimum(band, len(masses) - 1) + + +@dataclass(frozen=True) +class ReceiptsAllocation: + receipts: np.ndarray + receipt: Mapping[str, Any] + + +def allocate_property_rental_income( + *, + person_ids: np.ndarray, + profit: np.ndarray, + weights: np.ndarray, + facts: HMRCPropertyRentalFacts, + spec: ReceiptsAllocationSpec, +) -> ReceiptsAllocation: + """Receipts for every person with ``profit`` above zero (zero elsewhere). + + Ranked by profit (person id breaks ties), walked top band first into + Table 13's bands, each filled to its share of the individuals-basis + landlords times the landlords' weight here, linear within a bounded band + from its upper bound down, never below profit; the open top band takes + ``max(lower bound, k x profit)`` with ``k`` solved so that receipts per + landlord reach the individuals' Table 2 receipts per landlord. + """ + + profit = np.asarray(profit, dtype=float) + weights = np.asarray(weights, dtype=float) + ids = np.asarray(person_ids) + landlord = np.flatnonzero(profit > 0.0) + receipts = np.zeros(len(profit), dtype=float) + bands = facts.individuals_receipts_bands() + top_down = list(reversed(bands)) + if not len(landlord): + raise PropertyComponentsError("no landlord with profit above zero to allocate.") + order = landlord[np.lexsort((ids[landlord], -profit[landlord]))] + ranked_weights = weights[order] + landlord_weight = float(ranked_weights.sum()) + published_landlords = float(sum(band.landlords for band in bands)) + if not landlord_weight > 0.0 or not published_landlords > 0.0: + raise PropertyComponentsError("the walk needs positive landlord weight.") + # Each band's share of the published landlords, applied to this frame's. + share_scale = landlord_weight / published_landlords + offset = float(np.random.default_rng(spec.walk_seed).random()) + band_index = _walk_bands( + ranked_weights, + [band.landlords * share_scale for band in top_down[:-1]] + [np.inf], + offset, + ) + cells: list[dict[str, Any]] = [] + floored_weight = 0.0 + floored_rows = 0 + above_band_rows = 0 + bounded_receipts_at_published_counts = 0.0 + top_members = np.array([], dtype=int) + for index, band in enumerate(top_down): + members = order[band_index == index] + cell: dict[str, Any] = { + "lower_bound": band.lower_bound, + "upper_bound": band.upper_bound, + "published_landlords": band.landlords, + "target_landlords": band.landlords * share_scale, + "walk_landlords_weight": float(weights[members].sum()), + "walk_records": int(len(members)), + } + if band.upper_bound is None: + top_members = members + cells.append(cell) + continue + if len(members): + member_weights = weights[members] + mass = float(member_weights.sum()) + from_top = (np.cumsum(member_weights) - 0.5 * member_weights) / mass + linear = band.upper_bound - from_top * (band.upper_bound - band.lower_bound) + values = np.maximum(linear, profit[members]) + floored = profit[members] > linear + floored_rows += int(floored.sum()) + floored_weight += float(member_weights[floored].sum()) + above_band_rows += int((profit[members] > band.upper_bound).sum()) + receipts[members] = values + mean = float(np.average(values, weights=member_weights)) + else: + mean = 0.5 * (band.lower_bound + band.upper_bound) + cell["mean_receipts_gbp"] = mean + bounded_receipts_at_published_counts += mean * band.landlords + cells.append(cell) + + top = top_down[0] + target_total = float(facts.receipts["individual"]) + top_target_mean = (target_total - bounded_receipts_at_published_counts) / max( + top.landlords, 1.0 + ) + multiplier = 1.0 + if len(top_members): + top_weights = weights[top_members] + top_profit = profit[top_members] + + def mean_at(k: float) -> float: + return float( + np.average( + np.maximum(top.lower_bound, k * top_profit), weights=top_weights + ) + ) + + low, high = 1.0, spec.maximum_top_band_multiplier + if mean_at(low) >= top_target_mean: + multiplier = low + elif mean_at(high) <= top_target_mean: + multiplier = high + else: + for _ in range(_BISECTION_STEPS): + middle = 0.5 * (low + high) + if mean_at(middle) < top_target_mean: + low = middle + else: + high = middle + multiplier = 0.5 * (low + high) + receipts[top_members] = np.maximum(top.lower_bound, multiplier * top_profit) + cells[0]["mean_receipts_gbp"] = mean_at(multiplier) + cells[0]["target_mean_receipts_gbp"] = top_target_mean + cells[0]["profit_multiplier"] = multiplier + + expenses = receipts - np.where(profit > 0.0, profit, 0.0) + share = np.divide( + expenses, receipts, out=np.zeros_like(receipts), where=receipts > 0.0 + ) + on = profit > 0.0 + receipt = { + "population": "persons with profit from property other than sub-letting above zero", + "order": "profit descending, person_id ascending", + "walk": {"seed": spec.walk_seed, "offset": offset}, + "band_basis": ( + "PRIS 2024-25 Table 13 (all tax entities) x Table 1 individuals' " + "share of landlords" + ), + "band_mass_rule": ( + "each band's share of the individuals-basis landlords times the " + "landlords' weight here" + ), + "share_scale": share_scale, + "published_individual_landlords": published_landlords, + "individuals_landlord_share": facts.individuals_share("landlords"), + "bands_top_down": cells, + "rows_floored_at_profit": floored_rows, + "weight_floored_at_profit": floored_weight, + "rows_with_profit_above_their_band": above_band_rows, + "top_band_multiplier_bounds": [1.0, spec.maximum_top_band_multiplier], + "landlords": int(on.sum()), + "landlord_weight": float(weights[on].sum()), + "largest_landlord_weight": float(weights[on].max()), + "receipts_gbp": float((receipts * weights).sum()), + "profit_gbp": float((np.where(on, profit, 0.0) * weights).sum()), + "deductible_expenses_gbp": float((expenses * weights).sum()), + "published": { + "individuals_receipts_gbp": target_total, + "individuals_deductible_expenses_gbp": facts.individuals_deductible_expenses(), + "individuals_landlords": float(facts.landlords["individual"]), + }, + "expense_share_quantiles": _weighted_quantiles( + share[on], weights[on], (0.1, 0.25, 0.5, 0.75, 0.9) + ), + } + return ReceiptsAllocation(receipts=receipts, receipt=receipt) + + +# -------------------------------------------------------------------------- +# Stage transform +# -------------------------------------------------------------------------- + + +@dataclass +class UKPropertyComponentsResult: + frame: Frame + facts: Mapping[str, Any] + donor: Mapping[str, Any] + finance_costs: Mapping[str, Any] + receipts: Mapping[str, Any] + channels: Mapping[str, Any] + residuals: Mapping[str, Any] + coherence: Mapping[str, Any] + + def evidence(self) -> dict[str, object]: + return { + "stage": UK_PROPERTY_COMPONENTS_STAGE_NAME, + "facts": dict(self.facts), + "donor": dict(self.donor), + "finance_costs": dict(self.finance_costs), + "receipts": dict(self.receipts), + "channels": dict(self.channels), + "residuals": dict(self.residuals), + "coherence": dict(self.coherence), + } + + +@dataclass +class UKPropertyComponentsStageTransform: + """Whole-stage callable for landlords' receipts and finance costs.""" + + stage: SourceStageSpec + spi_tab_path: str | Path | None = None + #: The raw tape as read (tests and the synthetic fixture). + donor_table: pd.DataFrame | None = field(default=None, repr=False) + #: The income stage's donor age model; read from the vendored ONS + #: resource and the engine's State Pension age when not given. + age_model: SPIDonorAgeModel | None = field(default=None, repr=False) + #: The income stage's 2022-to-build-period factors for profit and finance + #: costs; derived from the engine's parameters when not given. + uprating_factors: Mapping[str, float] | None = None + facts: HMRCPropertyRentalFacts | None = field(default=None, repr=False) + last_result: UKPropertyComponentsResult | None = field(default=None, init=False) + last_fit_weight_records: tuple[FitWeightRecord, ...] | None = field( + default=None, init=False, repr=False + ) + + @property + def fit_weight_records(self) -> tuple[FitWeightRecord, ...]: + return tuple(self.last_fit_weight_records or ()) + + def _raw_tape(self) -> pd.DataFrame: + if self.donor_table is not None: + return self.donor_table.copy(deep=True) + if self.spi_tab_path is None: + raise PropertyComponentsError( + f"{UK_PROPERTY_COMPONENTS_STAGE_NAME} requires the caller-supplied " + "SPI 2022-23 tape." + ) + identity = verify_spi_donor_identity(self.spi_tab_path) + return pd.read_csv(identity.path, delimiter="\t") + + def __call__(self, frame: Frame) -> Frame: + validate_uk_national_frame(frame) + finance_spec = FinanceCostModelSpec.from_parameters( + _operation(self.stage, IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + ) + receipts_spec = ReceiptsAllocationSpec.from_parameters( + _operation(self.stage, ALLOCATE_PROPERTY_RENTAL_INCOME_KIND) + ) + verify = _operation(self.stage, VERIFY_VENDORED_FACT_RESOURCE_KIND) + if ( + verify.get("resource") != HMRC_PROPERTY_RENTAL_RESOURCE + or tuple(verify.get("record_sets", ())) != HMRC_PROPERTY_RENTAL_RECORD_SETS + ): + raise PropertyComponentsError( + f"verify_vendored_fact_resource must pin {HMRC_PROPERTY_RENTAL_RESOURCE} " + f"and its record sets {HMRC_PROPERTY_RENTAL_RECORD_SETS}." + ) + facts = self.facts or load_hmrc_property_rental_facts() + period = int(uk_time_period(frame)) + + person = frame.table("person").copy() + household = frame.table("household") + missing = sorted( + { + PROFIT_COLUMN, + FINANCE_COSTS_COLUMN, + HOUSEHOLD_HEAD_COLUMN, + SPI_RECIPIENT_ROLE_COLUMN, + support_channel_column("person"), + "age", + } + - set(person.columns) + ) + if missing: + raise PropertyComponentsError(f"the spine's person table lacks {missing}.") + weights = _person_weights(frame) + person_ids = person["person_id"].to_numpy() + tape_concept = _tape_concept_rows(person) + profit_in = pd.to_numeric(person[PROFIT_COLUMN], errors="coerce").to_numpy( + dtype=float + ) + costs_in = pd.to_numeric( + person[FINANCE_COSTS_COLUMN], errors="coerce" + ).to_numpy(dtype=float) + if not (np.isfinite(profit_in).all() and np.isfinite(costs_in).all()): + raise PropertyComponentsError( + "property income and finance costs must be finite." + ) + if (profit_in < 0.0).any() or (costs_in < 0.0).any(): + raise PropertyComponentsError( + "property income and finance costs must be non-negative." + ) + if (costs_in[~tape_concept] != 0.0).any(): + raise PropertyComponentsError( + "FRS-concept rows already carry finance costs; the income stage " + "draws them on the SPI channel only." + ) + sublet, rental = frs_concept_rental_profit(person, household) + sublet = np.where(tape_concept, 0.0, sublet) + rental = np.where(tape_concept, profit_in, rental) + + # Finance costs on the FRS concept, added back to profit. + if self.uprating_factors is None: + from microcosm.build.uk_runtime.spi_income import ( + _spi_income_uprating_factors, + ) + + factors, _ = _spi_income_uprating_factors(period) + else: + factors = dict(self.uprating_factors) + prepared = prepare_spi_donor_table( + self._raw_tape(), + seed=finance_spec.tape_preparation_seed, + age_model=( + load_spi_donor_age_model(period) + if self.age_model is None + else self.age_model + ), + ) + donor = spi_tape_finance_cost_donor( + prepared, uprating_factors=factors, spec=finance_spec + ) + frs_rental = np.where(tape_concept, 0.0, rental) + imputation = impute_frs_property_finance_costs( + donor, + person_ids=person_ids, + profit=frs_rental, + age=pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float), + weights=weights, + spec=finance_spec, + ) + added = np.where(tape_concept, 0.0, imputation.costs) + costs_out = costs_in + added + profit_out = profit_in + added + rental_out = rental + added + + # Receipts. + allocation = allocate_property_rental_income( + person_ids=person_ids, + profit=rental_out, + weights=weights, + facts=facts, + spec=receipts_spec, + ) + receipts = allocation.receipts + sublet + if (receipts + 1e-6 < profit_out).any(): + raise PropertyComponentsError("receipts fell below profit on some row.") + + person[PROFIT_COLUMN] = profit_out + person[FINANCE_COSTS_COLUMN] = costs_out + # Declared output order (the graph's cell order). + person[RECEIPTS_COLUMN] = receipts + + channel = person[support_channel_column("person")].astype(str).to_numpy() + channels = {} + for name in sorted(set(channel)): + rows = channel == name + on = rows & (profit_out > 0.0) + channels[name] = { + "landlords": int(on.sum()), + "landlord_weight": float(weights[on].sum()), + "profit_gbp": float((profit_out * weights)[rows].sum()), + "finance_costs_gbp": float((costs_out * weights)[rows].sum()), + "receipts_gbp": float((receipts * weights)[rows].sum()), + } + sublet_on = sublet > 0.0 + residuals = { + "sublet_receipts": { + "rows": int(sublet_on.sum()), + "weight": float(weights[sublet_on].sum()), + "gbp": float((sublet * weights).sum()), + "note": ( + "sub-letting rent stays in property_income with equal receipts " + "and no expenses until Rent a Room is released " + "(PolicyEngine/policyengine-uk#2002); the engine's receipts " + "concept excludes Rent a Room receipts" + ), + }, + "landlords_without_profit": ( + "FRS loss-makers (their loss counts as zero) and tape landlords " + "at zero profit carry no receipts; PRIS counts them" + ), + "frs_mortgage_capital": ( + "show card K6 also nets mortgage capital, which stays netted from " + "FRS profit" + ), + "finance_costs_brought_forward": ( + "property_finance_costs_brought_forward stays unset (single-year " + "data): the engine's s. 274AA carry-forward starts from nothing" + ), + } + coherence: dict[str, Any] = {} + if all(column in household for column in _RENTAL_PROPERTY_COLUMNS): + holds = ( + household[list(_RENTAL_PROPERTY_COLUMNS)] + .apply(pd.to_numeric, errors="coerce") + .fillna(0.0) + .sum(axis=1) + .to_numpy(dtype=float) + > 0.0 + ) + by_household = pd.Series(holds, index=household["household_id"].to_numpy()) + person_holds = by_household.reindex( + person["person_household_id"].to_numpy() + ).to_numpy(dtype=bool) + on = rental_out > 0.0 + coherence["landlord_weight_share_in_households_with_rental_property"] = ( + float(weights[on & person_holds].sum()) / float(weights[on].sum()) + if weights[on].sum() > 0.0 + else None + ) + result = uk_national_frame( + person=person, + benunit=frame.table("benunit").copy(), + household=household.copy(), + time_period=uk_time_period(frame), + weight_kind=uk_household_weight_kind(frame), + household_weights=np.asarray(frame.weights_for("household").values), + mass_log=( + *frame.mass_log, + uk_household_mass_conservation_receipt( + frame, UK_PROPERTY_COMPONENTS_MASS_CONSERVATION_REASON + ), + ), + ) + validate_uk_national_frame(result) + self.last_fit_weight_records = imputation.fit_weight_records + self.last_result = UKPropertyComponentsResult( + frame=result, + facts=facts.evidence(), + donor=donor.receipt, + finance_costs={ + **imputation.receipt, + "added_back_to": PROFIT_COLUMN, + "rows_added_back": int((added > 0.0).sum()), + }, + receipts={ + **allocation.receipt, + "rows_receipts_below_profit": int((receipts + 1e-6 < profit_out).sum()), + "sublet_receipts_gbp": float((sublet * weights).sum()), + "total_receipts_gbp": float((receipts * weights).sum()), + }, + channels=channels, + residuals=residuals, + coherence=coherence, + ) + return result + + @staticmethod + def output_columns() -> tuple[str, ...]: + return UK_PROPERTY_COMPONENTS_OUTPUT_COLUMNS + + def checkpoint_metadata(self) -> dict[str, object]: + if self.last_result is None: + return {} + return {"evidence": self.last_result.evidence()} diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/release_input_coverage.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/release_input_coverage.py index d3fd996d5..36ef09053 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/release_input_coverage.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/release_input_coverage.py @@ -30,6 +30,7 @@ from microcosm.build.gates import GateResult, input_column_coverage_gate from microcosm.build.uk_runtime.parity_reference import ( + load_efrs_engine_derived_exclusions, load_efrs_parity_known_gaps, load_efrs_parity_reference, ) @@ -1346,6 +1347,19 @@ def assert_uk_release_input_coverage_manifest_current( ) known_gaps = {gap.variable: gap for gap in load_efrs_parity_known_gaps()} + # Engine-derived exclusions (microcosm#1106) are a separate section of the + # same ledger: reference inputs the engine computes from persisted inputs, + # which the release must therefore not persist. They are never parity debt. + engine_derived = { + gap.variable: gap for gap in load_efrs_engine_derived_exclusions() + } + both = sorted(set(known_gaps) & set(engine_derived)) + if both: + failures.append( + "efrs_parity_known_gaps.json names column(s) both as a parity known " + f"gap and as an engine-derived exclusion: {both}." + ) + known_gaps = {**known_gaps, **engine_derived} gaps_outside_surface = sorted(set(known_gaps) - surface) if gaps_outside_surface: failures.append( diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py index 93289200b..ad43dba79 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py @@ -47,6 +47,7 @@ SPI_HMRC_TOTAL_INVESTMENT_INCOME_COLUMN, SPI_HMRC_UNEMPLOYMENT_BENEFIT_INCOME_COLUMN, SPI_INCOME_QRF_OUTPUT_COLUMNS, + SPI_PROPERTY_FINANCE_COSTS_COLUMN, SPI_SYNTHETIC_SUPPORT_CHANNEL, UKSPISupportResult, support_channel_column, @@ -103,6 +104,7 @@ "hmrc_spi_miscellaneous_employment_income": "employment_income_before_lsr", "hmrc_spi_other_income": "miscellaneous_income", "hmrc_spi_state_pension_income": None, + SPI_PROPERTY_FINANCE_COSTS_COLUMN: SPI_PROPERTY_FINANCE_COSTS_COLUMN, } SPI_DONOR_SHA256 = "5ef829461060c91a2a47be59ad541d9b519fc3976d66ca80d4920f711bb96f66" SPI_DONOR_SIZE_BYTES = 141_323_762 @@ -208,6 +210,10 @@ "OTHERINV", "GIFTAID", "GIFTINV", + # Restricted residential finance costs and the tax credits that carry + # their 20% relief (microcosm#1106). + "LLIR_RESTRICT_AMT_TOT", + "TAX_CRED", "TEI", "TII", "TI", @@ -227,6 +233,7 @@ **SPI_HMRC_EMPLOYED_INCOME_SOURCE_COLUMN_MAP, SPI_HMRC_OTHER_INCOME_COLUMN: ("OTHERINC",), SPI_HMRC_STATE_PENSION_INCOME_COLUMN: ("SRP",), + SPI_PROPERTY_FINANCE_COSTS_COLUMN: ("LLIR_RESTRICT_AMT_TOT",), } SPI_QRF_SOURCE_COLUMNS = { output: sources @@ -540,6 +547,7 @@ class UKSPIIncomeImputationResult: income_uprating: Mapping[str, object] | None = None band_donor_resample: Mapping[str, object] | None = None donor_age_draw: Mapping[str, object] | None = None + donor_property_finance_costs: Mapping[str, object] | None = None state_pension_age_guard: tuple[Mapping[str, object], ...] = () recipient_domain: Mapping[str, object] | None = None @@ -1009,6 +1017,7 @@ def impute_uk_spi_income_support( income_uprating=income_uprating, band_donor_resample=band_donor_receipt, donor_age_draw=donor_age_draw, + donor_property_finance_costs=donor_full.attrs.get("property_finance_costs"), state_pension_age_guard=tuple(guard_receipts), recipient_domain=recipient_domain, ) @@ -1478,6 +1487,7 @@ def _prepare_spi_donor( ), "cells": age_draw_receipt or [], } + donor.attrs["property_finance_costs"] = _check_spi_property_finance_costs(numeric) _require_finite_numeric( donor[["age", "FACT", *SPI_INCOME_QRF_OUTPUT_COLUMNS]], label="SPI 2022-23 derived donor", @@ -1510,6 +1520,46 @@ def _prepare_spi_donor( return donor +#: The tape's TAX_CRED carries the 20% basic-rate reduction on restricted +#: residential finance costs (ITTOIA 2005 s. 274A; 2022-23) together with the +#: other tax credits, so on landlords with restricted costs its median ratio +#: to LLIR_RESTRICT_AMT_TOT sits at the relief rate. The band refuses a tape +#: whose column means something else (microcosm#1106). +SPI_PROPERTY_FINANCE_COST_RELIEF_RATIO_BOUNDS = (0.195, 0.205) + + +def _check_spi_property_finance_costs(numeric: pd.DataFrame) -> dict[str, object]: + """Refuse a tape whose restricted finance costs do not carry 20% relief.""" + + costs = numeric["LLIR_RESTRICT_AMT_TOT"].to_numpy(dtype=np.float64) + credits = numeric["TAX_CRED"].to_numpy(dtype=np.float64) + weights = numeric["FACT"].to_numpy(dtype=np.float64) + if (costs < 0.0).any(): + raise ValueError("SPI 2022-23 LLIR_RESTRICT_AMT_TOT contains negative costs.") + restricted = costs > 0.0 + low, high = SPI_PROPERTY_FINANCE_COST_RELIEF_RATIO_BOUNDS + receipt: dict[str, object] = { + "column": "LLIR_RESTRICT_AMT_TOT", + "relief_column": "TAX_CRED", + "rows_with_restricted_costs": int(restricted.sum()), + "weighted_landlords_with_restricted_costs": float(weights[restricted].sum()), + "weighted_restricted_costs_gbp": float(np.dot(costs, weights)), + "median_relief_ratio_bounds": [low, high], + } + if not restricted.any(): + receipt["median_relief_ratio"] = None + return receipt + ratio = float(np.median(credits[restricted] / costs[restricted])) + receipt["median_relief_ratio"] = ratio + if not low <= ratio <= high: + raise ValueError( + "SPI 2022-23 TAX_CRED does not carry the 20% finance-cost relief on " + f"LLIR_RESTRICT_AMT_TOT: median ratio {ratio:.4f} outside " + f"[{low}, {high}]." + ) + return receipt + + def _validate_spi_source_leaf_reconciliation(numeric: pd.DataFrame) -> None: """Check Annex A leaf formulas within the pinned PUT anonymization envelope.""" diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py index 8c770ee31..c1ac147f2 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py @@ -171,6 +171,10 @@ "other_investment_income", "gift_aid", "charitable_investment_gifts", + # Restricted residential finance costs: the SPI channel's tape draw; the + # FRS channel starts at zero and property_components imputes its + # landlords (microcosm#1106). + "property_finance_costs", SPI_HMRC_EMPLOYMENT_BENEFITS_COLUMN, SPI_HMRC_EMPLOYMENT_EXPENSES_COLUMN, SPI_HMRC_OTHER_SOCIAL_SECURITY_INCOME_COLUMN, @@ -326,6 +330,9 @@ def evidence(self) -> dict[str, object]: "income_uprating": self.imputation.income_uprating, "band_donor_resample": self.imputation.band_donor_resample, "donor_age_draw": self.imputation.donor_age_draw, + "donor_property_finance_costs": ( + self.imputation.donor_property_finance_costs + ), "state_pension_age_guard": list(self.imputation.state_pension_age_guard), "targets": { "count": len(self.source_targets.targets), diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py index 6299ea52e..356ca012f 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_support.py @@ -107,6 +107,12 @@ SPI_HMRC_TOTAL_INVESTMENT_INCOME_COLUMN, HMRC_SPI_ASSESSABLE_INCOME_COLUMN, ) +#: Residential finance costs restricted by ITTOIA 2005 s. 272A: the tape's +#: LLIR_RESTRICT_AMT_TOT, "restricted land property finance cost (tax relief is +#: included in TAX_CRED)" (SPI Public Use Tape 2022-23 documentation). Drawn +#: last, so it conditions on every income leaf and leaves every earlier draw +#: where it was (microcosm#1106). +SPI_PROPERTY_FINANCE_COSTS_COLUMN = "property_finance_costs" SPI_INCOME_QRF_OUTPUT_COLUMNS = ( *( column @@ -114,6 +120,7 @@ if column != "employment_income" ), *SPI_HMRC_QRF_AUXILIARY_COLUMNS, + SPI_PROPERTY_FINANCE_COSTS_COLUMN, ) # The enhanced-FRS FRS-only stage uses these six income predictors. OTHERINV @@ -1283,6 +1290,7 @@ def _require_entity(entity: str) -> str: "SPI_INCOME_QRF_OUTPUT_COLUMNS", "SPI_PENSION_AGE_STRATUM_COLUMN", "SPI_PRIOR_MASS_CHANGE_REASON", + "SPI_PROPERTY_FINANCE_COSTS_COLUMN", "SPI_REPLACEMENT_STRATA_COLUMNS", "UKSPISupportResult", "UK_SPI_SUPPORT_STAGE_NAME", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py index 9c10a1ba2..2b4ff3397 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spine_build.py @@ -138,6 +138,9 @@ from microcosm.build.uk_runtime.pension_credit_take_up import ( UKPensionCreditTakeUpStageTransform, ) +from microcosm.build.uk_runtime.property_components import ( + UKPropertyComponentsStageTransform, +) from microcosm.build.uk_runtime.regional_uprating import ( UKRegionalPropertyUpratingStageTransform, ) @@ -1552,6 +1555,13 @@ def prepare_uk_spine_execution( stage=stages_by_name["regional_property_uprating"], ) ) + if "property_components" in stage_names: + implementations["property_components"] = _GraphSourceTransform( + lambda sources: UKPropertyComponentsStageTransform( + stage=stages_by_name["property_components"], + spi_tab_path=sources["spi"], + ) + ) if "lcfs_consumption" in stage_names: implementations["lcfs_consumption"] = _GraphSourceTransform( lambda sources: UKLCFSConsumptionStageTransform( @@ -1728,6 +1738,8 @@ def prepare_uk_spine_execution( graph_sources["etb"] = args.etb_tab if "spi_income_band_donors" in stage_names: graph_sources["spi"] = args.spi_tab + if "property_components" in stage_names: + graph_sources["spi"] = args.spi_tab if "hmrc_spi_income_spine" in stage_names: graph_sources["spi"] = args.spi_tab graph_sources["hmrc_income"] = args.hmrc_ods diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py index 2f2642bf1..3547e1843 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/stage_health.py @@ -79,6 +79,8 @@ def uk_stage_health_gate( return _bus_pricing_gate(stage, evidence, parameters) if check == "bus_support_pricing": return _bus_support_pricing_gate(stage, evidence, parameters) + if check == "property_components": + return _property_components_gate(stage, evidence, parameters) return GateResult( name="stage_health", passed=False, @@ -2736,3 +2738,87 @@ def _close(observed: object, value: float) -> bool: if failures else _pass(stage, check, details) ) + + +def _property_components_gate( + stage: str, + evidence: Mapping[str, object], + parameters: Mapping[str, object], +) -> GateResult: + """Landlords' receipts keep their invariants (microcosm#1106). + + No receipts below profit (the engine would read them as unknown). The + walk fills every Table 13 band above the lowest to its individuals-basis + count up to whole-person rounding: a band's mass sits within the declared + number of the largest landlord weight of its target, since each band + boundary is reached within one person. The open top band's profit + multiplier stays below its declared cap, so the band reaches the + individuals' receipts total rather than stopping at the cap. + """ + + check = "property_components" + receipts = _mapping(evidence.get("receipts"), label=f"{stage}.receipts") + failures: list[str] = [] + maximum_below = int(parameters["maximum_rows_receipts_below_profit"]) + below = int( + _finite_number( + receipts.get("rows_receipts_below_profit"), + label=f"{stage}.receipts.rows_receipts_below_profit", + ) + ) + if below > maximum_below: + failures.append( + f"{stage}: {below} rows carry receipts below profit " + f"(allowed {maximum_below})." + ) + factor = _finite_number( + parameters["maximum_band_error_in_landlord_weights"], + label=f"{stage}.maximum_band_error_in_landlord_weights", + ) + largest = _finite_number( + receipts.get("largest_landlord_weight"), + label=f"{stage}.receipts.largest_landlord_weight", + ) + bands = receipts.get("bands_top_down") + if not isinstance(bands, list) or not bands: + raise ValueError(f"{stage}.receipts.bands_top_down must be a non-empty list.") + errors = [] + for band in bands[:-1]: + band = _mapping(band, label=f"{stage}.receipts.bands_top_down[]") + target = _finite_number( + band.get("target_landlords"), label=f"{stage} band target" + ) + walked = _finite_number( + band.get("walk_landlords_weight"), label=f"{stage} band mass" + ) + error = abs(walked - target) + errors.append({"lower_bound": band.get("lower_bound"), "error_weight": error}) + if error > factor * largest: + failures.append( + f"{stage}: the band from {band.get('lower_bound')} holds " + f"{walked:.1f} landlords against {target:.1f}, beyond " + f"{factor} x the largest landlord weight {largest:.1f}." + ) + top = _mapping(bands[0], label=f"{stage}.receipts.bands_top_down[0]") + multiplier = _finite_number( + top.get("profit_multiplier"), label=f"{stage} top-band multiplier" + ) + bounds = receipts.get("top_band_multiplier_bounds") + if not isinstance(bounds, list) or len(bounds) != 2: + raise ValueError(f"{stage}.receipts.top_band_multiplier_bounds must be a pair.") + cap = _finite_number(bounds[1], label=f"{stage} top-band multiplier cap") + if multiplier >= cap: + failures.append( + f"{stage}: the top band's profit multiplier {multiplier} reached its " + f"cap {cap}; the receipts total is out of reach." + ) + details = { + "rows_receipts_below_profit": below, + "largest_landlord_weight": largest, + "band_errors": errors, + "top_band_multiplier": multiplier, + "top_band_multiplier_cap": cap, + } + if failures: + return _fail(stage, check, failures, details) + return _pass(stage, check, details) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py index 6920503b2..1c4bf81c8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py @@ -278,6 +278,8 @@ def __post_init__(self) -> None: "person.pension_contributions_via_salary_sacrifice", "person.pip_dl_category", "person.pip_m_category", + "person.property_finance_costs", + "person.property_rental_income", "person.receives_benefits_in_own_right", "person.rent_paid_as_boarder", "person.rent_paid_as_lodger", @@ -362,6 +364,12 @@ def __post_init__(self) -> None: "The enhanced FRS stores this legacy reported-benefit input as an " "all-zero layer; the candidate must drop dead zero layers." ), + "household.property_wealth": ( + "policyengine-uk derives property_wealth from main_residence_value, " + "other_residential_property_value and non_residential_property_value; " + "a persisted copy overrides that sum and has no uprating index, so the " + "candidate must drop it (microcosm#1106, the uk-data#543 defect)." + ), } _STRUCTURAL_COLUMNS: Mapping[str, frozenset[str]] = { diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py index 0b4056e23..65f5dcc0a 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/worker_identity.py @@ -28,7 +28,7 @@ PRIMARY_QRF_WORKER_MODULE = "microcosm.build.us_runtime.puf_qrf_worker" PRIMARY_QRF_INTERPRETER_PLACEHOLDER = "{python_interpreter}" APPROVED_UV_LOCK_SHA256 = ( - "f65a01fbc933b096db31513760efd6ab9f302b32433bb185427cd71c0ea9150e" + "a2945a10d922de69a87a058ef3e8f0cd60291cca84a9323955a49bba22eb484d" ) LEGACY_CAMPAIGN_UV_LOCK_SHA256 = ( "27f47e385cfa35e2644a37410d1804b361ad9aee123577551c8421547bda65ee" diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_property_wealth_engine_derived.py b/packages/microcosm-build/tests/engine/uk/test_uk_property_wealth_engine_derived.py new file mode 100644 index 000000000..34bdb11f6 --- /dev/null +++ b/packages/microcosm-build/tests/engine/uk/test_uk_property_wealth_engine_derived.py @@ -0,0 +1,125 @@ +"""The engine derives ``property_wealth`` at every engine boundary (microcosm#1106). + +policyengine-uk defines ``property_wealth`` as ``residential_property_value`` +(``main_residence_value`` + ``other_residential_property_value``) plus +``non_residential_property_value``. A persisted copy overrides that sum, and +the variable has no uprating index, so a saved WAS total would stay at its +base-year level while its components uprate. The release export and the +calibration resolver's scratch H5 both drop it (the uk-data#543 defect). +""" + +from __future__ import annotations + +import numpy as np +import pandas as pd + +from microcosm.build.uk_runtime.measure_simulation import UKMeasureResolver +from microcosm.build.uk_runtime.national_frame import ( + uk_national_frame, + uk_release_export_frame, + write_uk_national_frame, +) +from microcosm.frame import WeightKind + +COMPONENTS = ( + "main_residence_value", + "other_residential_property_value", + "non_residential_property_value", +) + + +def _frame(): + ids = np.arange(3, dtype=np.int64) + return uk_national_frame( + person=pd.DataFrame( + { + "person_id": ids, + "person_benunit_id": ids, + "person_household_id": ids, + "age": [40, 50, 60], + } + ), + benunit=pd.DataFrame({"benunit_id": ids}), + household=pd.DataFrame( + { + "household_id": ids, + "household_weight": [1.0, 1.0, 1.0], + "region": "LONDON", + "council_tax": 0.0, + "rent": 0.0, + "tenure_type": "OWNED_OUTRIGHT", + "main_residence_value": [300_000.0, 0.0, 250_000.0], + "other_residential_property_value": [150_000.0, 0.0, 0.0], + "non_residential_property_value": [0.0, 20_000.0, 0.0], + "owned_land": [10_000.0, 0.0, 0.0], + # The WAS identity adds owned land and the remainder too. + "property_wealth": [500_000.0, 20_000.0, 260_000.0], + } + ), + time_period="2024", + weight_kind=WeightKind.DESIGN, + ) + + +def _calculate(simulation, variable: str, year: int) -> np.ndarray: + return np.asarray(simulation.calculate(variable, year), dtype=float) + + +def _component_sum(simulation, year: int) -> np.ndarray: + return sum(_calculate(simulation, name, year) for name in COMPONENTS) + + +def test_calibration_engine_derives_property_wealth_from_its_components(tmp_path): + frame = _frame() + household = frame.table("household") + persisted_sum = sum(household[name].to_numpy(dtype=float) for name in COMPONENTS) + + resolver = UKMeasureResolver( + simulation_source=None, frame=frame, scratch_dir=tmp_path, year=2025 + ) + + for year in (2024, 2025): + derived = _calculate(resolver.simulation, "property_wealth", year) + np.testing.assert_allclose(derived, _component_sum(resolver.simulation, year)) + main_residence = _calculate(resolver.simulation, "main_residence_value", year) + assert (derived >= main_residence).all() + np.testing.assert_allclose( + _calculate(resolver.simulation, "property_wealth", 2024), persisted_sum + ) + # The components uprate, so the derived total grows into 2025. + grown = _calculate(resolver.simulation, "property_wealth", 2025) + assert (grown[persisted_sum > 0] > persisted_sum[persisted_sum > 0]).all() + # The resolver's own frame keeps the WAS total for frame-column measures. + assert "property_wealth" in resolver.frame.table("household").columns + assert resolver.receipt()["engine_scratch_dropped_columns"] == ["property_wealth"] + + +def test_a_persisted_total_would_override_the_engine_sum(tmp_path): + """The mutation check: what the drop prevents, and that the drop cures it.""" + + import policyengine_uk + from policyengine_uk.data import UKSingleYearDataset + + frame = _frame() + saved = frame.table("household")["property_wealth"].to_numpy(dtype=float) + + with_total = write_uk_national_frame(frame, tmp_path / "with-total.h5") + simulation = policyengine_uk.Microsimulation( + dataset=UKSingleYearDataset(file_path=with_total) + ) + np.testing.assert_allclose(_calculate(simulation, "property_wealth", 2024), saved) + assert not np.allclose( + _calculate(simulation, "property_wealth", 2024), + _component_sum(simulation, 2024), + ) + + released = write_uk_national_frame( + uk_release_export_frame(frame), tmp_path / "release.h5" + ) + simulation = policyengine_uk.Microsimulation( + dataset=UKSingleYearDataset(file_path=released) + ) + np.testing.assert_allclose( + _calculate(simulation, "property_wealth", 2024), + _component_sum(simulation, 2024), + ) diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_release_input_coverage.py b/packages/microcosm-build/tests/engine/uk/test_uk_release_input_coverage.py index 67fe34579..133dc56c6 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_release_input_coverage.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_release_input_coverage.py @@ -437,11 +437,18 @@ def test_shipped_manifest_is_current(self) -> None: assert_uk_release_input_coverage_manifest_current( engine=_StubEngine({}, set(manifest.declared_columns)) ) - assert manifest.required_columns == frozenset( - load_efrs_parity_reference().populated_layers - ) - assert manifest.reviewed_exclusions == {} + # microcosm#1106: property_wealth is formula-owned in policyengine-uk, + # so the release leaves it to the engine; it is an engine-derived + # exclusion, not parity debt, and its components stay required. + assert manifest.required_columns == ( + frozenset(load_efrs_parity_reference().populated_layers) + - {"property_wealth"} + ) + assert set(manifest.reviewed_exclusions) == {"property_wealth"} assert load_efrs_parity_known_gaps() == () + assert [gap.variable for gap in load_efrs_engine_derived_exclusions()] == [ + "property_wealth" + ] assert manifest.required_build_stages == frozenset( { "frs_hmrc_spine_leaves", @@ -459,6 +466,7 @@ def test_shipped_manifest_is_current(self) -> None: "was_wealth", "was_lisa", "regional_property_uprating", + "property_components", "nts_bus_travel", "lcfs_consumption", "etb_vat", @@ -770,7 +778,15 @@ def test_formula_owned_persisted_overrides_are_hard_covered(self) -> None: reference["engine"]["formula_owned_persisted_overrides_included"] ) assert len(overrides) == 13 - assert overrides <= set(manifest.required_columns) + # The one exception is declared: property_wealth, whose persisted copy + # overrides the engine's component sum and is never uprated, so the + # release leaves it to the formula (microcosm#1106). Every other + # formula-owned override stays required. + engine_derived = {gap.variable for gap in load_efrs_engine_derived_exclusions()} + assert engine_derived == {"property_wealth"} + assert engine_derived <= overrides + assert overrides - engine_derived <= set(manifest.required_columns) + assert engine_derived.isdisjoint(manifest.required_columns) def test_live_uk_adapter_recognises_loader_aliases(self) -> None: engine = PolicyEngineUKCoverageEngine() diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py b/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py index 33d31fe46..c8e61e6bf 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py @@ -574,6 +574,12 @@ def test_spi_uprating_uses_actual_engine_indices_and_explicit_nominal_holdouts() "obr.average_earnings", target.obr.average_earnings / source.obr.average_earnings, ), + # Restricted residential finance costs move with mortgage interest, + # the index the engine gives the variable (microcosm#1106). + "property_finance_costs": ( + "obr.mortgage_interest", + target.obr.mortgage_interest / source.obr.mortgage_interest, + ), } expected["property_income"] = expected["dividend_income"] expected["miscellaneous_income"] = expected["dividend_income"] diff --git a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py index 1125834a1..cf1cab7f7 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_country_spec.py @@ -930,6 +930,7 @@ def test_spi_spine_adds_no_country_package_resources(self) -> None: "calibration_measure_exclusions.json", "hmrc_cgt_conditioning_facts.json", "hmrc_cgt_asset_type_facts.json", + "hmrc_property_rental_income_facts.json", "hmrc_itl_taxpayer_counts.json", "hmrc_uprating_engine_pins.json", "advani_summers_capital_gains_distribution.json", @@ -1014,8 +1015,9 @@ def test_uk_source_manifest_contains_only_canonical_spine_stages(self) -> None: # (microcosm#1069) and child_benefit_take_up (microcosm#1063) as the # newest); the frs_hmrc_retained_leaves / hmrc_spi_income pair is # retired (#901). - # microcosm#1063 also adds cgt_residential_split after the anchor. - assert len(spec.sources.stages) == 39 + # microcosm#1063 also adds cgt_residential_split after the anchor, and + # microcosm#1106 property_components after the regional uprating. + assert len(spec.sources.stages) == 40 assert not {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.intersection( stage.stage for stage in spec.sources.stages ) @@ -1055,6 +1057,7 @@ def test_uk_package_loads(self) -> None: "calibration_measure_exclusions.json", "hmrc_cgt_conditioning_facts.json", "hmrc_cgt_asset_type_facts.json", + "hmrc_property_rental_income_facts.json", "hmrc_itl_taxpayer_counts.json", "hmrc_uprating_engine_pins.json", "advani_summers_capital_gains_distribution.json", @@ -1132,7 +1135,7 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: references = {reference.name: reference for reference in spec.target_references} assert ( - len(references) == 1231 + len(references) == 1244 ) # PolicyEngine/chronicle#280 lane: 705 + 33 HMRC liabilities rows (Table 2.5, three # measures by eleven bands) + 26 SPI savings-interest rows (two measures by # thirteen bands) + 360 SPI Table 3.11 region-tier rows (three measures by @@ -1151,7 +1154,9 @@ def test_uk_target_references_accept_regenerated_contract_fields(self) -> None: # total (the Table 3.8 rows and the DWP employee total left the fit); two # Attendance Allowance and three pension-age Housing Benefit rows; the # income-tax relief total on salary sacrifice in place of the amount row; - # microcosm#1095: Great Britain pension-age Housing Benefit spending + # microcosm#1095: Great Britain pension-age Housing Benefit spending; + # microcosm#1106: the 13 SPI Table 3.7 net property-income amounts by + # total-income band, bound unscaled once the x1.9 exclusion retired assert references["obr.esa"].value_operation == "calendar_year_window" assert references["dwp.uc.households"].value_operation == ( "monthly_window_sum_average" @@ -1387,6 +1392,7 @@ def test_declares_the_full_june_battery(self, manifest) -> None: "uk_stage_was_wealth_support", "uk_stage_was_wealth_coherence", "uk_stage_was_lisa_support", + "uk_stage_property_components", "uk_stage_nts_bus_travel_support", "uk_stage_nts_bus_travel_facts", "uk_stage_uc_deduction_attributes", @@ -1494,6 +1500,7 @@ def test_strict_absent_evidence_entries_are_declared(self, manifest) -> None: "uk_stage_was_wealth_support", "uk_stage_was_wealth_coherence", "uk_stage_was_lisa_support", + "uk_stage_property_components", "uk_stage_nts_bus_travel_support", "uk_stage_nts_bus_travel_facts", "uk_stage_uc_deduction_attributes", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py index 9c12fdf3a..1da7b5b76 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_battery_bindings.py @@ -579,10 +579,15 @@ def test_only_export_dropped_columns_are_read_from_the_spine(self) -> None: spine_person = spine.table("person").copy() spine_person["sic_industry_division"] = [1.0, 2.0, 3.0, 4.0] spine_person[UK_INTERNAL_DISABILITY_REPORTED_COLUMNS[0]] = 0.0 + # microcosm#1106: the WAS property_wealth total is the first household + # column the export drops; the was_wealth stage declares it + # non-negative, so the certifier reads it from the spine. + spine_household = spine.table("household").copy() + spine_household["property_wealth"] = [5.0, 0.0, 7.0, 0.0] spine = uk_national_frame( person=spine_person, benunit=spine.table("benunit"), - household=spine.table("household"), + household=spine_household, time_period="2023", household_weights=spine.weights_for("household").values, ) @@ -591,6 +596,7 @@ def test_only_export_dropped_columns_are_read_from_the_spine(self) -> None: [ "salary_sacrifice_pre_conversion_pay", UK_INTERNAL_DISABILITY_REPORTED_COLUMNS[0], + "property_wealth", "sic_industry_division", "never_declared", ], @@ -600,7 +606,9 @@ def test_only_export_dropped_columns_are_read_from_the_spine(self) -> None: assert set(found) == { "salary_sacrifice_pre_conversion_pay", UK_INTERNAL_DISABILITY_REPORTED_COLUMNS[0], + "property_wealth", } + assert found["property_wealth"].tolist() == [5.0, 0.0, 7.0, 0.0] assert found["salary_sacrifice_pre_conversion_pay"].tolist() == [ 0.0, 30.0, @@ -1087,6 +1095,68 @@ def test_terminal_mode_threads_frame_engine_and_manifest(self) -> None: assert result.failures == direct.failures assert dict(result.details) == dict(direct.details) + def test_terminal_mode_reads_the_frame_the_release_writes(self) -> None: + # microcosm#1106: the full build's terminal gates hold the raw + # calibrated frame, which still carries the WAS property_wealth total + # the release export drops. A reviewed exclusion that the raw frame + # still populates reads as stale; the binding reads the export frame. + person, benunit, household = _tables() + household["main_residence_value"] = [300_000.0, 0.0, 150_000.0, 0.0] + household["property_wealth"] = [350_000.0, 0.0, 160_000.0, 0.0] + frame = uk_national_frame( + person=person, benunit=benunit, household=household, time_period="2023" + ) + + class Engine(_TerminalCoverageEngine): + def variables(self): + return [ + "employment_income", + "main_residence_value", + "property_wealth", + ] + + def variable_entities(self, names): + return { + name: "person" if name == "employment_income" else "household" + for name in names + } + + engine = Engine() + manifest = UKReleaseInputCoverageManifest( + reference={"source": "test"}, + candidate_evidence={"source": "test"}, + columns=( + UKReleaseInputColumn("employment_income", "required"), + UKReleaseInputColumn("main_residence_value", "required"), + UKReleaseInputColumn( + "property_wealth", + "reviewed_exclusion", + reason="formula-owned in policyengine-uk", + tracking_note="microcosm#1106", + ), + ), + family_coverage={}, + ) + raw = uk_release_input_coverage_gate( + _uk_gate_surface(frame), engine, manifest=manifest + ) + result = UK_GATE_REGISTRY["release_input_coverage"].evaluate( + EvidenceContext( + frame=frame, + artifacts={ + "coverage_engine": engine, + "coverage_manifest": manifest, + # The spine build state the family half reads (#1115). + "spine_frame": frame, + }, + ), + {}, + ) + + assert raw.passed is False + assert any("property_wealth" in failure for failure in raw.failures) + assert result.passed is True, result.failures + class TestPreflightBindings: def test_preflight_passes_with_the_committed_manifest(self, uk_gates) -> None: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py index 76949264c..e4fda573e 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py @@ -49,9 +49,10 @@ def test_uk_spine_graph_contains_every_manifest_stage() -> None: # pension_credit_take_up and the microcosm#1063 child_benefit_take_up; the # frs_hmrc_retained_leaves / hmrc_spi_income certified-pair alternatives # are retired (#901), so the manifest roster is the graph roster. - # microcosm#1063 also adds cgt_residential_split after the anchor, and - # microcosm#1095 the spi_benefit_coherence pass after uc_reporter_redraw. - assert len(expected) == 39 + # microcosm#1063 also adds cgt_residential_split after the anchor, + # microcosm#1095 the spi_benefit_coherence pass after uc_reporter_redraw, + # and microcosm#1106 property_components after the regional uprating. + assert len(expected) == 40 assert {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.isdisjoint(expected) assert set(expected) <= ids assert {"frs_hmrc_retained_leaves", "hmrc_spi_income"}.isdisjoint(ids) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py index 197e7af48..bd9aea385 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_measure_simulation.py @@ -875,6 +875,8 @@ def __init__(self, *, dataset): assert direct.receipt()["mode"] == "direct_h5" assert direct.receipt()["policyengine_uk_version"] == "9.9.9" assert scratch.receipt()["mode"] == "scratch_frame_export" + # A frame carrying no export-dropped column is written as it is. + assert "engine_scratch_dropped_columns" not in scratch.receipt() assert writes == [(frame, tmp_path / "simulation-input.h5")] assert created == [ str(tmp_path / "input.h5"), @@ -882,6 +884,80 @@ def __init__(self, *, dataset): ] +def test_scratch_engine_input_leaves_property_wealth_to_the_engine( + monkeypatch, tmp_path: Path +): + """microcosm#1106: a persisted ``property_wealth`` overrides the engine's + sum of the three property components and is never uprated, so the scratch + H5 the calibration engine loads drops it, as the release export does. The + resolver's own frame keeps it, and the receipt names what was left out.""" + + from microcosm.build.uk_runtime.national_frame import uk_national_frame + + class FakeMicrosimulation: + def __init__(self, *, dataset): + self.tax_benefit_system = SimpleNamespace(variables={}) + + monkeypatch.setitem( + sys.modules, + "policyengine_uk", + SimpleNamespace(__version__="9.9.9", Microsimulation=FakeMicrosimulation), + ) + writes = [] + monkeypatch.setattr( + measure_simulation, + "write_uk_national_frame", + lambda frame, path: writes.append(frame) or path, + ) + components = ( + "main_residence_value", + "other_residential_property_value", + "non_residential_property_value", + ) + frame = uk_national_frame( + person=pd.DataFrame( + { + "person_id": [1, 2], + "person_benunit_id": [1, 2], + "person_household_id": [1, 2], + "age": [40, 50], + } + ), + benunit=pd.DataFrame({"benunit_id": [1, 2]}), + household=pd.DataFrame( + { + "household_id": [1, 2], + "main_residence_value": [300_000.0, 0.0], + "other_residential_property_value": [150_000.0, 0.0], + "non_residential_property_value": [0.0, 20_000.0], + # The WAS total also counts owned land and the remainder. + "property_wealth": [480_000.0, 20_000.0], + } + ), + time_period="2024", + household_weights=np.asarray([1.0, 1.0]), + ) + + resolver = UKMeasureResolver( + simulation_source=None, + scratch_dir=tmp_path, + year=2025, + frame=frame, + ) + + (written,) = writes + household = written.table("household") + assert "property_wealth" not in household.columns + for component in components: + assert household[component].tolist() == ( + frame.table("household")[component].tolist() + ) + assert written.weights_for("household").values.tolist() == [1.0, 1.0] + assert resolver.frame is frame + assert "property_wealth" in resolver.frame.table("household").columns + assert resolver.receipt()["engine_scratch_dropped_columns"] == ["property_wealth"] + + def _resolver_over(sim, monkeypatch, tmp_path: Path) -> UKMeasureResolver: monkeypatch.setitem( sys.modules, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py index 42116254d..ca91d06ce 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_national_calibration.py @@ -53,7 +53,7 @@ from microcosm.calibrate.artifacts import decode_problem from microcosm.frame import EntitySchema, Frame, MassChange, WeightKind, Weights -ACTIVE_REFERENCE_COUNT = 1231 +ACTIVE_REFERENCE_COUNT = 1244 def _uc_reference(**overrides) -> LedgerTargetReference: diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py new file mode 100644 index 000000000..6e5a24f30 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py @@ -0,0 +1,473 @@ +"""Landlords' receipts and finance costs on the UK spine (microcosm#1106).""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build import load_country_spec +from microcosm.build.uk_runtime.hmrc_property_rental import ( + HMRC_PROPERTY_RENTAL_EXPENSE_TYPES, + HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS, + HMRCPropertyRentalBand, + HMRCPropertyRentalFacts, +) +from microcosm.build.uk_runtime.property_components import ( + ALLOCATE_PROPERTY_RENTAL_INCOME_KIND, + IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND, + UK_PROPERTY_COMPONENTS_OUTPUT_COLUMNS, + UK_PROPERTY_COMPONENTS_REWRITE_COLUMNS, + UK_PROPERTY_COMPONENTS_STAGE_NAME, + FinanceCostModelSpec, + PropertyComponentsError, + ReceiptsAllocationSpec, + _incidence_edges, + allocate_property_rental_income, + frs_concept_rental_profit, + impute_frs_property_finance_costs, + spi_tape_finance_cost_donor, +) + +#: PRIS 2024-25 Table 13 counts (thousands, all tax entities). +_BAND_COUNTS = (1300, 860, 330, 150, 80, 50, 30, 20, 10, 10, 40) + + +def _stage(): + spec = load_country_spec("uk") + assert spec.sources is not None + return {stage.stage: stage for stage in spec.sources.stages}[ + UK_PROPERTY_COMPONENTS_STAGE_NAME + ] + + +def _parameters(kind: str) -> dict: + (operation,) = [op for op in _stage().operations if op.kind == kind] + return dict(operation.parameters) + + +def _facts(*, landlords: float, receipts: float) -> HMRCPropertyRentalFacts: + bounds = HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS + total = float(sum(_BAND_COUNTS)) + all_landlords = landlords / 0.99 + return HMRCPropertyRentalFacts( + tax_year=2024, + landlords={ + "individual": landlords, + "partnership": all_landlords - landlords, + "all": all_landlords, + }, + receipts={"individual": receipts, "partnership": 0.0, "all": receipts}, + expenses={ + "individual": 0.6 * receipts, + "partnership": 0.0, + "all": 0.6 * receipts, + }, + expenses_by_type={ + kind: 0.6 * receipts / len(HMRC_PROPERTY_RENTAL_EXPENSE_TYPES) + for kind in HMRC_PROPERTY_RENTAL_EXPENSE_TYPES + }, + expense_landlords_by_type={}, + receipts_bands=tuple( + HMRCPropertyRentalBand( + lower, + bounds[index + 1] if index + 1 < len(bounds) else None, + all_landlords * count / total, + ) + for index, (lower, count) in enumerate( + zip(bounds, _BAND_COUNTS, strict=True) + ) + ), + resource_sha256="test", + ) + + +def _landlords( + n: int = 3_000, seed: int = 7 +) -> tuple[np.ndarray, np.ndarray, np.ndarray]: + rng = np.random.default_rng(seed) + profit = np.exp(rng.normal(np.log(6_000.0), 1.0, n)) + profit[: n // 10] = 0.0 + weights = rng.uniform(500.0, 1_500.0, n) + ids = np.arange(1, n + 1) * 101 + return ids, profit, weights + + +class TestDeclaredParameters: + def test_the_stage_declares_the_runtime_constants(self) -> None: + stage = _stage() + assert tuple(stage.outputs) == UK_PROPERTY_COMPONENTS_OUTPUT_COLUMNS + assert tuple(stage.rewrites) == UK_PROPERTY_COMPONENTS_REWRITE_COLUMNS + finance = FinanceCostModelSpec.from_parameters( + _parameters(IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + ) + receipts = ReceiptsAllocationSpec.from_parameters( + _parameters(ALLOCATE_PROPERTY_RENTAL_INCOME_KIND) + ) + assert finance.tape_preparation_seed == 42 + assert finance.predictors == ("profit_after_finance_costs", "age") + assert ( + receipts.band_lower_bounds + == HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS + ) + + def test_the_tape_seed_is_the_income_stages_stage_1_seed(self) -> None: + spec = load_country_spec("uk") + assert spec.sources is not None + (income,) = [ + stage + for stage in spec.sources.stages + if stage.stage == "hmrc_spi_income_spine" + ] + (read,) = [ + op for op in income.operations if op.kind == "strict_read_private_table" + ] + assert ( + read.parameters["seed"] + == FinanceCostModelSpec.from_parameters( + _parameters(IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + ).tape_preparation_seed + ) + + @pytest.mark.parametrize( + ("key", "value"), + [ + ("income_uprating_variables", {"property_income": "property_income"}), + ("donor_income_period", 2023), + ("tape_preparation_seed", 7), + ("amount_salt", "property_components:has_finance_costs"), + ("add_back_to", "property_rental_income"), + ], + ) + def test_a_drifted_finance_cost_declaration_is_refused(self, key, value) -> None: + parameters = _parameters(IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + parameters[key] = value + with pytest.raises(PropertyComponentsError): + FinanceCostModelSpec.from_parameters(parameters) + + def test_receipts_bands_must_be_table_13s(self) -> None: + parameters = _parameters(ALLOCATE_PROPERTY_RENTAL_INCOME_KIND) + parameters["band_lower_bounds"] = [0, 10_000, 100_000] + with pytest.raises(PropertyComponentsError, match="Table 13"): + ReceiptsAllocationSpec.from_parameters(parameters) + + +class TestFRSConcept: + def test_the_reference_persons_sublet_rent_leaves_the_rental_profit(self) -> None: + person = pd.DataFrame( + { + "person_household_id": [1, 1, 2, 3], + "is_household_head": [True, False, True, True], + "property_income": [5_000.0, 2_000.0, 0.0, 800.0], + } + ) + household = pd.DataFrame( + {"household_id": [1, 2, 3], "subrent": [1_200.0, 0.0, 800.0]} + ) + sublet, rental = frs_concept_rental_profit(person, household) + np.testing.assert_allclose(sublet, [1_200.0, 0.0, 0.0, 800.0]) + np.testing.assert_allclose(rental, [3_800.0, 2_000.0, 0.0, 0.0]) + + +class TestTapeDonor: + def _prepared(self) -> pd.DataFrame: + rng = np.random.default_rng(3) + n = 4_000 + profit = np.exp(rng.normal(np.log(8_000.0), 0.9, n)) + profit[:400] = 0.0 + costs = np.where(rng.random(n) < 0.4, 0.5 * profit * rng.random(n), 0.0) + return pd.DataFrame( + { + "property_income": profit, + "property_finance_costs": costs, + "age": rng.uniform(25, 85, n), + "FACT": rng.uniform(50, 150, n), + } + ) + + def test_the_analog_landlords_are_rebased_and_keep_a_profit_after_costs( + self, + ) -> None: + prepared = self._prepared() + spec = FinanceCostModelSpec.from_parameters( + _parameters(IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + ) + factors = {"property_income": 1.1, "property_finance_costs": 1.9} + donor = spi_tape_finance_cost_donor( + prepared, uprating_factors=factors, spec=spec + ) + profit = prepared["property_income"].to_numpy() * 1.1 + costs = prepared["property_finance_costs"].to_numpy() * 1.9 + analog = (profit > 0) & (profit - costs > 0) + assert len(donor.analog) == int(analog.sum()) + np.testing.assert_allclose( + np.sort(donor.analog["profit_after_finance_costs"].to_numpy()), + np.sort((profit - costs)[analog]), + ) + assert len(donor.incidence) == len(donor.edges) + 1 <= spec.incidence_cells + assert all(cell["tape_weight"] > 0 for cell in donor.incidence) + # The cells' shares reproduce the analog landlords' overall share. + mass = sum(cell["tape_weight"] for cell in donor.incidence) + share = ( + sum( + cell["tape_weight"] * cell["share_with_finance_costs"] + for cell in donor.incidence + ) + / mass + ) + weight = prepared["FACT"].to_numpy()[analog] + assert share == pytest.approx( + weight[costs[analog] > 0].sum() / weight.sum(), rel=1e-12 + ) + + def test_incidence_edges_never_leave_a_cell_empty(self) -> None: + values = np.array([0.0, 0.0, 0.0, 0.0, 5.0, 5.0, 9.0]) + weights = np.ones_like(values) + edges = _incidence_edges(values, weights, 10) + cells = np.searchsorted(edges, values, side="right") + assert set(cells) == set(range(len(edges) + 1)) + + +class TestFinanceCostDraw: + def _donor(self): + prepared = TestTapeDonor()._prepared() + spec = FinanceCostModelSpec.from_parameters( + _parameters(IMPUTE_FRS_PROPERTY_FINANCE_COSTS_KIND) + ) + factors = {"property_income": 1.0, "property_finance_costs": 1.0} + return spi_tape_finance_cost_donor( + prepared, uprating_factors=factors, spec=spec + ), spec + + def test_costs_are_keyed_on_person_id_and_zero_off_landlords(self) -> None: + donor, spec = self._donor() + ids, profit, weights = _landlords(800) + age = np.linspace(20, 90, len(ids)) + first = impute_frs_property_finance_costs( + donor, person_ids=ids, profit=profit, age=age, weights=weights, spec=spec + ) + order = np.random.default_rng(1).permutation(len(ids)) + second = impute_frs_property_finance_costs( + donor, + person_ids=ids[order], + profit=profit[order], + age=age[order], + weights=weights[order], + spec=spec, + ) + np.testing.assert_array_equal(first.costs[order], second.costs) + assert (first.costs[profit <= 0.0] == 0.0).all() + assert (first.costs >= 0.0).all() + assert first.receipt["regime"] == "positive_only" + assert 0 < first.receipt["drawn"] < int((profit > 0).sum()) + + +class TestReceiptsWalk: + def _allocate(self, ids, profit, weights, *, receipts_per_profit: float = 1.65): + landlords = float(weights[profit > 0].sum()) + total_profit = float((profit * weights)[profit > 0].sum()) + facts = _facts(landlords=landlords, receipts=receipts_per_profit * total_profit) + spec = ReceiptsAllocationSpec.from_parameters( + _parameters(ALLOCATE_PROPERTY_RENTAL_INCOME_KIND) + ) + return ( + allocate_property_rental_income( + person_ids=ids, profit=profit, weights=weights, facts=facts, spec=spec + ), + facts, + ) + + def test_receipts_never_fall_below_profit_and_vanish_off_landlords(self) -> None: + ids, profit, weights = _landlords() + allocation, _ = self._allocate(ids, profit, weights) + landlord = profit > 0.0 + assert (allocation.receipts[landlord] >= profit[landlord]).all() + assert (allocation.receipts[~landlord] == 0.0).all() + + def test_the_walk_fills_every_band_above_the_lowest_to_its_count(self) -> None: + ids, profit, weights = _landlords() + allocation, facts = self._allocate(ids, profit, weights) + cells = allocation.receipt["bands_top_down"] + largest = float(weights.max()) + for cell in cells[:-1]: + assert cell["walk_landlords_weight"] == pytest.approx( + cell["target_landlords"], abs=largest + ) + lowest = cells[-1] + assert lowest["walk_landlords_weight"] == pytest.approx( + float(weights[profit > 0].sum()) + - sum(cell["walk_landlords_weight"] for cell in cells[:-1]) + ) + + def test_the_top_band_multiplier_reaches_the_receipts_total(self) -> None: + # Receipts at twice the profit put the top band's solve inside its + # bounds on these landlords (k near 3.8). + ids, profit, weights = _landlords() + allocation, facts = self._allocate( + ids, profit, weights, receipts_per_profit=2.0 + ) + top = allocation.receipt["bands_top_down"][0] + assert 1.0 < top["profit_multiplier"] < 5.0 + assert top["mean_receipts_gbp"] == pytest.approx( + top["target_mean_receipts_gbp"], rel=1e-9 + ) + + def test_bands_take_their_pris_share_of_the_landlords_here(self) -> None: + # microcosm#1106: before calibration the spine carries fewer landlords + # than PRIS. Each band takes its share of the landlords present, so a + # frame with half PRIS's landlords fills every band to half its count; + # filling the published counts would leave the lowest band empty. + ids, profit, weights = _landlords() + landlords = float(weights[profit > 0].sum()) + total_profit = float((profit * weights)[profit > 0].sum()) + facts = _facts(landlords=2.0 * landlords, receipts=4.0 * total_profit) + spec = ReceiptsAllocationSpec.from_parameters( + _parameters(ALLOCATE_PROPERTY_RENTAL_INCOME_KIND) + ) + allocation = allocate_property_rental_income( + person_ids=ids, profit=profit, weights=weights, facts=facts, spec=spec + ) + cells = allocation.receipt["bands_top_down"] + largest = float(weights.max()) + + assert allocation.receipt["share_scale"] == pytest.approx(0.5) + for cell in cells: + assert cell["target_landlords"] == pytest.approx( + 0.5 * cell["published_landlords"] + ) + assert cell["walk_landlords_weight"] == pytest.approx( + cell["target_landlords"], abs=2.0 * largest + ) + assert cells[-1]["walk_landlords_weight"] > 0.4 * landlords + + def test_receipts_do_not_depend_on_row_order(self) -> None: + ids, profit, weights = _landlords() + first, _ = self._allocate(ids, profit, weights) + order = np.random.default_rng(5).permutation(len(ids)) + second, _ = self._allocate(ids[order], profit[order], weights[order]) + np.testing.assert_allclose(first.receipts[order], second.receipts) + + +class TestStageTransform: + def _frame(self): + from microcosm.build.uk_runtime.national_frame import uk_national_frame + + rng = np.random.default_rng(11) + households = 60 + household = pd.DataFrame( + { + "household_id": np.arange(1, households + 1), + "subrent": np.where(np.arange(households) % 9 == 0, 2_600.0, 0.0), + "other_residential_property_value": np.where( + np.arange(households) % 2 == 0, 250_000.0, 0.0 + ), + "non_residential_property_value": 0.0, + "household_support_channel": np.where( + np.arange(households) < 40, "frs", "spi" + ), + } + ) + person = pd.DataFrame( + { + "person_id": np.arange(1, 2 * households + 1), + "person_benunit_id": np.repeat(np.arange(1, households + 1), 2), + "person_household_id": np.repeat(np.arange(1, households + 1), 2), + "age": np.tile([45.0, 12.0], households), + "is_household_head": np.tile([True, False], households), + "is_uc_claimant": np.tile([True, False], households), + "person_support_channel": np.repeat( + np.where(np.arange(households) < 40, "frs", "spi"), 2 + ), + } + ) + profit = np.where( + person["is_household_head"], rng.uniform(500.0, 40_000.0, len(person)), 0.0 + ) + sublet = ( + person["person_household_id"] + .map(household.set_index("household_id")["subrent"]) + .to_numpy() + * person["is_household_head"].to_numpy() + ) + person["property_income"] = profit + sublet + spi_rows = person["person_support_channel"].eq("spi") & person["is_uc_claimant"] + person["property_finance_costs"] = np.where(spi_rows, 0.2 * profit, 0.0) + benunit = pd.DataFrame({"benunit_id": np.arange(1, households + 1)}) + return uk_national_frame( + person=person, + benunit=benunit, + household=household, + time_period="2024", + household_weights=rng.uniform(100.0, 300.0, households), + ) + + def test_the_stage_adds_frs_costs_back_and_gives_every_landlord_receipts( + self, tmp_path + ) -> None: + from microcosm.build.uk_runtime.property_components import ( + UKPropertyComponentsStageTransform, + ) + from microcosm.build.uk_runtime.spi_income import SPIDonorAgeModel + from test_support.microcosm_build.uk_spi_income import _write_donor + + _write_donor(tmp_path / "donor.tab") + frame = self._frame() + person = frame.table("person") + weights = ( + person["person_household_id"] + .map( + pd.Series( + frame.weights_for("household").values, + index=frame.table("household")["household_id"].to_numpy(), + ) + ) + .to_numpy() + ) + transform = UKPropertyComponentsStageTransform( + stage=_stage(), + donor_table=pd.read_csv(tmp_path / "donor.tab", sep="\t"), + age_model=SPIDonorAgeModel( + populations={ + (sex, age): 1.0 for sex in ("MALE", "FEMALE") for age in range(91) + }, + state_pension_age=66, + source="flat test populations", + ), + uprating_factors={"property_income": 1.0, "property_finance_costs": 1.0}, + facts=_facts( + landlords=float(weights[person["property_income"] > 0].sum()), + receipts=1.65 * float((person["property_income"] * weights).sum()), + ), + ) + result = transform(frame) + out = result.table("person") + + assert list(out.columns)[-1] == "property_rental_income" + assert (out["property_rental_income"] >= out["property_income"] - 1e-6).all() + assert ( + out.loc[out["property_income"] == 0.0, "property_rental_income"] == 0.0 + ).all() + spi = person["person_support_channel"].eq("spi") & person["is_uc_claimant"] + # The SPI channel keeps its profit and the costs the income stage drew. + np.testing.assert_array_equal( + out.loc[spi, "property_income"], person.loc[spi, "property_income"] + ) + np.testing.assert_array_equal( + out.loc[spi, "property_finance_costs"], + person.loc[spi, "property_finance_costs"], + ) + # FRS landlords' profit gains exactly the costs they were given. + frs = ~spi + np.testing.assert_allclose( + out.loc[frs, "property_income"] - person.loc[frs, "property_income"], + out.loc[frs, "property_finance_costs"], + ) + assert (out.loc[frs, "property_finance_costs"] > 0.0).any() + evidence = transform.checkpoint_metadata()["evidence"] + assert evidence["stage"] == "property_components" + assert evidence["receipts"]["rows_receipts_below_profit"] == 0 + assert evidence["residuals"]["sublet_receipts"]["rows"] > 0 + assert result.mass_log[-1].reason == ( + "Landlords' receipts and finance costs on the source spine: household " + "weights pass through unchanged and total household mass is conserved." + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py index 029f04514..3c89279a7 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_release_input_coverage_manifest.py @@ -48,6 +48,18 @@ def test_candidate_evidence_is_sha_pinned_and_covers_reference() -> None: def test_known_gap_register_records_post_candidate_restoration_separately() -> None: gaps = _resource("efrs_parity_known_gaps.json") assert gaps["known_gaps"] == {} + # microcosm#1106: property_wealth is formula-owned in policyengine-uk, so + # the release leaves it for the engine to derive. It is a declared + # exclusion in its own section, never parity debt in known_gaps. + assert set(gaps["engine_derived_exclusions"]) == {"property_wealth"} + assert gaps["engine_derived_exclusions"]["property_wealth"]["reason"] == ( + "formula-owned in policyengine-uk and derived from persisted " + "components; a persisted copy overrides the formula and is not uprated" + ) + assert ( + "microcosm#1106" + in (gaps["engine_derived_exclusions"]["property_wealth"]["tracking_note"]) + ) assert set(gaps["restored_required_columns"]) == { "charitable_investment_gifts", "gift_aid", @@ -113,14 +125,26 @@ def test_promoted_manifest_requires_the_full_reference_surface() -> None: reference = _resource("efrs_parity_reference.json") manifest = _resource("release_input_coverage_manifest.json") assert manifest["counts"] == { - "required": 145, - "reviewed_exclusion": 0, + "required": 144, + "reviewed_exclusion": 1, "total": 145, } assert set(manifest["columns"]) == set(reference["nonzero_shares"]) - assert all( - entry == {"status": "required"} for entry in manifest["columns"].values() - ) + # Every reference input is required except the engine-derived total; its + # three persisted components stay required (microcosm#1106). + excluded = { + name: entry + for name, entry in manifest["columns"].items() + if entry != {"status": "required"} + } + assert set(excluded) == {"property_wealth"} + assert excluded["property_wealth"]["status"] == "reviewed_exclusion" + for component in ( + "main_residence_value", + "other_residential_property_value", + "non_residential_property_value", + ): + assert manifest["columns"][component] == {"status": "required"} assert manifest["restoration_evidence"] == { "derived_from": "efrs_parity_known_gaps.json", "required_columns": ["charitable_investment_gifts", "gift_aid"], @@ -240,6 +264,43 @@ def test_generator_never_reintroduces_a_pinned_restoration_as_a_gap() -> None: } +def test_generator_keeps_the_engine_derived_section_on_a_candidate_refresh() -> None: + generator = _load_generator() + reference = _resource("efrs_parity_reference.json") + evidence = _resource("efrs_parity_known_gaps.json")["candidate_evidence"] + + gaps = generator.build_known_gaps(evidence, reference=reference) + + assert gaps["engine_derived_exclusions"] == generator.ENGINE_DERIVED_EXCLUSIONS + assert "property_wealth" not in gaps["known_gaps"] + + +def test_manifest_generation_rejects_engine_derived_drift_and_overlap() -> None: + generator = _load_generator() + reference = _resource("efrs_parity_reference.json") + drifted = _resource("efrs_parity_known_gaps.json") + drifted["engine_derived_exclusions"]["property_wealth"]["reason"] = "edited" + with pytest.raises(ValueError, match="engine_derived_exclusions disagrees"): + generator.build_manifest(reference=reference, known_gaps_payload=drifted) + + dropped = _resource("efrs_parity_known_gaps.json") + del dropped["engine_derived_exclusions"] + with pytest.raises(ValueError, match="engine_derived_exclusions disagrees"): + generator.build_manifest(reference=reference, known_gaps_payload=dropped) + + # Only a formula-owned input the reference persists can be left to the + # engine; an ordinary input never becomes an engine-derived exclusion. + unowned = json.loads(json.dumps(reference)) + unowned["engine"]["formula_owned_persisted_overrides_included"].remove( + "property_wealth" + ) + with pytest.raises(ValueError, match="must be formula-owned inputs"): + generator.build_manifest( + reference=unowned, + known_gaps_payload=_resource("efrs_parity_known_gaps.json"), + ) + + def test_manifest_generation_rejects_candidate_entity_mismatch() -> None: generator = _load_generator() reference = _resource("efrs_parity_reference.json") diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index 80c888e2c..ed8000b04 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -44,6 +44,9 @@ # #1003: the Lifetime ISA holdings read the was_wealth household draws. "was_lisa", "regional_property_uprating", + # #1106: landlords' receipts and finance costs follow the uprated rental + # property values their coherence receipt reads. + "property_components", ] E6_STAGE_NAMES = [ "nts_bus_travel", @@ -238,6 +241,7 @@ def test_country_stage_plan_assembles_spine_plan(self) -> None: "was_lisa": _identity, "nts_bus_travel": _identity, "regional_property_uprating": _identity, + "property_components": _identity, "lcfs_consumption": _identity, "etb_vat": _identity, "etb_services": _identity, @@ -1055,6 +1059,7 @@ def test_stage2_outputs_are_backed_by_runtime_written_columns(self) -> None: SPI_HMRC_DERIVED_AUXILIARY_COLUMNS, SPI_HMRC_QRF_AUXILIARY_COLUMNS, SPI_INCOME_IMPUTATION_COLUMNS, + SPI_PROPERTY_FINANCE_COSTS_COLUMN, ) spec = load_country_spec("uk") @@ -1064,6 +1069,7 @@ def test_stage2_outputs_are_backed_by_runtime_written_columns(self) -> None: set(SPI_INCOME_IMPUTATION_COLUMNS) | set(SPI_HMRC_QRF_AUXILIARY_COLUMNS) | set(SPI_HMRC_DERIVED_AUXILIARY_COLUMNS) + | {SPI_PROPERTY_FINANCE_COSTS_COLUMN} ) # The narrow PAY+EPB+TAXTERM employment input is written on SPI rows # by the stage even though the QRF output surface excludes it. diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py index 649b85302..5411643d5 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py @@ -263,6 +263,47 @@ def test_spi_donor_rejects_undocumented_sex_code(tmp_path) -> None: spi_income._prepare_spi_donor(raw, seed=7) +def test_spi_donor_carries_restricted_finance_costs_with_their_relief( + tmp_path, +) -> None: + """microcosm#1106: LLIR_RESTRICT_AMT_TOT becomes the property_finance_costs + leaf, and the donor is refused unless TAX_CRED carries 20% relief on it.""" + + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + raw = pd.read_csv(donor_path, delimiter="\t") + + donor = spi_income._prepare_spi_donor(raw, seed=7) + + assert donor["property_finance_costs"].tolist() == [0.0, 0.0, 200.0, 300.0] + check = donor.attrs["property_finance_costs"] + assert check["rows_with_restricted_costs"] == 2 + assert check["weighted_restricted_costs_gbp"] == pytest.approx( + 3.0 * 200.0 + 4.0 * 300.0 + ) + assert check["median_relief_ratio"] == pytest.approx(0.2) + # The leaf is drawn last, so it conditions on every income leaf and moves + # no earlier draw. + assert spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS[-1] == "property_finance_costs" + + wrong = raw.copy() + wrong["TAX_CRED"] = wrong["LLIR_RESTRICT_AMT_TOT"] * 0.4 + with pytest.raises(ValueError, match="20% finance-cost relief"): + spi_income._prepare_spi_donor(wrong, seed=7) + negative = raw.copy() + negative.loc[0, "LLIR_RESTRICT_AMT_TOT"] = -1.0 + with pytest.raises(ValueError, match="negative costs"): + spi_income._prepare_spi_donor(negative, seed=7) + none = raw.copy() + none[["LLIR_RESTRICT_AMT_TOT", "TAX_CRED"]] = 0.0 + assert ( + spi_income._prepare_spi_donor(none, seed=7).attrs["property_finance_costs"][ + "median_relief_ratio" + ] + is None + ) + + def test_spi_qrf_fails_closed_on_unreviewed_stage2_gap(monkeypatch, tmp_path) -> None: support = _dead_support(drop_stage2="universal_credit_reported") donor_path = tmp_path / SPI_DONOR_FILENAME diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py index e412f9c81..e3c4f1c63 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spine_acceptance_receipt.py @@ -107,6 +107,10 @@ def _apply_pending_roster_transformations( # household draws, so they run right after was_wealth. assert "was_lisa" not in roster roster.insert(roster.index("was_wealth") + 1, "was_lisa") + # microcosm#1106 re-mint pending: landlords' receipts and finance costs + # follow the uprated rental property values. + assert "property_components" not in roster + roster.insert(roster.index("regional_property_uprating") + 1, "property_components") # microcosm#1069 re-mint pending: the Pension Credit take-up redraw reads # the post-SPI incomes, so it runs right after UC capital coherence. assert "pension_credit_take_up" not in roster diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py index 1bcf8666c..3fbd8f592 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_target_references.py @@ -64,9 +64,8 @@ _TEST_PATHS = paths_for("microcosm-build") -ACTIVE_REFERENCE_COUNT = 1231 +ACTIVE_REFERENCE_COUNT = 1244 REGION_TIER_LEVEL = {code: level for level, code in UK_REGION_TIER} -UK_DATA_REPO = "policyengine-" + "uk-data" def test_local_generator_support_floor_scope_comes_from_signed_register() -> None: @@ -513,16 +512,49 @@ def test_dfe_extended_sum_refuses_the_suppressed_2024_member() -> None: ) -def test_uk_target_references_do_not_bind_known_mismatched_property_amounts() -> None: - resource = _load_uk_resource("target_references.json") +def test_uk_target_references_bind_the_spi_net_property_amounts_unscaled() -> None: + """The 13 SPI Table 3.7 net property-income amounts bind as published. - assert not [ - reference["name"] + microcosm#1106 retired the incumbent's x1.9 scaling: SPI net income from + property is landlords' profit after allowable expenses and before + residential finance costs, the concept ``property_income`` holds, so no + value operation scales it. The only move is the declared uprating to the + 2025 calibration year. + """ + + target_id = "hmrc.spi.property_income.amount_by_total_income_band" + contract = _load_uk_resource("uk_population_targets.json") + resource = _load_uk_resource("target_references.json") + references = [ + reference for reference in resource["target_references"] - if reference["metadata"]["contract_target_id"] - == "hmrc.spi.property_income.amount_by_total_income_band" + if reference["metadata"]["contract_target_id"] == target_id ] + assert len(references) == 13 + assert all( + reference["name"].startswith("hmrc/property_income_income_band_") + for reference in references + ) + assert { + ( + reference["uprating_index"], + reference["uprating_from_period"], + reference["uprating_to_period"], + ) + for reference in references + } == { + ( + "policyengine_uk_parameter:" + "gov.economic_assumptions.indices.obr.per_capita.gdp", + "2023", + 2025, + ) + } + assert target_id not in _value_operation_by_target_id(contract) + membership = _load_uk_resource("target_reference_membership.json") + assert membership["targets"][target_id]["status"] == "active" + def test_uk_target_references_do_not_emit_nan_uc_payment_bands() -> None: resource = _load_uk_resource("target_references.json") @@ -750,9 +782,9 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert membership["target_period"] == 2025 assert membership["active_reference_count"] == ACTIVE_REFERENCE_COUNT assert membership["status_counts"] == { - "active": 1231, + "active": 1244, "no_fact_at_or_before_period": 7, - "signed_excluded": 16, + "signed_excluded": 15, } assert membership["genuine_sum_residue"] assert membership["uprating_holds"] @@ -767,17 +799,19 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: assert [entry for entry in outcomes if entry["family"] != "hmrc_cgt"] == [ { "family": "hmrc_spi", - "status": "active_with_signed_property_amount_exclusion", - "active_reference_count": 169, + "status": "active_strict_band_pins", + "active_reference_count": 182, "signed_rationale": ( "SPI income-band targets fan out by strict total-income-band " - "dimension pins, except the HMRC property-income amount " - "surface. Those 13 rows are signed out because Ledger carries " - "the official SPI Table 3.7 net property-income amounts, " - "while the incumbent target applies the populace-side x1.9 " - "property-income undercount adjustment traced to " - f"{UK_DATA_REPO} PR #311 / issue #230 and HMRC Property Rental " - "Income Statistics." + "dimension pins. The 13 property-income amount rows bind the " + "SPI Table 3.7 net concept unscaled: landlords' profit after " + "allowable expenses and before residential finance costs, " + "which is what policyengine-uk's property_income means. The " + "incumbent's x1.9 scaling (uk-data#311, uk-data#230) set the " + "Property Rental Income Statistics' receipts before expenses " + "against this net amount, so it is retired; the receipts bind " + "on their own variable (microcosm#1106, María's ruling of " + "2026-10-05)." ), }, { @@ -913,25 +947,6 @@ def test_uk_target_reference_membership_report_is_packaged() -> None: for entry in rationales if entry["family"] not in {"hmrc_cgt", "dwp_state_pension"} ] == [ - { - "family": "hmrc_spi", - "target_id": "hmrc.spi.property_income.amount_by_total_income_band", - "status": "signed_excluded", - "signed_rationale": ( - "Signed out pending a first-class value-scaling operation or " - "a Chronicle package for HMRC Property Rental Income " - "Statistics with declared reconciliation: the Ledger facts " - "are official HMRC SPI Table 3.7 net property-income amounts, " - "while the incumbent calibration target applies the " - "populace-side x1.9 property-income undercount adjustment. " - "The x1.9 trace is uk-data PR #311 / issue uk-data#230: SPI " - "covers only taxpayers with liability, " - "and HMRC Property Rental Income Statistics show GBP 46.68bn " - "versus SPI about GBP 24.5bn for 2020-21. Binding the raw SPI " - "facts would knowingly calibrate to 10/19 of the incumbent " - "surface." - ), - }, { "family": "ons_population", "target_id": "ons.population.scotland_households_3plus_children", diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py index f7d96a543..16235268e 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_terminal_gates.py @@ -381,7 +381,14 @@ def test_export_candidate_columns_strip_ids_and_carry_the_weight() -> None: } ), benunit=pd.DataFrame({"benunit_id": [1, 2]}), - household=pd.DataFrame({"household_id": [1, 2], "region": ["LONDON"] * 2}), + household=pd.DataFrame( + { + "household_id": [1, 2], + "region": ["LONDON"] * 2, + "main_residence_value": [300_000.0, 0.0], + "property_wealth": [350_000.0, 0.0], + } + ), time_period="2024", household_weights=np.asarray([1.0, 2.0]), ) @@ -389,12 +396,16 @@ def test_export_candidate_columns_strip_ids_and_carry_the_weight() -> None: "person.age", "person.incapacity_benefit_reported", "household.region", + "household.main_residence_value", + "household.property_wealth", "household.household_weight", } exported = uk_release_export_frame(frame) + # microcosm#1106: the WAS total leaves; its engine components stay. assert uk_export_candidate_columns(exported) == { "person.age", "household.region", + "household.main_residence_value", "household.household_weight", } assert exported.weights_for("household").values.tolist() == [1.0, 2.0] diff --git a/packages/microcosm-data/pyproject.toml b/packages/microcosm-data/pyproject.toml index 1ce772267..8d7e880e6 100644 --- a/packages/microcosm-data/pyproject.toml +++ b/packages/microcosm-data/pyproject.toml @@ -37,7 +37,7 @@ us = ["policyengine-us>=2.2.1,<3", "policyengine-core==3.32.5"] # The UK artifact lives in a PRIVATE repo (UK Data Service licence): loads # require an authenticated HF token with access. The loader surfaces the # 401 with that explanation rather than retrying. -uk = ["policyengine-uk>=2.122.2"] +uk = ["policyengine-uk>=2.123.0"] [project.urls] Homepage = "https://microcosm.institute" diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 32dee6aa3..549121f6b 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -416,13 +416,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "6be9d4f71cc00815c9ad2c93f0d58f42d7c3ba6417cb8a2ab31ad9bf4c8f73ea" + "f5fb5a67c678546a8501c0a7a2aa78f138cef3384fa0167e5982e380999bb14b" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "8e635a5f341d304b87f277a68c15e1069972836c8858ed69115b972bf6d70b67" + "f69e61f39db93f5bd4b4c9497801964c7fd4136a3cc1edef041f4b1dca8f4386" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "fea3ba9ad91bd163cd08542872e1bb7627716cb6e4579f6f87de5c8cf83b5eea" + "89c357b1afcaf95ebe6690591758fc338d117d8f03324681d00551df04a9add0" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -468,6 +468,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: ), "uk_stage_was_wealth_support": ("stage_health", "transferred"), "uk_stage_was_lisa_support": ("stage_health", "transferred"), + "uk_stage_property_components": ("stage_health", "transferred"), "uk_stage_was_wealth_coherence": ("stage_health", "transferred"), "uk_stage_nts_bus_travel_support": ("stage_health", "transferred"), "uk_stage_nts_bus_travel_facts": ("stage_health", "transferred"), @@ -573,6 +574,7 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: "uk_input_mass_parity", "uk_stage_was_wealth_support", "uk_stage_was_lisa_support", + "uk_stage_property_components", "uk_stage_was_wealth_coherence", "uk_stage_nts_bus_travel_support", "uk_stage_nts_bus_travel_facts", @@ -802,6 +804,7 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: "uk_stage_nts_bus_travel_facts", "uk_stage_nts_bus_travel_support", "uk_stage_pension_credit_take_up", + "uk_stage_property_components", "uk_stage_salary_sacrifice_realization", "uk_stage_spi_benefit_coherence", "uk_stage_spi_support_channel_mass", @@ -851,10 +854,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: _UK_CERTIFICATION_PART_DIGESTS: Mapping[str, Mapping[str, str]] = { "spine": { "gates_manifest_sha256": ( - "da12b5be6236783cb7af79279175116548d7c99da283e4e45ef40b3ba3cd3168" + "23e4c0a692ac08d8544445c2246690d5ebbb5f708c1975f25752d807593df2ea" ), "policy_sha256": ( - "447841b7d7e57abf7e64574884b6b3db15ee44f4be09e4863cda066f0005e498" + "8b2f0cad210bfc8712a92cd13b8a1262fa76f28fa8c8e59a2d9f47d405141a8c" ), }, "calibration_seam": { @@ -867,10 +870,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "b08c43d431859f03845327f5a321047adb32e74e78035a5fceca35346e5234f6" + "b5a86979edc458a6c52e4b81575f9d928fd9143fafe3a2a2cd384542e5be5386" ), "policy_sha256": ( - "5711e4f07003aa548de9a1c9b67e3949bc99294a4a7302f956735983f8b67d4c" + "33e4a58e75c11989c937089416f9d9e42c274bcbda15427d2f1b093c2d1102f1" ), }, } diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index feb52a889..9c32beae9 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -127,13 +127,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "6be9d4f71cc00815c9ad2c93f0d58f42d7c3ba6417cb8a2ab31ad9bf4c8f73ea" + "f5fb5a67c678546a8501c0a7a2aa78f138cef3384fa0167e5982e380999bb14b" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "8e635a5f341d304b87f277a68c15e1069972836c8858ed69115b972bf6d70b67" + "f69e61f39db93f5bd4b4c9497801964c7fd4136a3cc1edef041f4b1dca8f4386" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "fea3ba9ad91bd163cd08542872e1bb7627716cb6e4579f6f87de5c8cf83b5eea" + "89c357b1afcaf95ebe6690591758fc338d117d8f03324681d00551df04a9add0" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6f0243bcda09dad26945376230c44ec3cf55d4e417c3a25e29bae8c59bc1a69d" @@ -161,6 +161,7 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: ), "uk_stage_was_wealth_support": ("stage_health", "transferred", None), "uk_stage_was_lisa_support": ("stage_health", "transferred", None), + "uk_stage_property_components": ("stage_health", "transferred", None), "uk_stage_was_wealth_coherence": ("stage_health", "transferred", None), "uk_stage_uc_deduction_attributes": ( "stage_health", @@ -1264,6 +1265,7 @@ def _gate_battery_payload( stage_health_stages = { "uk_stage_was_wealth_support": "was_wealth", "uk_stage_was_lisa_support": "was_lisa", + "uk_stage_property_components": "property_components", "uk_stage_was_wealth_coherence": "was_wealth", "uk_stage_uc_deduction_attributes": "uc_deduction_attributes", "uk_stage_lcfs_consumption_support": "lcfs_consumption", diff --git a/packages/microcosm-frame/pyproject.toml b/packages/microcosm-frame/pyproject.toml index 0eda37f1a..13066a779 100644 --- a/packages/microcosm-frame/pyproject.toml +++ b/packages/microcosm-frame/pyproject.toml @@ -22,7 +22,7 @@ policyengine = [ "policyengine-core==3.32.5", "microunit>=0.1.0", ] -uk = ["policyengine-uk>=2.122.2"] +uk = ["policyengine-uk>=2.123.0"] # The Axiom adapter's PyPI-resolvable dependencies. The engine itself # (axiom-rules-engine + its dense native extension) is not on PyPI yet and # installs from a checkout; see microcosm/frame/adapters/axiom.py. diff --git a/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py b/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py index b86e95299..47331abb9 100644 --- a/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py +++ b/packages/microcosm-frame/src/microcosm/frame/adapters/policyengine_uk_concepts.py @@ -32,7 +32,7 @@ # --------------------------------------------------------------------------- # # Which PolicyEngine-UK inputs each engine-neutral concept feeds -# (microcosm.frame.concepts), reviewed against policyengine-uk 2.122.2. Every +# (microcosm.frame.concepts), reviewed against policyengine-uk 2.123.0. Every # target is a pure input (in ``PolicyEngineUKEngine.variables``). The UK # loader also accepts some formula-owned variables as overrides # (``employment_income``, ``state_pension_reported``, ``is_household_head``); @@ -185,7 +185,7 @@ def _uk_take_up(program: str, entity: str) -> InputBinding: POLICYENGINE_UK_CONCEPT_MAPPING = ConceptMapping( engine="policyengine-uk", - engine_version="2.122.2", + engine_version="2.123.0", entity_correspondence={"person": "person", "household": "household"}, input_declaration=InputDeclaration.ENGINE_TYPED, bindings=( @@ -294,9 +294,13 @@ def _uk_take_up(program: str, entity: str) -> InputBinding: Identity(), AlignmentRelation.APPROXIMATE, ( - "Engine label 'rental income', documentation 'Income from rental " - "of property'; whether expenses are netted is not stated, and " - "the concept is net." + "Engine label 'property income', documentation: profits of UK and " + "overseas property businesses, receipts less allowable expenses, " + "'before the property allowance and before any costs of " + "dwelling-related loans', which are relieved as a tax reduction " + "instead. The concept nets every expense, mortgage interest " + "included, and excludes sub-letting part of the own dwelling, so " + "the engine's profit sits above it for mortgaged landlords." ), ), bind( diff --git a/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json b/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json index ac9626aaf..b9822bb48 100644 --- a/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json +++ b/packages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json @@ -393,8 +393,8 @@ } ], "engine": "policyengine-uk", - "engine_version": "2.122.2", - "input_count": 285, + "engine_version": "2.123.0", + "input_count": 288, "schema_sha256": "d824f5e97d58292d62f65ffae60bc8654408711344b638d4e3caa95d6c2e8d1e", "structural_inputs": [ { @@ -1119,10 +1119,22 @@ "entity": "person", "name": "private_transfer_income" }, + { + "entity": "person", + "name": "property_finance_costs" + }, + { + "entity": "person", + "name": "property_finance_costs_brought_forward" + }, { "entity": "household", "name": "property_purchased" }, + { + "entity": "person", + "name": "property_rental_income" + }, { "entity": "household", "name": "rail_usage" diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json index 395e40652..cbd4855cf 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json @@ -2,70 +2,70 @@ "resource": "synthetic-cgt-asset-type.json", "resource_sha256": "synthetic", "source_commit": "synthetic", - "table4_all_gains": 6972902.672981733, + "table4_all_gains": 6983113.129676064, "table4_all_tax": 0.0, - "table4_all_taxpayers": 16.094983343942484, + "table4_all_taxpayers": 16.094983343942488, "table4_bands": [ { - "gains": 8217.473512660947, + "gains": 8222.831155197551, "lower_bound": 0, "tax": null, - "taxpayers": 1.9497298884513308, + "taxpayers": 1.9510482248880026, "upper_bound": 10000 }, { - "gains": 21896.095280597303, + "gains": 21895.611760407053, "lower_bound": 10000, "tax": null, - "taxpayers": 1.4186024000993251, + "taxpayers": 1.418470453276858, "upper_bound": 25000 }, { - "gains": 34127.178526428856, + "gains": 34067.93073230906, "lower_bound": 25000, "tax": null, - "taxpayers": 0.9765811213626028, + "taxpayers": 0.9749275341889313, "upper_bound": 50000 }, { - "gains": 100905.84410669128, + "gains": 101619.46463824037, "lower_bound": 50000, "tax": null, - "taxpayers": 1.35652934634974, + "taxpayers": 1.3667147296498983, "upper_bound": 100000 }, { - "gains": 380496.1417001018, + "gains": 375781.63324098045, "lower_bound": 100000, "tax": null, - "taxpayers": 2.4362947881260877, + "taxpayers": 2.4059169352144028, "upper_bound": 250000 }, { - "gains": 716332.6943635071, + "gains": 719863.4499270874, "lower_bound": 250000, "tax": null, - "taxpayers": 1.8749877404873119, + "taxpayers": 1.8848977837476633, "upper_bound": 500000 }, { - "gains": 1133930.7451246195, + "gains": 1133982.6950390092, "lower_bound": 500000, "tax": null, - "taxpayers": 1.5052615586989606, + "taxpayers": 1.5053281697938976, "upper_bound": 1000000 }, { - "gains": 4576996.500367126, + "gains": 4587679.513182833, "lower_bound": 1000000, "tax": null, - "taxpayers": 4.576996500367127, + "taxpayers": 4.587679513182833, "upper_bound": null } ], - "table4_individuals_gains": 6972902.672981733, + "table4_individuals_gains": 6983113.129676064, "table4_individuals_tax": 0.0, - "table4_individuals_taxpayers": 16.094983343942484, + "table4_individuals_taxpayers": 16.094983343942488, "table4_trusts_gains": 0.0, "table4_trusts_tax": 0.0, "table7_total_disposals": 2743095.2380952383, @@ -115,11 +115,11 @@ } ], "table8a_disposals_total": 30.35054002000583, - "table8a_gains_total": 39631304.86491925, - "table8a_tax_total": 7926260.972983851, + "table8a_gains_total": 39659585.85517995, + "table8a_tax_total": 7931917.17103599, "table8a_taxpayers_total": 27.591400018187116, - "table8b_all_gains": 39631304.86491925, + "table8b_all_gains": 39659585.85517995, "table8b_all_taxpayers": 27.591400018187116, - "table8b_individuals_gains": 39631304.86491925, + "table8b_individuals_gains": 39659585.85517995, "table8b_individuals_taxpayers": 27.591400018187116 } diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index 02e940a6a..2301986f9 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -33,6 +33,7 @@ "nts_stage": "nts_stage.csv", "nts_ticket": "nts_ticket.csv", "nts_trip": "nts_trip.csv", + "property_rental_facts": "property_rental_facts.json", "spi_donor": "spi_donor.csv", "was": "was.csv", "was_person": "was_person.csv" @@ -252,7 +253,7 @@ "cgt_residential_split": { "artifacts": [ { - "dependency": "policyengine-uk>=2.122.2 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.123.0 via microcosm-build[uk]", "dependency_discipline": "deferred inside uk_cgt_policy_parameters; the base package never imports policyengine-uk at import time", "instant_rule": "raw dated parameter files evaluated at 1 June of the build period's tax year", "kind": "versioned_parameter_tree", @@ -2279,7 +2280,7 @@ "hmrc_cgt_asset_type_spine": { "artifacts": [ { - "dependency": "policyengine-uk>=2.122.2 via microcosm-build[uk]", + "dependency": "policyengine-uk>=2.123.0 via microcosm-build[uk]", "dependency_discipline": "deferred inside uk_cgt_policy_parameters and uk_cgt_badr_parameters; the base package never imports policyengine-uk at import time", "instant_rule": "raw dated parameter files evaluated at 1 June of the build period's tax year", "kind": "versioned_parameter_tree", @@ -2680,6 +2681,7 @@ "other_investment_income", "gift_aid", "charitable_investment_gifts", + "property_finance_costs", "hmrc_spi_employment_benefits", "hmrc_spi_employment_expenses", "hmrc_spi_other_social_security_income", @@ -2736,6 +2738,8 @@ "OTHERINV", "GIFTAID", "GIFTINV", + "LLIR_RESTRICT_AMT_TOT", + "TAX_CRED", "TEI", "TII", "TI" @@ -2790,6 +2794,7 @@ "hmrc_spi_unemployment_benefit_income": null, "other_investment_income": "other_investment_income", "private_pension_income": "private_pension_income", + "property_finance_costs": "property_finance_costs", "property_income": "property_income", "savings_interest_income": "savings_interest_income", "self_employment_income": "self_employment_income" @@ -2819,7 +2824,8 @@ "hmrc_spi_unemployment_benefit_income", "hmrc_spi_miscellaneous_employment_income", "hmrc_spi_other_income", - "hmrc_spi_state_pension_income" + "hmrc_spi_state_pension_income", + "property_finance_costs" ], "post_sample_fit_weight": "uniform", "predictors": [ @@ -2883,6 +2889,9 @@ "private_pension_income": [ "PENSION" ], + "property_finance_costs": [ + "LLIR_RESTRICT_AMT_TOT" + ], "property_income": [ "INCPROP" ], @@ -3318,6 +3327,7 @@ "other_investment_income", "gift_aid", "charitable_investment_gifts", + "property_finance_costs", "hmrc_spi_employment_benefits", "hmrc_spi_employment_expenses", "hmrc_spi_other_social_security_income", @@ -4426,6 +4436,135 @@ "stage": "pension_credit_take_up", "survey": "Family Resources Survey 2024-25" }, + "property_components": { + "artifacts": [ + { + "access": "private_local_input", + "doi": "10.5255/UKDA-SN-9422-1", + "filename": "put2223uk.tab", + "format": "tab_delimited", + "kind": "private_microdata", + "locator": "caller-supplied local input", + "reviewed_source": "PolicyEngine licensed UKDS mirror (private Hugging Face repository), spi_2022_23.zip", + "role": "qrf_donor", + "runtime_sha256_required": true, + "sha256": "5ef829461060c91a2a47be59ad541d9b519fc3976d66ca80d4920f711bb96f66", + "size_bytes": 141323762, + "survey": "Survey of Personal Incomes Public Use Tape 2022-23", + "tax_year_start": 2022, + "ukds_study_number": "SN 9422", + "vintage": "2022-23" + }, + { + "format": "json", + "kind": "public_aggregate_reference", + "resource": "hmrc_property_rental_income_facts.json", + "role": "property_rental_facts", + "runtime_sha256_required": true + } + ], + "grain": "person", + "nonnegative_outputs": [ + "property_rental_income" + ], + "notes": "Fills the two landlord inputs policyengine-uk 2.123.0 adds beside property_income (microcosm#1106; PolicyEngine/policyengine-uk#2172). FRS landlords report ROYYR1 after show card K6, which nets mortgage payments and loan interest, so their profit sits below the SPI concept; the stage draws their restricted finance costs from the SPI 2022-23 tape at build-period prices (incidence by band of profit after finance costs, amount from the regime-gated QRF on the analog landlords with costs, both keyed on person_id) and adds them back to property_income, so the engine relieves the interest once as a tax reduction (decision 6, to be confirmed with Max before merge). The SPI channel keeps the costs the income stage drew. Receipts for every landlord come from PRIS 2024-25: ranked by profit, walked into Table 13's bands at their shares of the individuals-basis landlords times the spine's landlord weight, linear within a band, never below profit, the open top band proportional to profit with the multiplier solved to the individuals' receipts per landlord; receipts less profit are the deductible expenses (PRIS allowable expenses other than residential finance costs). Sub-letting rent keeps equal receipts and no expenses until Rent a Room is released. Household weights are unchanged; the receipt records the tape incidence and its realisation, the band fit, the totals against PRIS, the channel split, the residuals and the share of landlords whose household holds rental property.", + "operations": [ + { + "artifact_role": "property_rental_facts", + "fail_on_mismatch": true, + "feed_pin": "chronicle_feed.json", + "kind": "verify_vendored_fact_resource", + "mapped_build_period": 2024, + "period_mapping": "published_tax_year_equals_build_period", + "record_sets": [ + "hmrc.property_rental_2026.table_1.ty2024", + "hmrc.property_rental_2026.table_2.ty2024", + "hmrc.property_rental_2026.table_6.ty2024", + "hmrc.property_rental_2026.table_8.ty2024", + "hmrc.property_rental_2026.table_13.ty2024" + ], + "require_before_source_read": true, + "resource": "hmrc_property_rental_income_facts.json", + "runtime_sha256_required": true, + "source_vintage": "2024-25" + }, + { + "add_back": "the drawn finance costs are added to the landlord's property_income, so the FRS profit reaches the SPI concept and the engine relieves the interest once, as the s. 274A tax reduction; the mortgage capital show card K6 also nets stays netted", + "add_back_to": "property_income", + "amount_salt": "property_components:finance_costs", + "amount_seed": 0, + "donor": "SPI 2022-23 landlords (INCPROP above zero) at build-period prices whose profit after restricted finance costs (INCPROP less LLIR_RESTRICT_AMT_TOT) is above zero: the analog of an FRS landlord reporting a profit, since show card K6 nets loan interest from ROYYR1", + "donor_income_period": 2022, + "draw": "predict_positive_from_uniforms at the person-keyed quantile", + "expected_regime": "positive_only", + "incidence": "a person-keyed uniform below the tape's FACT-weighted share of analog landlords with finance costs in the landlord's cell of profit after finance costs; the cells are the FACT-weighted deciles of the analog landlords' profit after finance costs, so every cell has tape support", + "incidence_cells": 10, + "incidence_salt": "property_components:has_finance_costs", + "incidence_seed": 0, + "income_uprating_variables": { + "property_finance_costs": "property_finance_costs", + "property_income": "property_income" + }, + "kind": "impute_frs_property_finance_costs", + "model": "regime_gated_qrf", + "n_estimators": 100, + "output": "property_finance_costs", + "population": "FRS-concept landlords: rows whose income leaves the income stage did not draw from the SPI tape (the FRS base channel, and the SPI channel's dependants on their twin values) with property income other than the household reference person's sub-letting rent above zero", + "predictors": [ + "profit_after_finance_costs", + "age" + ], + "tape_preparation": "as hmrc_spi_income_spine prepares the tape: its stage-1 seed and draw_spi_donor_ages_by_population", + "tape_preparation_seed": 42, + "training_rows": "analog tape landlords with finance costs" + }, + { + "band_basis": "PRIS 2024-25 Table 13 (all tax entities) scaled by Table 1's individuals' share of landlords", + "band_lower_bounds": [ + 0, + 10000, + 20000, + 30000, + 40000, + 50000, + 60000, + 70000, + 80000, + 90000, + 100000 + ], + "kind": "allocate_property_rental_income", + "maximum_top_band_multiplier": 5, + "order": "profit descending, person_id ascending", + "output": "property_rental_income", + "population": "persons with profit from property other than sub-letting above zero, on both channels, after the finance-cost add-back", + "residuals": "landlords without profit (FRS loss-makers, whose loss counts as zero, and tape landlords at zero) carry no receipts although PRIS counts them; property_finance_costs_brought_forward stays unset", + "resource": "hmrc_property_rental_income_facts.json", + "sublet_receipts": "the household reference person's sub-letting rent adds to receipts with no expenses; Rent a Room receipts, which the engine's receipts concept excludes, until PolicyEngine/policyengine-uk#2002 is released", + "top_band": "max(100,000, k x profit) with k at least 1 solved by bisection so the band's weighted mean receipts equal the individuals' Table 2 receipts less the bounded bands' realised mean receipts at their individuals-basis counts, over the top band's count", + "walk": "top band first, each band filled with whole persons to its share of the individuals-basis landlords times the spine's landlord weight (the spine's total before calibration differs from PRIS's, and filling the published counts would push every profit rank into a higher band), at one seeded systematic offset (the CGT Table 3 walk's rule); the lowest band takes every remaining landlord", + "walk_seed": 0, + "within_band": "linear in the weight-ranked position within the band, from its upper bound for the highest profit to its lower bound; never below the landlord's profit" + }, + { + "declared_factor": 1, + "entity": "household", + "gate_coupling": "The terminal family gate requires a valid mass-conserving MassChangeRecord carrying exactly this stage-specific reason.", + "kind": "record_mass_conservation_receipt", + "reason": "Landlords' receipts and finance costs on the source spine: household weights pass through unchanged and total household mass is conserved." + } + ], + "outputs": [ + "property_rental_income" + ], + "rewrites": [ + "property_income", + "property_finance_costs" + ], + "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", + "stage": "property_components", + "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" + }, "regional_property_uprating": { "artifacts": [ { diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json new file mode 100644 index 000000000..4df71eadf --- /dev/null +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json @@ -0,0 +1,94 @@ +{ + "expense_landlords_by_type": { + "legal_management_and_professional_fees": 68.90865863986222, + "non_residential_finance_costs": 68.90865863986222, + "other_allowable_expenses": 68.90865863986222, + "rent_rates_and_insurance": 68.90865863986222, + "repairs_and_maintenance": 68.90865863986222, + "residential_finance_costs": 68.90865863986222, + "services_including_wages": 68.90865863986222 + }, + "expenses": { + "all": 34989.53168822626, + "individual": 34639.636371344, + "partnership": 349.8953168822627 + }, + "expenses_by_type": { + "legal_management_and_professional_fees": 4188.674872604928, + "non_residential_finance_costs": 1339.16768763571, + "other_allowable_expenses": 4611.56993185831, + "rent_rates_and_insurance": 3836.26232322711, + "repairs_and_maintenance": 6454.18411860519, + "residential_finance_costs": 12908.36823721038, + "services_including_wages": 1651.304517084635 + }, + "landlords": { + "all": 137.81731727972445, + "individual": 136.43914410692722, + "partnership": 1.3781731727972328 + }, + "receipts": { + "all": 55983.250701162026, + "individual": 55423.41819415041, + "partnership": 559.8325070116189 + }, + "receipts_bands": [ + { + "landlords": 62.209205716542286, + "lower_bound": 0, + "upper_bound": 10000 + }, + { + "landlords": 41.15378224325105, + "lower_bound": 10000, + "upper_bound": 20000 + }, + { + "landlords": 15.791567604968426, + "lower_bound": 20000, + "upper_bound": 30000 + }, + { + "landlords": 7.177985274985648, + "lower_bound": 30000, + "upper_bound": 40000 + }, + { + "landlords": 3.828258813325679, + "lower_bound": 40000, + "upper_bound": 50000 + }, + { + "landlords": 2.3926617583285497, + "lower_bound": 50000, + "upper_bound": 60000 + }, + { + "landlords": 1.4355970549971295, + "lower_bound": 60000, + "upper_bound": 70000 + }, + { + "landlords": 0.9570647033314198, + "lower_bound": 70000, + "upper_bound": 80000 + }, + { + "landlords": 0.4785323516657099, + "lower_bound": 80000, + "upper_bound": 90000 + }, + { + "landlords": 0.4785323516657099, + "lower_bound": 90000, + "upper_bound": 100000 + }, + { + "landlords": 1.9141294066628396, + "lower_bound": 100000, + "upper_bound": null + } + ], + "resource_sha256": "synthetic-fixture", + "tax_year": 2024 +} diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv index aa800221f..1afe7a598 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv @@ -1,743 +1,743 @@ -SEX,FACT,GORCODE,AGERANGE,PAY,EPB,EXPS,TAXTERM,INCPBEN,OSSBEN,UBISJA,MOTHINC,OTHERINC,PROFITS,CAPALL,LOSSBF,SRP,INCBBS,DIVIDENDS,PENSION,INCPROP,OTHERINV,GIFTAID,GIFTINV,TEI,TII,TI -1,1,7,1,10000,0,0,0,0,0,0,0,0,0,0,0,0,100,10,0,0,5,1,1,10000,115,10115 -2,1.1000000000000001,10,2,11000,100,50,20,0,0,0,0,0,500,25,10,100,105,11,100,150,5.5,2,2,11735,271.5,12006.5 -1,1.2,11,3,12000,200,100,40,0,0,0,0,0,1000,50,20,200,110,12,200,300,6,3,3,13470,428,13898 -2,1.3,1,4,13000,300,0,60,0,0,0,0,0,1500,0,30,300,115,13,300,450,6.5,4,1,15430,584.5,16014.5 -1,1.3999999999999999,7,5,14000,0,50,80,0,0,0,0,0,2000,25,0,400,120,14,400,600,7,5,2,16805,741,17546 -2,1,10,6,15000,100,100,0,0,0,0,0,0,2500,50,10,500,125,15,500,0,7.5,1,3,18440,147.5,18587.5 -1,1.1000000000000001,11,7,16000,200,0,20,0,0,0,0,0,3000,0,20,0,130,16,600,150,8,2,1,19800,304,20104 -2,1.2,1,1,17000,300,50,40,0,0,0,0,0,0,25,30,100,135,17,700,300,8.5,3,2,18090,460.5,18550.5 -1,1.3,7,2,18000,0,100,60,0,0,0,0,0,500,50,0,200,140,18,0,450,9,4,3,18610,617,19227 -2,1.3999999999999999,10,3,19000,100,0,80,0,0,0,0,0,1000,0,10,300,145,19,100,600,9.5,5,1,20570,773.5,21343.5 -1,1,11,4,20000,200,50,0,0,0,0,0,0,1500,25,20,400,150,20,200,0,10,1,2,22205,180,22385 -2,1.1000000000000001,1,5,21000,300,100,20,0,0,0,0,0,2000,50,30,500,155,21,300,150,10.5,2,3,23940,336.5,24276.5 -1,1.2,7,6,22000,0,0,40,0,0,0,0,0,2500,0,0,0,160,22,400,300,11,3,1,24940,493,25433 -2,1.3,10,7,23000,100,50,60,0,0,0,0,0,3000,25,10,100,165,23,500,450,11.5,4,2,26675,649.5,27324.5 -1,1.3999999999999999,11,1,24000,200,100,80,0,0,0,0,0,0,50,20,200,170,24,600,600,12,5,3,24980,806,25786 -2,1,1,2,25000,300,0,0,0,0,0,0,0,500,0,30,300,175,25,700,0,12.5,1,1,26770,212.5,26982.5 -1,1.1000000000000001,7,3,26000,0,50,20,0,0,0,0,0,1000,25,0,400,180,26,0,150,13,2,2,27345,369,27714 -2,1.2,10,4,27000,100,100,40,0,0,0,0,0,1500,50,10,500,185,27,100,300,13.5,3,3,29080,525.5,29605.5 -1,1.3,11,5,28000,200,0,60,0,0,0,0,0,2000,0,20,0,190,28,200,450,14,4,1,30440,682,31122 -2,1.3999999999999999,1,6,29000,300,50,80,0,0,0,0,0,2500,25,30,100,195,29,300,600,14.5,5,2,32175,838.5,33013.5 -1,1,7,7,30000,0,100,0,0,0,0,0,0,3000,50,0,200,200,30,400,0,15,1,3,33450,245,33695 -2,1.1000000000000001,10,1,31000,100,0,20,0,0,0,0,0,0,0,10,300,205,31,500,150,15.5,2,1,31920,401.5,32321.5 -1,1.2,11,2,32000,200,50,40,0,0,0,0,0,500,25,20,400,210,32,600,300,16,3,2,33645,558,34203 -2,1.3,1,3,33000,300,100,60,0,0,0,0,0,1000,50,30,500,215,33,700,450,16.5,4,3,35380,714.5,36094.5 -1,1.3999999999999999,7,4,34000,0,0,80,0,0,0,0,0,1500,0,0,0,220,34,0,600,17,5,1,35580,871,36451 -2,1,10,5,35000,100,50,0,0,0,0,0,0,2000,25,10,100,225,35,100,0,17.5,1,2,37215,277.5,37492.5 -1,1.1000000000000001,11,6,36000,200,100,20,0,0,0,0,0,2500,50,20,200,230,36,200,150,18,2,3,38950,434,39384 -2,1.2,1,7,37000,300,0,40,0,0,0,0,0,3000,0,30,300,235,37,300,300,18.5,3,1,40910,590.5,41500.5 -1,1.3,7,1,38000,0,50,60,0,0,0,0,0,0,25,0,400,240,38,400,450,19,4,2,38810,747,39557 -2,1.3999999999999999,10,2,39000,100,100,80,0,0,0,0,0,500,50,10,500,245,39,500,600,19.5,5,3,40520,903.5,41423.5 -1,1,11,3,40000,200,0,0,0,0,0,0,0,1000,0,20,0,250,40,600,0,20,1,1,41780,310,42090 -2,1.1000000000000001,1,4,41000,300,50,20,0,0,0,0,0,1500,25,30,100,255,41,700,150,20.5,2,2,43515,466.5,43981.5 -1,1.2,7,5,42000,0,100,40,0,0,0,0,0,2000,50,0,200,260,42,0,300,21,3,3,44090,623,44713 -2,1.3,10,6,43000,100,0,60,0,0,0,0,0,2500,0,10,300,265,43,100,450,21.5,4,1,46050,779.5,46829.5 -1,1.3999999999999999,11,7,44000,200,50,80,0,0,0,0,0,3000,25,20,400,270,44,200,600,22,5,2,47785,936,48721 -2,1,1,1,45000,300,100,0,0,0,0,0,0,0,50,30,500,275,45,300,0,22.5,1,3,46000,342.5,46342.5 -1,1.1000000000000001,7,2,46000,0,0,20,0,0,0,0,0,500,0,0,0,280,46,400,150,23,2,1,46920,499,47419 -2,1.2,10,3,47000,100,50,40,0,0,0,0,0,1000,25,10,100,285,47,500,300,23.5,3,2,48655,655.5,49310.5 -1,1.3,11,4,48000,200,100,60,0,0,0,0,0,1500,50,20,200,290,48,600,450,24,4,3,50390,812,51202 -2,1.3999999999999999,1,5,49000,300,0,80,0,0,0,0,0,2000,0,30,300,295,49,700,600,24.5,5,1,52350,968.5,53318.5 -1,1,7,6,50000,0,50,0,0,0,0,0,0,2500,25,0,400,300,50,0,0,25,1,2,52825,375,53200 -2,1.1000000000000001,10,7,51000,100,100,20,0,0,0,0,0,3000,50,10,500,305,51,100,150,25.5,2,3,54560,531.5,55091.5 -1,1.2,11,1,52000,200,0,40,0,0,0,0,0,0,0,20,0,310,52,200,300,26,3,1,52440,688,53128 -2,1.3,1,2,53000,300,50,60,0,0,0,0,0,500,25,30,100,315,53,300,450,26.5,4,2,54155,844.5,54999.5 -1,1.3999999999999999,7,3,54000,0,100,80,0,0,0,0,0,1000,50,0,200,320,54,400,600,27,5,3,55530,1001,56531 -2,1,10,4,55000,100,0,0,0,0,0,0,0,1500,0,10,300,325,55,500,0,27.5,1,1,57390,407.5,57797.5 -1,1.1000000000000001,11,5,56000,200,50,20,0,0,0,0,0,2000,25,20,400,330,56,600,150,28,2,2,59125,564,59689 -2,1.2,1,6,57000,300,100,40,0,0,0,0,0,2500,50,30,500,335,57,700,300,28.5,3,3,60860,720.5,61580.5 -1,1.3,7,7,58000,0,0,60,0,0,0,0,0,3000,0,0,0,340,58,0,450,29,4,1,61060,877,61937 -2,1.3999999999999999,10,1,59000,100,50,80,0,0,0,0,0,0,25,10,100,345,59,100,600,29.5,5,2,59330,1033.5,60363.5 -1,1,11,2,60000,200,100,0,0,0,0,0,0,500,50,20,200,350,60,200,0,30,1,3,60930,440,61370 -2,1.1000000000000001,1,3,61000,300,0,20,0,0,0,0,0,1000,0,30,300,355,61,300,150,30.5,2,1,62890,596.5,63486.5 -1,1.2,7,4,62000,0,50,40,0,0,0,0,0,1500,25,0,400,360,62,400,300,31,3,2,64265,753,65018 -2,1.3,10,5,63000,100,100,60,0,0,0,0,0,2000,50,10,500,365,63,500,450,31.5,4,3,66000,909.5,66909.5 -1,1.3999999999999999,11,6,64000,200,0,80,0,0,0,0,0,2500,0,20,0,370,64,600,600,32,5,1,67360,1066,68426 -2,1,1,7,65000,300,50,0,0,0,0,0,0,3000,25,30,100,375,65,700,0,32.5,1,2,68995,472.5,69467.5 -1,1.1000000000000001,7,1,66000,0,100,20,0,0,0,0,0,0,50,0,200,380,66,0,150,33,2,3,66120,629,66749 -2,1.2,10,2,67000,100,0,40,0,0,0,0,0,500,0,10,300,385,67,100,300,33.5,3,1,68030,785.5,68815.5 -1,1.3,11,3,68000,200,50,60,0,0,0,0,0,1000,25,20,400,390,68,200,450,34,4,2,69765,942,70707 -2,1.3999999999999999,1,4,69000,300,100,80,0,0,0,0,0,1500,50,30,500,395,69,300,600,34.5,5,3,71500,1098.5,72598.5 -1,1,7,5,70000,0,0,0,0,0,0,0,0,2000,0,0,0,400,70,400,0,35,1,1,72400,505,72905 -2,1.1000000000000001,10,6,71000,100,50,20,0,0,0,0,0,2500,25,10,100,405,71,500,150,35.5,2,2,74135,661.5,74796.5 -1,1.2,11,7,72000,200,100,40,0,0,0,0,0,3000,50,20,200,410,72,600,300,36,3,3,75870,818,76688 -2,1.3,1,1,73000,300,0,60,0,0,0,0,0,0,0,30,300,415,73,700,450,36.5,4,1,74360,974.5,75334.5 -1,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -1,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -1,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -1,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -1,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -1,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -1,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -2,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,251000,17500,268500 -2,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,252000,17500,269500 -2,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,253000,17500,270500 -2,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,254000,17500,271500 -2,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,255000,17500,272500 -2,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,256000,17500,273500 -2,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,257000,17500,274500 -1,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -1,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -1,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -1,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -1,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -1,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -1,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -2,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,621000,36500,657500 -2,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,622000,36500,658500 -2,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,623000,36500,659500 -2,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,624000,36500,660500 -2,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,625000,36500,661500 -2,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,626000,36500,662500 -2,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,627000,36500,663500 -1,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -1,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -1,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -1,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -1,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -1,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -1,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -2,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1301000,71000,1372000 -2,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1302000,71000,1373000 -2,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1303000,71000,1374000 -2,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1304000,71000,1375000 -2,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1305000,71000,1376000 -2,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1306000,71000,1377000 -2,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,1307000,71000,1378000 -1,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -1,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -1,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -1,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -1,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -1,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -1,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -2,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2601000,136500,2737500 -2,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2602000,136500,2738500 -2,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2603000,136500,2739500 -2,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2604000,136500,2740500 -2,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2605000,136500,2741500 -2,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2606000,136500,2742500 -2,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,2607000,136500,2743500 -1,0.002,7,-1,4000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,4000000,820000,4820000 -2,0.002,11,-1,4250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,4250000,820000,5070000 -1,0.002,10,-1,4500000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,4500000,820000,5320000 -2,0.002,1,-1,4750000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,4750000,820000,5570000 -1,0.002,8,-1,5000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,5000000,820000,5820000 -2,0.002,12,-1,5250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,5250000,820000,6070000 +SEX,FACT,GORCODE,AGERANGE,PAY,EPB,EXPS,TAXTERM,INCPBEN,OSSBEN,UBISJA,MOTHINC,OTHERINC,PROFITS,CAPALL,LOSSBF,SRP,INCBBS,DIVIDENDS,PENSION,INCPROP,OTHERINV,GIFTAID,GIFTINV,LLIR_RESTRICT_AMT_TOT,TAX_CRED,TEI,TII,TI +1,1,7,1,10000,0,0,0,0,0,0,0,0,0,0,0,0,100,10,0,0,5,1,1,0,0,10000,115,10115 +2,1.1000000000000001,10,2,11000,100,50,20,0,0,0,0,0,500,25,10,100,105,11,100,150,5.5,2,2,0,0,11735,271.5,12006.5 +1,1.2,11,3,12000,200,100,40,0,0,0,0,0,1000,50,20,200,110,12,200,300,6,3,3,0,0,13470,428,13898 +2,1.3,1,4,13000,300,0,60,0,0,0,0,0,1500,0,30,300,115,13,300,450,6.5,4,1,180,36,15430,584.5,16014.5 +1,1.3999999999999999,7,5,14000,0,50,80,0,0,0,0,0,2000,25,0,400,120,14,400,600,7,5,2,0,0,16805,741,17546 +2,1,10,6,15000,100,100,0,0,0,0,0,0,2500,50,10,500,125,15,500,0,7.5,1,3,0,0,18440,147.5,18587.5 +1,1.1000000000000001,11,7,16000,200,0,20,0,0,0,0,0,3000,0,20,0,130,16,600,150,8,2,1,60,12,19800,304,20104 +2,1.2,1,1,17000,300,50,40,0,0,0,0,0,0,25,30,100,135,17,700,300,8.5,3,2,0,0,18090,460.5,18550.5 +1,1.3,7,2,18000,0,100,60,0,0,0,0,0,500,50,0,200,140,18,0,450,9,4,3,0,0,18610,617,19227 +2,1.3999999999999999,10,3,19000,100,0,80,0,0,0,0,0,1000,0,10,300,145,19,100,600,9.5,5,1,240,48,20570,773.5,21343.5 +1,1,11,4,20000,200,50,0,0,0,0,0,0,1500,25,20,400,150,20,200,0,10,1,2,0,0,22205,180,22385 +2,1.1000000000000001,1,5,21000,300,100,20,0,0,0,0,0,2000,50,30,500,155,21,300,150,10.5,2,3,0,0,23940,336.5,24276.5 +1,1.2,7,6,22000,0,0,40,0,0,0,0,0,2500,0,0,0,160,22,400,300,11,3,1,120,24,24940,493,25433 +2,1.3,10,7,23000,100,50,60,0,0,0,0,0,3000,25,10,100,165,23,500,450,11.5,4,2,0,0,26675,649.5,27324.5 +1,1.3999999999999999,11,1,24000,200,100,80,0,0,0,0,0,0,50,20,200,170,24,600,600,12,5,3,0,0,24980,806,25786 +2,1,1,2,25000,300,0,0,0,0,0,0,0,500,0,30,300,175,25,700,0,12.5,1,1,0,0,26770,212.5,26982.5 +1,1.1000000000000001,7,3,26000,0,50,20,0,0,0,0,0,1000,25,0,400,180,26,0,150,13,2,2,0,0,27345,369,27714 +2,1.2,10,4,27000,100,100,40,0,0,0,0,0,1500,50,10,500,185,27,100,300,13.5,3,3,0,0,29080,525.5,29605.5 +1,1.3,11,5,28000,200,0,60,0,0,0,0,0,2000,0,20,0,190,28,200,450,14,4,1,180,36,30440,682,31122 +2,1.3999999999999999,1,6,29000,300,50,80,0,0,0,0,0,2500,25,30,100,195,29,300,600,14.5,5,2,0,0,32175,838.5,33013.5 +1,1,7,7,30000,0,100,0,0,0,0,0,0,3000,50,0,200,200,30,400,0,15,1,3,0,0,33450,245,33695 +2,1.1000000000000001,10,1,31000,100,0,20,0,0,0,0,0,0,0,10,300,205,31,500,150,15.5,2,1,60,12,31920,401.5,32321.5 +1,1.2,11,2,32000,200,50,40,0,0,0,0,0,500,25,20,400,210,32,600,300,16,3,2,0,0,33645,558,34203 +2,1.3,1,3,33000,300,100,60,0,0,0,0,0,1000,50,30,500,215,33,700,450,16.5,4,3,0,0,35380,714.5,36094.5 +1,1.3999999999999999,7,4,34000,0,0,80,0,0,0,0,0,1500,0,0,0,220,34,0,600,17,5,1,240,48,35580,871,36451 +2,1,10,5,35000,100,50,0,0,0,0,0,0,2000,25,10,100,225,35,100,0,17.5,1,2,0,0,37215,277.5,37492.5 +1,1.1000000000000001,11,6,36000,200,100,20,0,0,0,0,0,2500,50,20,200,230,36,200,150,18,2,3,0,0,38950,434,39384 +2,1.2,1,7,37000,300,0,40,0,0,0,0,0,3000,0,30,300,235,37,300,300,18.5,3,1,120,24,40910,590.5,41500.5 +1,1.3,7,1,38000,0,50,60,0,0,0,0,0,0,25,0,400,240,38,400,450,19,4,2,0,0,38810,747,39557 +2,1.3999999999999999,10,2,39000,100,100,80,0,0,0,0,0,500,50,10,500,245,39,500,600,19.5,5,3,0,0,40520,903.5,41423.5 +1,1,11,3,40000,200,0,0,0,0,0,0,0,1000,0,20,0,250,40,600,0,20,1,1,0,0,41780,310,42090 +2,1.1000000000000001,1,4,41000,300,50,20,0,0,0,0,0,1500,25,30,100,255,41,700,150,20.5,2,2,0,0,43515,466.5,43981.5 +1,1.2,7,5,42000,0,100,40,0,0,0,0,0,2000,50,0,200,260,42,0,300,21,3,3,0,0,44090,623,44713 +2,1.3,10,6,43000,100,0,60,0,0,0,0,0,2500,0,10,300,265,43,100,450,21.5,4,1,180,36,46050,779.5,46829.5 +1,1.3999999999999999,11,7,44000,200,50,80,0,0,0,0,0,3000,25,20,400,270,44,200,600,22,5,2,0,0,47785,936,48721 +2,1,1,1,45000,300,100,0,0,0,0,0,0,0,50,30,500,275,45,300,0,22.5,1,3,0,0,46000,342.5,46342.5 +1,1.1000000000000001,7,2,46000,0,0,20,0,0,0,0,0,500,0,0,0,280,46,400,150,23,2,1,60,12,46920,499,47419 +2,1.2,10,3,47000,100,50,40,0,0,0,0,0,1000,25,10,100,285,47,500,300,23.5,3,2,0,0,48655,655.5,49310.5 +1,1.3,11,4,48000,200,100,60,0,0,0,0,0,1500,50,20,200,290,48,600,450,24,4,3,0,0,50390,812,51202 +2,1.3999999999999999,1,5,49000,300,0,80,0,0,0,0,0,2000,0,30,300,295,49,700,600,24.5,5,1,240,48,52350,968.5,53318.5 +1,1,7,6,50000,0,50,0,0,0,0,0,0,2500,25,0,400,300,50,0,0,25,1,2,0,0,52825,375,53200 +2,1.1000000000000001,10,7,51000,100,100,20,0,0,0,0,0,3000,50,10,500,305,51,100,150,25.5,2,3,0,0,54560,531.5,55091.5 +1,1.2,11,1,52000,200,0,40,0,0,0,0,0,0,0,20,0,310,52,200,300,26,3,1,120,24,52440,688,53128 +2,1.3,1,2,53000,300,50,60,0,0,0,0,0,500,25,30,100,315,53,300,450,26.5,4,2,0,0,54155,844.5,54999.5 +1,1.3999999999999999,7,3,54000,0,100,80,0,0,0,0,0,1000,50,0,200,320,54,400,600,27,5,3,0,0,55530,1001,56531 +2,1,10,4,55000,100,0,0,0,0,0,0,0,1500,0,10,300,325,55,500,0,27.5,1,1,0,0,57390,407.5,57797.5 +1,1.1000000000000001,11,5,56000,200,50,20,0,0,0,0,0,2000,25,20,400,330,56,600,150,28,2,2,0,0,59125,564,59689 +2,1.2,1,6,57000,300,100,40,0,0,0,0,0,2500,50,30,500,335,57,700,300,28.5,3,3,0,0,60860,720.5,61580.5 +1,1.3,7,7,58000,0,0,60,0,0,0,0,0,3000,0,0,0,340,58,0,450,29,4,1,180,36,61060,877,61937 +2,1.3999999999999999,10,1,59000,100,50,80,0,0,0,0,0,0,25,10,100,345,59,100,600,29.5,5,2,0,0,59330,1033.5,60363.5 +1,1,11,2,60000,200,100,0,0,0,0,0,0,500,50,20,200,350,60,200,0,30,1,3,0,0,60930,440,61370 +2,1.1000000000000001,1,3,61000,300,0,20,0,0,0,0,0,1000,0,30,300,355,61,300,150,30.5,2,1,60,12,62890,596.5,63486.5 +1,1.2,7,4,62000,0,50,40,0,0,0,0,0,1500,25,0,400,360,62,400,300,31,3,2,0,0,64265,753,65018 +2,1.3,10,5,63000,100,100,60,0,0,0,0,0,2000,50,10,500,365,63,500,450,31.5,4,3,0,0,66000,909.5,66909.5 +1,1.3999999999999999,11,6,64000,200,0,80,0,0,0,0,0,2500,0,20,0,370,64,600,600,32,5,1,240,48,67360,1066,68426 +2,1,1,7,65000,300,50,0,0,0,0,0,0,3000,25,30,100,375,65,700,0,32.5,1,2,0,0,68995,472.5,69467.5 +1,1.1000000000000001,7,1,66000,0,100,20,0,0,0,0,0,0,50,0,200,380,66,0,150,33,2,3,0,0,66120,629,66749 +2,1.2,10,2,67000,100,0,40,0,0,0,0,0,500,0,10,300,385,67,100,300,33.5,3,1,120,24,68030,785.5,68815.5 +1,1.3,11,3,68000,200,50,60,0,0,0,0,0,1000,25,20,400,390,68,200,450,34,4,2,0,0,69765,942,70707 +2,1.3999999999999999,1,4,69000,300,100,80,0,0,0,0,0,1500,50,30,500,395,69,300,600,34.5,5,3,0,0,71500,1098.5,72598.5 +1,1,7,5,70000,0,0,0,0,0,0,0,0,2000,0,0,0,400,70,400,0,35,1,1,0,0,72400,505,72905 +2,1.1000000000000001,10,6,71000,100,50,20,0,0,0,0,0,2500,25,10,100,405,71,500,150,35.5,2,2,0,0,74135,661.5,74796.5 +1,1.2,11,7,72000,200,100,40,0,0,0,0,0,3000,50,20,200,410,72,600,300,36,3,3,0,0,75870,818,76688 +2,1.3,1,1,73000,300,0,60,0,0,0,0,0,0,0,30,300,415,73,700,450,36.5,4,1,180,36,74360,974.5,75334.5 +1,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +1,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +1,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +1,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +1,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +1,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +1,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +2,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 +2,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 +2,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 +2,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 +2,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 +2,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 +2,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 +1,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +1,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +1,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +1,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +1,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +1,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +1,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +2,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 +2,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 +2,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 +2,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 +2,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 +2,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 +2,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 +1,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +1,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +1,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +1,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +1,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +1,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +1,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +2,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 +2,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 +2,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 +2,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 +2,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 +2,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 +2,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 +1,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +1,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +1,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +1,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +1,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +1,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +1,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +2,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 +2,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 +2,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 +2,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 +2,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 +2,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 +2,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 +1,0.002,7,-1,4000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4000000,820000,4820000 +2,0.002,11,-1,4250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4250000,820000,5070000 +1,0.002,10,-1,4500000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4500000,820000,5320000 +2,0.002,1,-1,4750000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4750000,820000,5570000 +1,0.002,8,-1,5000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5000000,820000,5820000 +2,0.002,12,-1,5250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5250000,820000,6070000 diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json index c7e42b54e..a0bad835f 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"8cfab42bcc250fdf1161b22e4fd988fbe8a0473af78f99afea4b1017556633ae","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"d197d6fc2f9dc5918a26ef555d3d2934419f0a9a21ffa2e17379958c692e583d","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"70974ecb9e1a2ac495e0c95e6ccb8b08dfc8e7c5381a0026f470557e28065bf2","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"59767eeb246755f4636e2abbbc9ab3370a64c6142e01cda21a12cb01be95e535","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a29b6ab88ad58d44d4a9b51642b080fffd44223d7d129688b4ac3de71ad58f16","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"a81e4cd867f0215836e2e1cf45dee0735ae7354c6d58e597072836475dabf841","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"5e28e14d1e1c0a422651c981b12f1c2adbdaaf0346d93d2e22a15c91e633e32b","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"30b37e1c4e122db18391c5f76f1a6d432aea970275bcda7a52126dacc923490b","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"ff740a36b03dcda73b889aa43bde7cff5d178de7b3da38e487320c68342bf9a3","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"f2929ed74bed3f9e4456379a1169cf029893be5b971f3e68a3847219cd4e58aa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"826e18043928f5dea5ab9fc128f737a3c6978c23cb61c789ce41b9ecb2d34263","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.122.2"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"d1af0febbf2dfd0448e22441f0378d7574cad860b35b0a1497da70f30b41f828","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"30628808d06d9829ebcbcf460cd355a01261e78c7c73e6006c75bec2e3d60c33","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"067d31b7fbe733d1d182588705e9ce79df0c8e5f6e8f519314765af49b1b00d7","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"e840b69cb05b5cbb76b97b4fcb296244ea843a005e4882459c7132664bb526c2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"8cfab42bcc250fdf1161b22e4fd988fbe8a0473af78f99afea4b1017556633ae","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"d197d6fc2f9dc5918a26ef555d3d2934419f0a9a21ffa2e17379958c692e583d","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"28feb10972c943edffcfcebc8937480c5e81e1d158f66f82dd3acf6c5f8fc0b5","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","uc_is_in_startup_period"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","is_uc_claimant","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"e3445ab6678d10392dfd48ccd139c1b6a7ab601f6191eec6d382d1e6d2ce92b8","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"59767eeb246755f4636e2abbbc9ab3370a64c6142e01cda21a12cb01be95e535","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"a29b6ab88ad58d44d4a9b51642b080fffd44223d7d129688b4ac3de71ad58f16","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"a9ed8bb2f260e7ffa395de3eb5b0b4a6d26d9fed8a6f0758e827a56fdb0d3eab","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"a81e4cd867f0215836e2e1cf45dee0735ae7354c6d58e597072836475dabf841","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"7e94e034cad29c5bae566ffb875c42cddf3a1025c15496907e783ceff1144f8b","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"e2f10f92da81cafd34107b5eb6d0b82f1b9496e8c1de8afde1ff1c28e06fa300","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"2e229a7a31234c493b326b073a84d54f94fbd148a098f05246fb68f20b0f4df1","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"84e898795548080224fc26aef98479c5d56efbcc2004050700afe3790e1b1650","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"5e28e14d1e1c0a422651c981b12f1c2adbdaaf0346d93d2e22a15c91e633e32b","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"30b37e1c4e122db18391c5f76f1a6d432aea970275bcda7a52126dacc923490b","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"ff740a36b03dcda73b889aa43bde7cff5d178de7b3da38e487320c68342bf9a3","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"9764285c76d27ab2b8caf74458c9c8d1c91edbe5b7ab5eba62b6ad516fa417aa","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"6afe61ab1ebcb7353c8e9d30eb4f984b1acad434f00da843a4082c82642fa8a9","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/test_support/microcosm_build/uk_release_input_coverage.py b/test_support/microcosm_build/uk_release_input_coverage.py index f47740126..b27357aed 100644 --- a/test_support/microcosm_build/uk_release_input_coverage.py +++ b/test_support/microcosm_build/uk_release_input_coverage.py @@ -21,6 +21,7 @@ UKReleaseInputCoverageManifest, assert_uk_release_input_coverage_build_stages, assert_uk_release_input_coverage_manifest_current, + load_efrs_engine_derived_exclusions, load_efrs_parity_known_gaps, load_efrs_parity_reference, load_uk_release_input_coverage_manifest, diff --git a/test_support/microcosm_build/uk_spi_income.py b/test_support/microcosm_build/uk_spi_income.py index 94b45a97f..bd46537a7 100644 --- a/test_support/microcosm_build/uk_spi_income.py +++ b/test_support/microcosm_build/uk_spi_income.py @@ -199,6 +199,10 @@ def _write_donor(path: Path, *, drop: str | None = None) -> None: "OTHERINV": [5.0, 10.0, 15.0, 20.0], "GIFTAID": [10.0, 20.0, 30.0, 40.0], "GIFTINV": [1.0, 2.0, 3.0, 4.0], + # Restricted residential finance costs carrying the tape's 20% + # relief in TAX_CRED (microcosm#1106). + "LLIR_RESTRICT_AMT_TOT": [0.0, 0.0, 200.0, 300.0], + "TAX_CRED": [0.0, 0.0, 40.0, 60.0], } ) employment = ( diff --git a/tools/build_uk_ledger_compile_parity_signed_differences.py b/tools/build_uk_ledger_compile_parity_signed_differences.py index 7f897fa19..d875eadb9 100644 --- a/tools/build_uk_ledger_compile_parity_signed_differences.py +++ b/tools/build_uk_ledger_compile_parity_signed_differences.py @@ -69,6 +69,17 @@ class ParityReceiptSpec: "one year forward with its own income-projection ratios." ) +_SPI_PROPERTY_AMOUNT_DRIFT_RATIONALE = ( + "The x1.9 adjustment is retired (microcosm#1106, María's ruling of " + "2026-10-05): ours binds the SPI 2023-24 Table 3.7 net income from " + "property, landlords' profit after allowable expenses and before " + "residential finance costs, moved to the 2025 calibration year by the " + "pinned engine's per-capita GDP index; the frozen incumbent fixture holds " + "1.9 times the SPI amounts (uk-data#311), a factor that set HMRC Property " + "Rental Income Statistics receipts, which are before expenses, against " + "this net concept." +) + _INCOME_ANCHOR_LEDGER_ONLY_RATIONALE = ( "Coverage the incumbent lacks (PolicyEngine/chronicle#280 lane): HMRC's Income Tax " "liabilities Table 2.5 taxpayers, total income and tax by band as the " @@ -623,6 +634,11 @@ def _add_signed_rationale_notes( continue elif name in _CGT_OBSERVED_RATIONALES: row["reason"] = _CGT_OBSERVED_RATIONALES[name] + elif ( + name.startswith("hmrc/property_income_income_band_") + and row.get("kind") == "calibration_drift" + ): + row["reason"] = _SPI_PROPERTY_AMOUNT_DRIFT_RATIONALE elif ( name.startswith("hmrc/") and "_income_band_" in name diff --git a/tools/build_uk_release_input_coverage_manifest.py b/tools/build_uk_release_input_coverage_manifest.py index f719aaa8b..8c0bca4be 100644 --- a/tools/build_uk_release_input_coverage_manifest.py +++ b/tools/build_uk_release_input_coverage_manifest.py @@ -65,6 +65,28 @@ "Tracked in UK_COVERAGE_PROGRESS.md; assign this column to a named source-" "family restoration milestone before promoting it to required." ) +#: Reference inputs the release leaves for the engine to derive (microcosm#1106). +#: The enhanced FRS persists them, but policyengine-uk computes them from +#: inputs the candidate persists, and a persisted copy overrides the formula, +#: so they are reviewed exclusions by declaration, not parity debt: they sit in +#: their own section of the known-gap ledger, outside the evidence-derived +#: ``known_gaps``. The release and calibration boundaries drop them +#: (``national_frame.UK_RELEASE_EXPORT_DROPPED_COLUMNS``). +ENGINE_DERIVED_EXCLUSION_REASON = ( + "formula-owned in policyengine-uk and derived from persisted components; " + "a persisted copy overrides the formula and is not uprated" +) +ENGINE_DERIVED_EXCLUSIONS: dict[str, dict[str, str]] = { + "property_wealth": { + "reason": ENGINE_DERIVED_EXCLUSION_REASON, + "tracking_note": ( + "microcosm#1106 (the uk-data#543 defect): the release and " + "calibration boundaries drop the WAS total, and policyengine-uk " + "sums main_residence_value, other_residential_property_value and " + "non_residential_property_value, which stay required." + ), + }, +} ENTITY_TABLES = ("person", "benunit", "household") READ_BATCH_SIZE = 12 EFFECTIVE_MASS_COVERAGE = { @@ -596,6 +618,7 @@ def build_known_gaps( }, "candidate_evidence": candidate_evidence, "restored_required_columns": RESTORED_REQUIRED_COLUMN_EVIDENCE, + "engine_derived_exclusions": ENGINE_DERIVED_EXCLUSIONS, "known_gaps": { name: { "reason": EXCLUSION_REASON, @@ -722,6 +745,43 @@ def _validate_known_gaps( ) if not str(entry.get("tracking_note", "")).strip(): raise ValueError(f"UK known gap {name!r} needs a tracking note.") + raw_engine_derived = known_gaps_payload.get("engine_derived_exclusions") + if raw_engine_derived != ENGINE_DERIVED_EXCLUSIONS: + raise ValueError( + "efrs_parity_known_gaps.json: engine_derived_exclusions disagrees " + "with the reviewed declaration in this tool." + ) + engine_derived = set(ENGINE_DERIVED_EXCLUSIONS) + off_surface = sorted(engine_derived - surface) + if off_surface: + raise ValueError( + "Engine-derived exclusions must name populated eFRS reference " + f"inputs: {off_surface}." + ) + engine = reference.get("engine") + formula_owned = set( + engine.get("formula_owned_persisted_overrides_included", ()) + if isinstance(engine, dict) + else () + ) + not_formula_owned = sorted(engine_derived - formula_owned) + if not_formula_owned: + raise ValueError( + "Engine-derived exclusions must be formula-owned inputs the " + f"reference persists: {not_formula_owned}." + ) + restored_engine_derived = sorted(engine_derived & restored) + if restored_engine_derived: + raise ValueError( + "Restored UK reference inputs cannot be engine-derived exclusions: " + f"{restored_engine_derived}." + ) + gap_and_engine_derived = sorted(engine_derived & actual) + if gap_and_engine_derived: + raise ValueError( + "A column cannot be both a parity known gap and an engine-derived " + f"exclusion: {gap_and_engine_derived}." + ) def build_manifest( @@ -740,12 +800,14 @@ def build_manifest( if float(share) > 0.0 } columns: dict[str, dict[str, str]] = {} + engine_derived = known_gaps_payload["engine_derived_exclusions"] for name in sorted(populated_layers): - if name in known_gaps: + exclusion = known_gaps.get(name) or engine_derived.get(name) + if exclusion is not None: columns[name] = { "status": "reviewed_exclusion", - "reason": str(known_gaps[name]["reason"]), - "tracking_note": str(known_gaps[name]["tracking_note"]), + "reason": str(exclusion["reason"]), + "tracking_note": str(exclusion["tracking_note"]), } else: columns[name] = {"status": "required"} @@ -850,6 +912,10 @@ def build_manifest( stage_name="regional_property_uprating", candidate_source=candidate_source, ), + "property_components": _source_stage_family_coverage_contract( + stage_name="property_components", + candidate_source=candidate_source, + ), "lcfs_consumption": _source_stage_family_coverage_contract( stage_name="lcfs_consumption", candidate_source=candidate_source, @@ -870,7 +936,10 @@ def build_manifest( "effective-mass share OR the column is pinned in " "restored_required_columns after a source-family restoration; all " "remaining surface columns are reviewed_exclusion with reason " - f"{EXCLUSION_REASON!r} and a UK_COVERAGE_PROGRESS.md tracking note. " + f"{EXCLUSION_REASON!r} and a UK_COVERAGE_PROGRESS.md tracking note, " + "except the engine_derived_exclusions, which are reviewed_exclusion " + "with their own reason because the engine computes them from " + "persisted inputs. " "The final release gate applies the same effective-mass floor, and " "distributional restorations must pass it on their required source " "channel." diff --git a/tools/generate_uk_target_references.py b/tools/generate_uk_target_references.py index d3334ae1f..e6ca9e411 100644 --- a/tools/generate_uk_target_references.py +++ b/tools/generate_uk_target_references.py @@ -76,7 +76,6 @@ } ) -_UK_DATA_REPO = "policyengine-" + "uk-data" DESCRIPTION = ( "UK active-subset Ledger target references for the FRS 2024-25 line. " @@ -803,17 +802,19 @@ def _add_uk_membership_accounting( report["fanout_family_outcomes"] = [ { "family": "hmrc_spi", - "status": "active_with_signed_property_amount_exclusion", + "status": "active_strict_band_pins", "active_reference_count": fanout_counts.get("hmrc_spi", 0), "signed_rationale": ( "SPI income-band targets fan out by strict total-income-band " - "dimension pins, except the HMRC property-income amount " - "surface. Those 13 rows are signed out because Ledger carries " - "the official SPI Table 3.7 net property-income amounts, " - "while the incumbent target applies the populace-side x1.9 " - "property-income undercount adjustment traced to " - f"{_UK_DATA_REPO} PR #311 / issue #230 and HMRC " - "Property Rental Income Statistics." + "dimension pins. The 13 property-income amount rows bind the " + "SPI Table 3.7 net concept unscaled: landlords' profit after " + "allowable expenses and before residential finance costs, " + "which is what policyengine-uk's property_income means. The " + "incumbent's x1.9 scaling (uk-data#311, uk-data#230) set the " + "Property Rental Income Statistics' receipts before expenses " + "against this net amount, so it is retired; the receipts bind " + "on their own variable (microcosm#1106, María's ruling of " + "2026-10-05)." ), }, { @@ -944,14 +945,6 @@ def _add_uk_membership_accounting( }, ] report["signed_exclusion_rationales"] = [ - { - "family": "hmrc_spi", - "target_id": "hmrc.spi.property_income.amount_by_total_income_band", - "status": "signed_excluded", - "signed_rationale": report["targets"][ - "hmrc.spi.property_income.amount_by_total_income_band" - ]["candidates"][0]["signed_rationale"], - }, { "family": "ons_population", "target_id": "ons.population.scotland_households_3plus_children", diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index dd4f92a22..8290d60de 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -101,6 +101,12 @@ HMRCIncomeSourceProvenance, HMRCIncomeTargetSet, ) +from microcosm.build.uk_runtime.hmrc_property_rental import ( + HMRC_PROPERTY_RENTAL_EXPENSE_TYPES, + HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS, + HMRCPropertyRentalBand, + HMRCPropertyRentalFacts, +) from microcosm.build.uk_runtime.lcfs_consumption import ( BUS_FARE_LCFS_CODES, UKLCFSConsumptionStageTransform, @@ -109,6 +115,9 @@ from microcosm.build.uk_runtime.pension_credit_take_up import ( UKPensionCreditTakeUpStageTransform, ) +from microcosm.build.uk_runtime.property_components import ( + UKPropertyComponentsStageTransform, +) from microcosm.build.uk_runtime.regional_uprating import ( UKRegionalPropertyUpratingStageTransform, ) @@ -163,11 +172,11 @@ _SPI_DONOR_SAMPLE_SIZE = 64 #: The packaged FRS spine roster the fixture exercises (manifest minus the #: certified-pair exclusions); moves whenever a spine stage is added. -UK_FIXTURE_STAGE_COUNT = 39 +UK_FIXTURE_STAGE_COUNT = 40 _QRF_ESTIMATORS = 4 # These are the complete object-string surface observed in the unchanged -# legacy 39-stage output. Graph storage uses pandas StringDtype/python. +# legacy 40-stage output. Graph storage uses pandas StringDtype/python. _NORMALIZED_STRING_COLUMNS: Mapping[str, tuple[str, ...]] = { "person": ( "gender", @@ -1062,6 +1071,11 @@ def _spi_donor() -> pd.DataFrame: "GIFTINV": 1.0 + index % 3, } ) + # Every third landlord carries restricted residential finance costs, + # with the tape's 20% relief in TAX_CRED (microcosm#1106). + if row["INCPROP"] > 0.0 and index % 3 == 0: + row["LLIR_RESTRICT_AMT_TOT"] = row["INCPROP"] * 0.4 + row["TAX_CRED"] = 0.2 * row["LLIR_RESTRICT_AMT_TOT"] employment = ( max(row["PAY"] + row["EPB"] - row["EXPS"], 0.0) + row["INCPBEN"] @@ -1363,6 +1377,103 @@ def facts_with(bands: tuple[HMRCCGTBADRBand, ...]) -> HMRCCGTAssetTypeFacts: return facts_with(tuple(bands)) +#: PRIS 2024-25 Table 13 landlord counts (thousands, all tax entities) and +#: Table 8 expense amounts (GBP m): shares only, spread over the fixture. +_FIXTURE_PRIS_BAND_COUNTS = (1300, 860, 330, 150, 80, 50, 30, 20, 10, 10, 40) +_FIXTURE_PRIS_EXPENSE_AMOUNTS = (3810, 6410, 12820, 1330, 4160, 1640, 4580) +#: Receipts and allowable expenses (residential finance costs included) per +#: pound of the landlords' profit, near PRIS against the SPI's profit. +_FIXTURE_PRIS_RECEIPTS_PER_PROFIT = 1.6 +_FIXTURE_PRIS_EXPENSES_PER_PROFIT = 1.0 +_FIXTURE_PRIS_INDIVIDUALS_SHARE = 0.99 + + +def _property_rental_facts(frame: Frame) -> HMRCPropertyRentalFacts: + """Synthetic PRIS facts sized to the frame ``property_components`` reads. + + Table 13's published band shares spread the fixture's landlord mass + (individuals at a fixed share of all tax entities) and receipts are a + fixed multiple of the landlords' profit, so the walk fills every band + in proportion and the data-only payload the graph side reads is exactly + these numbers. + """ + + person = frame.table("person") + household = frame.table("household") + weights = pd.Series( + frame.weights_for("household").values, index=household["household_id"] + ) + person_weight = person["person_household_id"].map(weights).to_numpy(dtype=float) + profit = pd.to_numeric(person["property_income"], errors="raise").to_numpy( + dtype=float + ) + landlord = profit > 0.0 + mass = float(person_weight[landlord].sum()) + total_profit = float((person_weight[landlord] * profit[landlord]).sum()) + if mass <= 0.0 or total_profit <= 0.0: + raise RuntimeError("The fixture frame has no landlords to give receipts.") + share = _FIXTURE_PRIS_INDIVIDUALS_SHARE + all_landlords = mass / share + total_count = float(sum(_FIXTURE_PRIS_BAND_COUNTS)) + bounds = HMRC_PROPERTY_RENTAL_RECEIPTS_BAND_LOWER_BOUNDS + bands = tuple( + HMRCPropertyRentalBand( + lower_bound=lower, + upper_bound=bounds[index + 1] if index + 1 < len(bounds) else None, + landlords=all_landlords * count / total_count, + ) + for index, (lower, count) in enumerate( + zip(bounds, _FIXTURE_PRIS_BAND_COUNTS, strict=True) + ) + ) + receipts = _FIXTURE_PRIS_RECEIPTS_PER_PROFIT * total_profit + expenses = _FIXTURE_PRIS_EXPENSES_PER_PROFIT * total_profit + expense_total = float(sum(_FIXTURE_PRIS_EXPENSE_AMOUNTS)) + expenses_all = expenses / share + return HMRCPropertyRentalFacts( + tax_year=2024, + landlords={ + "individual": mass, + "partnership": all_landlords - mass, + "all": all_landlords, + }, + receipts={ + "individual": receipts, + "partnership": receipts / share - receipts, + "all": receipts / share, + }, + expenses={ + "individual": expenses, + "partnership": expenses_all - expenses, + "all": expenses_all, + }, + expenses_by_type={ + kind: expenses_all * amount / expense_total + for kind, amount in zip( + HMRC_PROPERTY_RENTAL_EXPENSE_TYPES, + _FIXTURE_PRIS_EXPENSE_AMOUNTS, + strict=True, + ) + }, + expense_landlords_by_type={ + kind: all_landlords / 2.0 for kind in HMRC_PROPERTY_RENTAL_EXPENSE_TYPES + }, + receipts_bands=bands, + resource_sha256="synthetic-fixture", + ) + + +def _property_rental_facts_payload(facts: HMRCPropertyRentalFacts) -> dict[str, object]: + return { + **{ + key: (dict(value) if isinstance(value, Mapping) else value) + for key, value in facts.__dict__.items() + if key != "receipts_bands" + }, + "receipts_bands": [dict(band.__dict__) for band in facts.receipts_bands], + } + + def _cgt_asset_type_facts_payload(facts: HMRCCGTAssetTypeFacts) -> dict[str, object]: return { **{ @@ -1587,6 +1698,7 @@ def _build_implementations( cgt_parameters: UKCGTPolicyParameters, cgt_badr_parameters: UKCGTBADRParameters, cgt_asset_type_facts: HMRCCGTAssetTypeFacts | None = None, + property_rental_facts: HMRCPropertyRentalFacts | None = None, ) -> tuple[dict[str, object], dict[str, Frame]]: engine = PolicyEngineUKEngine() contract = load_uk_take_up_contract() @@ -1664,6 +1776,12 @@ def capture_root(frame: Frame) -> Frame: "regional_property_uprating": UKRegionalPropertyUpratingStageTransform( stage=stages["regional_property_uprating"] ), + "property_components": UKPropertyComponentsStageTransform( + stage=stages["property_components"], + spi_tab_path=raw_dir.parent / "spi_donor.csv", + donor_table=spi_donor, + facts=property_rental_facts, + ), "lcfs_consumption": UKLCFSConsumptionStageTransform( stage=stages["lcfs_consumption"], engine=engine, @@ -1762,7 +1880,7 @@ def _run_legacy_plan( stages: Iterable[SourceStageSpec], implementations: Mapping[str, object], ) -> Frame: - """Run the legacy 39-stage StagePlan oracle and return its final frame.""" + """Run the legacy 40-stage StagePlan oracle and return its final frame.""" stages = tuple(stages) committed = load_country_spec("uk") @@ -1880,11 +1998,25 @@ def generate(output: Path) -> None: cgt_parameters=cgt_parameters, cgt_badr_parameters=cgt_badr_parameters, ) - # The asset-type facts are sized to the frame the amounts redraw and the - # anchor leave, so run the oracle up to the residential split once, derive - # them, and only then run the full plan on fresh transforms. + # The PRIS facts are sized to the frame property_components reads and the + # asset-type facts to the frame the amounts redraw and the anchor leave, + # so run the oracle up to each stage once, derive the facts, and only then + # run the full plan on fresh transforms. implementations, _ = _build_implementations(**build_kwargs) stage_names = [stage.stage for stage in stages] + prefix = stages[: stage_names.index("property_components")] + prefix_names = {stage.stage for stage in prefix} + before_receipts = _run_legacy_plan( + prefix, + {name: impl for name, impl in implementations.items() if name in prefix_names}, + ) + property_rental_facts = _property_rental_facts(before_receipts) + _write_json( + sources / "property_rental_facts.json", + _property_rental_facts_payload(property_rental_facts), + ) + build_kwargs["property_rental_facts"] = property_rental_facts + implementations, _ = _build_implementations(**build_kwargs) prefix = stages[: stage_names.index("cgt_residential_split")] prefix_names = {stage.stage for stage in prefix} after_redraw = _run_legacy_plan( @@ -1937,6 +2069,7 @@ def generate(output: Path) -> None: "hmrc_income_targets": "hmrc_income_targets.json", "cgt_distribution": "cgt_distribution.json", "cgt_asset_type_facts": "cgt_asset_type_facts.json", + "property_rental_facts": "property_rental_facts.json", }, "cgt_parameters": cgt_parameters.__dict__, "cgt_badr_parameters": cgt_badr_parameters.__dict__, diff --git a/uv.lock b/uv.lock index d5d767118..709a7846c 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 5 +revision = 3 requires-python = ">=3.13" resolution-markers = [ "python_full_version >= '3.14' and sys_platform == 'win32'", @@ -858,7 +858,7 @@ requires-dist = [ { name = "openpyxl", marker = "extra == 'uk'", specifier = ">=3.1" }, { name = "pandas", specifier = ">=2" }, { name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.122.2" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.123.0" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=2.2.1,<3" }, { name = "pyarrow", specifier = ">=15" }, { name = "pyyaml", specifier = ">=6" }, @@ -938,7 +938,7 @@ requires-dist = [ { name = "microcosm-diagnostics", editable = "packages/microcosm-diagnostics" }, { name = "packaging", specifier = ">=24" }, { name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.122.2" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.123.0" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = ">=2.2.1,<3" }, ] provides-extras = ["us", "uk"] @@ -1037,7 +1037,7 @@ requires-dist = [ { name = "numpy", specifier = ">=2" }, { name = "pandas", specifier = ">=2.3" }, { name = "policyengine-core", marker = "extra == 'policyengine'", specifier = "==3.32.5" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.122.2" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = ">=2.123.0" }, { name = "policyengine-us", marker = "extra == 'policyengine'", specifier = ">=2.2.1,<3" }, { name = "tables", marker = "extra == 'axiom'", specifier = ">=3" }, ] @@ -1556,7 +1556,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { name = "ptyprocess", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -1657,7 +1657,7 @@ wheels = [ [[package]] name = "policyengine-uk" -version = "2.122.2" +version = "2.123.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "microdf-python" }, @@ -1665,9 +1665,9 @@ dependencies = [ { name = "pydantic" }, { name = "tables" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/07/62/4378fd8e493df42fef30c58924dbb0f7ca8111c927302f6e60be862d67d0/policyengine_uk-2.122.2.tar.gz", hash = "sha256:0083793f1d398feef28a64db5508d5a64bcd7834feeade6cde1055d419d505ed", size = 1976779, upload-time = "2026-10-06T02:10:56.786Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/f9/17a44867e50c514dfb36ec8e42b259b7cd02ee58537f3a0cf8a23d3e66ac/policyengine_uk-2.123.0.tar.gz", hash = "sha256:23cbdfca05318c8bf2b7f76f245c6e4450d2ff0b968ba3b674f285e5fe97a535", size = 1995554, upload-time = "2026-10-07T09:33:05.423Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/11/09948c900ca6d58c1050c89b9c93d8f5884244aa6ac95661ef1a2ee9eb9a/policyengine_uk-2.122.2-py3-none-any.whl", hash = "sha256:14cefcedce43ce4a37d659a0ff17ad05695de0dc8e0c5f6e2259a69944cb5558", size = 3118697, upload-time = "2026-10-06T02:10:54.896Z" }, + { url = "https://files.pythonhosted.org/packages/21/cf/bb4e377c6eb7a94520c26aad2b772f17dfa15d021e44bb6f862c0de7d1da/policyengine_uk-2.123.0-py3-none-any.whl", hash = "sha256:96a1ab6927ce1117a49287d403025c84cf48d15c3664f6b4a33d07f65d8b4f85", size = 3149283, upload-time = "2026-10-07T09:33:03.252Z" }, ] [[package]]