diff --git a/changelog.d/882-uc-build-diagnostics.fixed.md b/changelog.d/882-uc-build-diagnostics.fixed.md new file mode 100644 index 000000000..d7735ef8a --- /dev/null +++ b/changelog.d/882-uc-build-diagnostics.fixed.md @@ -0,0 +1 @@ +Pass benefit-unit head and parent roles into the UK source graph's UC capital stage, fixing its scoped execution after the relationship repairs. Extend UC matrix diagnostics with verified comparison controls, original-source concentration and paid-claim joint support, and document the remaining empty and single-source cells. diff --git a/changelog.d/uk-uc-average-hold-metadata.fixed.md b/changelog.d/uk-uc-average-hold-metadata.fixed.md new file mode 100644 index 000000000..a94431e96 --- /dev/null +++ b/changelog.d/uk-uc-average-hold-metadata.fixed.md @@ -0,0 +1,4 @@ +Use explicit source-window averaging for the five UK UC paid child-count targets, +removing misleading December-to-annual hold annotations while preserving target +values and selected observations. Clarify the allowance-based family proxy and +the separate source-compilation and population-comparison receipts. diff --git a/changelog.d/uk-uc-lp-evidence.added.md b/changelog.d/uk-uc-lp-evidence.added.md new file mode 100644 index 000000000..74aca0685 --- /dev/null +++ b/changelog.d/uk-uc-lp-evidence.added.md @@ -0,0 +1 @@ +Add authenticated producers and exact replay checks for the named, full-supported and bounded-redistribution UC linear-program diagnostics, with aggregate provenance and synthetic tests. diff --git a/changelog.d/uk-uc-stale-fit-deferrals.fixed.md b/changelog.d/uk-uc-stale-fit-deferrals.fixed.md new file mode 100644 index 000000000..a44bad13b --- /dev/null +++ b/changelog.d/uk-uc-stale-fit-deferrals.fixed.md @@ -0,0 +1 @@ +Remove five obsolete UK release-fit deferrals and restore the unchanged 25% check for those targets. Retain the separate CGT deferral and keep unsupported UC payment-tail targets release-blocking. diff --git a/changelog.d/uk-uc-support-diagnostics.added.md b/changelog.d/uk-uc-support-diagnostics.added.md new file mode 100644 index 000000000..e3aaa1146 --- /dev/null +++ b/changelog.d/uk-uc-support-diagnostics.added.md @@ -0,0 +1 @@ +Add a receipted UK Universal Credit matrix-support diagnostic with clone-aware source concentration, no-refit source removal, and explicitly scoped capacity and feasibility checks. diff --git a/docs/evidence/uk-uc-882/calibration-comparison.json b/docs/evidence/uk-uc-882/calibration-comparison.json new file mode 100644 index 000000000..20ee0b2e6 --- /dev/null +++ b/docs/evidence/uk-uc-882/calibration-comparison.json @@ -0,0 +1,5703 @@ +{ + "purpose": "Aggregate development evidence; no source IDs, record data or certified release.", + "date": "2026-09-09", + "retained_and_fresh_are_separate_controlled_populations": true, + "arms": { + "baseline-uk297-v4": { + "status": "completed_private_diagnostic", + "receipt_sha256": "3c41f9f859a9b6835121a51635f292be630e6225a80bffe46f013d4cebe78081", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", + "manifest_sha256": "a89fb928d9da26c341a02c5b59e312e76bd144a23aa9ffd0e1fd559f626d569a", + "target_contract_sha256": "ae6401db7eff8047d345d31a800cbc483c65112905c3ddcefd47b50c1028b93e", + "target_references_sha256": "c831712077251df5e7dc2cc69435e1c83b2c0737d8bc7ae4cfb1ffef643f2e48", + "matrix_sha256": "acc1a362c5140629e718f84a67959ce72f020d497e873b2f36ad91cb7060c1a4", + "inputs_private_sha256": "63e6713561057a9cdbea17406501dc81ab9bd4aeeeff4b0191073d5576537143", + "weights_private_sha256": "c805a719cce26d29b2896d764eac6318584d4bcacf6fe397c4730e802721d53d", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "epochs": 1500, + "learning_rate": 0.02, + "seed": 0, + "mass": "free", + "max_weight_ratio": 10, + "l0_lambda": 0, + "target_loss_cap": 10.0, + "target_weight_rule": "family_equal", + "initial_loss": 0.29813098907470703, + "final_loss": 0.011801282514179076, + "elapsed_seconds": 91.97921324998606, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 13846.354582612856, + "source_household_ess": 5025.816612908771, + "weight_mass": 29921622.589822523, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1278537.0, + "prior": 860596.475731856, + "new_calibrated": 977961.389379989, + "household_support": 1367, + "original_source_household_support": 532, + "source_contribution_ess": 195.3651844357, + "largest_source_contribution_share": 0.025940025, + "own_target_error_percent": -23.509340020665103 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1100617.5555555555, + "prior": 867779.3776267973, + "new_calibrated": 997738.6078262329, + "household_support": 1307, + "original_source_household_support": 503, + "source_contribution_ess": 137.4223434653, + "largest_source_contribution_share": 0.0450107068, + "own_target_error_percent": -9.34738385827334 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 494553.2222222222, + "prior": 387874.3329053013, + "new_calibrated": 493644.3554344177, + "household_support": 537, + "original_source_household_support": 203, + "source_contribution_ess": 70.6783691096, + "largest_source_contribution_share": 0.0552650783, + "own_target_error_percent": -0.18377532426552268 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 174668.8888888889, + "prior": 119179.3662093048, + "new_calibrated": 175138.5635528564, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 21.1782753087, + "largest_source_contribution_share": 0.1185903422, + "own_target_error_percent": 0.2688942873314115 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 77376.7777777778, + "prior": 70230.2187944456, + "new_calibrated": 77600.0551757812, + "household_support": 80, + "original_source_household_support": 29, + "source_contribution_ess": 9.4488025547, + "largest_source_contribution_share": 0.2874220859, + "own_target_error_percent": 0.2885586663283535 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 3446962.0, + "prior": 2593939.1244838717, + "new_calibrated": 3449207.4777703397, + "household_support": 3351, + "original_source_household_support": 1385, + "source_contribution_ess": 396.8156313899, + "largest_source_contribution_share": 0.0107430912, + "own_target_error_percent": 0.06514367638341678 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2226220.0, + "prior": 1229649.8008789453, + "new_calibrated": 1822792.5490250697, + "household_support": 1913, + "original_source_household_support": 674, + "source_contribution_ess": 227.4665617068, + "largest_source_contribution_share": 0.0246374279, + "own_target_error_percent": -18.12163447345412 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 284345.5555555556, + "prior": 369575.2245863437, + "new_calibrated": 284416.8962287903, + "household_support": 567, + "original_source_household_support": 273, + "source_contribution_ess": 110.5489125678, + "largest_source_contribution_share": 0.0411851686, + "own_target_error_percent": 0.025089427930491404 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 899534.6666666666, + "prior": 1076009.9703887654, + "new_calibrated": 899290.4223442078, + "household_support": 1520, + "original_source_household_support": 644, + "source_contribution_ess": 248.2754954536, + "largest_source_contribution_share": 0.0230957004, + "own_target_error_percent": -0.027152296794064057 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 49707.6312564172, + "new_calibrated": 37039.2030639648, + "household_support": 56, + "original_source_household_support": 20, + "source_contribution_ess": 15.9244304083, + "largest_source_contribution_share": 0.1200638965, + "own_target_error_percent": 0.05187213388655465 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18256.8823852539, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.2084552446, + "largest_source_contribution_share": 0.2335846424, + "own_target_error_percent": -0.017073465203176763 + }, + { + "name": "dwp.uc.households@2025", + "target": 6758888.888888889, + "prior": 5269174.120337904, + "new_calibrated": 6455707.345368408, + "household_support": 7142, + "original_source_household_support": 2871, + "source_contribution_ess": 823.9802584698, + "largest_source_contribution_share": 0.0069564677, + "own_target_error_percent": -4.485671365583322 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "inherited": 289313914131.21344, + "calibrated": 289184022344.2894 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "inherited": 50393322117.66525, + "calibrated": 50719256770.04606 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "inherited": 129477328617.13513, + "calibrated": 136760369461.68594 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "inherited": 16108472393.809944, + "calibrated": 15764502092.868187 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2643284992.71517, + "inherited": 12151292067.240917, + "calibrated": 2803473152.034053 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "inherited": 1153611067512.239, + "calibrated": 1160470974289.8384 + } + ], + "canonical_parity": null, + "original_canonical_outcome": null + }, + "cy-paid-structural-run": { + "status": "completed_private_diagnostic", + "receipt_sha256": "107b23599535084cc8161661b7be7531b6d02d8993f4aff95c89921c133f9c6b", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "target_contract_sha256": "952ab75de48fc72730df19069282b3c7ab7448fc34812a8d41a211489fe38730", + "target_references_sha256": "9e8da6974bfcb59a50332b2959207bcfc0fdd761c7ec3e4cd5dd4a2a5a45c2ac", + "matrix_sha256": "acc1a362c5140629e718f84a67959ce72f020d497e873b2f36ad91cb7060c1a4", + "inputs_private_sha256": "0ed497510acc4ec2d923caa40e927fe8eb717d2a747c5b3c82a22bff2048f22b", + "weights_private_sha256": "ff31e01c63adc95b7e3c39ca8a288abb247bf9e99fefa2b4863f7204dd06874e", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "epochs": 1500, + "learning_rate": 0.02, + "seed": 0, + "mass": "free", + "max_weight_ratio": 10, + "l0_lambda": 0, + "target_loss_cap": 10.0, + "target_weight_rule": "family_equal", + "initial_loss": 0.2981245219707489, + "final_loss": 0.011701116117758042, + "elapsed_seconds": 81.03798508300679, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 13721.725417720414, + "source_household_ess": 4956.468667603232, + "weight_mass": 29928312.850517325, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1190123.8333333333, + "prior": 860596.475731856, + "new_calibrated": 988141.7183823694, + "household_support": 1367, + "original_source_household_support": 532, + "source_contribution_ess": 196.4432348266, + "largest_source_contribution_share": 0.0257676779, + "own_target_error_percent": -16.971520886632995 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1049895.5, + "prior": 867779.3776267973, + "new_calibrated": 980515.6415391077, + "household_support": 1307, + "original_source_household_support": 503, + "source_contribution_ess": 134.2788858851, + "largest_source_contribution_share": 0.0473283199, + "own_target_error_percent": -6.608263247236734 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 477887.6666666667, + "prior": 387874.3329053013, + "new_calibrated": 477141.3753089905, + "household_support": 537, + "original_source_household_support": 203, + "source_contribution_ess": 75.0513557132, + "largest_source_contribution_share": 0.0573206744, + "own_target_error_percent": -0.15616459886518275 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 170713.6666666667, + "prior": 119179.3662093048, + "new_calibrated": 170360.211769104, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 21.9327103836, + "largest_source_contribution_share": 0.1122564235, + "own_target_error_percent": -0.2070454606618144 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 76320.0833333333, + "prior": 70230.2187944456, + "new_calibrated": 76268.0966186523, + "household_support": 80, + "original_source_household_support": 29, + "source_contribution_ess": 9.9629234978, + "largest_source_contribution_share": 0.2763860247, + "own_target_error_percent": -0.06811669014293864 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 2990070.1666666665, + "prior": 2593939.1244838717, + "new_calibrated": 2992248.18428421, + "household_support": 3351, + "original_source_household_support": 1385, + "source_contribution_ess": 381.9125385689, + "largest_source_contribution_share": 0.0125526351, + "own_target_error_percent": 0.07284168919592382 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2138780.1666666665, + "prior": 1229649.8008789453, + "new_calibrated": 1865550.21276953, + "household_support": 1913, + "original_source_household_support": 674, + "source_contribution_ess": 233.2516693604, + "largest_source_contribution_share": 0.0248753197, + "own_target_error_percent": -12.775036824984731 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 241130.9166666667, + "prior": 369575.2245863437, + "new_calibrated": 246687.4713220596, + "household_support": 567, + "original_source_household_support": 273, + "source_contribution_ess": 153.4368466782, + "largest_source_contribution_share": 0.0182917763, + "own_target_error_percent": 2.3043725508969715 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 826160.8333333334, + "prior": 1076009.9703887654, + "new_calibrated": 826876.8308486938, + "household_support": 1520, + "original_source_household_support": 644, + "source_contribution_ess": 282.8423925494, + "largest_source_contribution_share": 0.0231280251, + "own_target_error_percent": 0.0866656329460147 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 49707.6312564172, + "new_calibrated": 36954.8482666016, + "household_support": 56, + "original_source_household_support": 20, + "source_contribution_ess": 15.8872620836, + "largest_source_contribution_share": 0.1191375599, + "own_target_error_percent": -0.17599063586818398 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18233.8123168945, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.2092227826, + "largest_source_contribution_share": 0.2335474008, + "own_target_error_percent": -0.1434155701287021 + }, + { + "name": "dwp.uc.households@2025", + "target": 6197311.0, + "prior": 5269174.120337904, + "new_calibrated": 5931362.699224494, + "household_support": 7142, + "original_source_household_support": 2871, + "source_contribution_ess": 816.4086464907, + "largest_source_contribution_share": 0.0078238611, + "own_target_error_percent": -4.291349922176013 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "inherited": 289313914131.21344, + "calibrated": 289535332447.16125 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "inherited": 50393322117.66525, + "calibrated": 50794175944.29352 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "inherited": 129477328617.13513, + "calibrated": 137545214240.72293 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "inherited": 16108472393.809944, + "calibrated": 15719417047.011074 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2643284992.71517, + "inherited": 12151292067.240917, + "calibrated": 2890066386.2352314 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "inherited": 1153611067512.239, + "calibrated": 1162343280948.8562 + } + ], + "canonical_parity": null, + "original_canonical_outcome": null + }, + "cy-paid-administrative-run": { + "status": "completed_private_diagnostic", + "receipt_sha256": "65e9210f197e03b562f2f3ecb906571d7ea71914e2c8a6df07349c65f2d23297", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "target_contract_sha256": "1ca9075b247ba9b1a3feff575dab18c1301c4b2c12864a0964fa91d2d1e7e73d", + "target_references_sha256": "9e8da6974bfcb59a50332b2959207bcfc0fdd761c7ec3e4cd5dd4a2a5a45c2ac", + "matrix_sha256": "acc1a362c5140629e718f84a67959ce72f020d497e873b2f36ad91cb7060c1a4", + "inputs_private_sha256": "0ed497510acc4ec2d923caa40e927fe8eb717d2a747c5b3c82a22bff2048f22b", + "weights_private_sha256": "ff31e01c63adc95b7e3c39ca8a288abb247bf9e99fefa2b4863f7204dd06874e", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "epochs": 1500, + "learning_rate": 0.02, + "seed": 0, + "mass": "free", + "max_weight_ratio": 10, + "l0_lambda": 0, + "target_loss_cap": 10.0, + "target_weight_rule": "family_equal", + "initial_loss": 0.2981245219707489, + "final_loss": 0.011701116117758042, + "elapsed_seconds": 84.99113762500929, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 13721.725417720414, + "source_household_ess": 4956.468667603232, + "weight_mass": 29928312.850517325, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1190123.8333333333, + "prior": 860596.475731856, + "new_calibrated": 988141.7183823694, + "household_support": 1367, + "original_source_household_support": 532, + "source_contribution_ess": 196.4432348266, + "largest_source_contribution_share": 0.0257676779, + "own_target_error_percent": -16.971520886632995 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1049895.5, + "prior": 867779.3776267973, + "new_calibrated": 980515.6415391077, + "household_support": 1307, + "original_source_household_support": 503, + "source_contribution_ess": 134.2788858851, + "largest_source_contribution_share": 0.0473283199, + "own_target_error_percent": -6.608263247236734 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 477887.6666666667, + "prior": 387874.3329053013, + "new_calibrated": 477141.3753089905, + "household_support": 537, + "original_source_household_support": 203, + "source_contribution_ess": 75.0513557132, + "largest_source_contribution_share": 0.0573206744, + "own_target_error_percent": -0.15616459886518275 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 170713.6666666667, + "prior": 119179.3662093048, + "new_calibrated": 170360.211769104, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 21.9327103836, + "largest_source_contribution_share": 0.1122564235, + "own_target_error_percent": -0.2070454606618144 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 76320.0833333333, + "prior": 70230.2187944456, + "new_calibrated": 76268.0966186523, + "household_support": 80, + "original_source_household_support": 29, + "source_contribution_ess": 9.9629234978, + "largest_source_contribution_share": 0.2763860247, + "own_target_error_percent": -0.06811669014293864 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 2990070.1666666665, + "prior": 2593939.1244838717, + "new_calibrated": 2992248.18428421, + "household_support": 3351, + "original_source_household_support": 1385, + "source_contribution_ess": 381.9125385689, + "largest_source_contribution_share": 0.0125526351, + "own_target_error_percent": 0.07284168919592382 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2138780.1666666665, + "prior": 1229649.8008789453, + "new_calibrated": 1865550.21276953, + "household_support": 1913, + "original_source_household_support": 674, + "source_contribution_ess": 233.2516693604, + "largest_source_contribution_share": 0.0248753197, + "own_target_error_percent": -12.775036824984731 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 241130.9166666667, + "prior": 369575.2245863437, + "new_calibrated": 246687.4713220596, + "household_support": 567, + "original_source_household_support": 273, + "source_contribution_ess": 153.4368466782, + "largest_source_contribution_share": 0.0182917763, + "own_target_error_percent": 2.3043725508969715 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 826160.8333333334, + "prior": 1076009.9703887654, + "new_calibrated": 826876.8308486938, + "household_support": 1520, + "original_source_household_support": 644, + "source_contribution_ess": 282.8423925494, + "largest_source_contribution_share": 0.0231280251, + "own_target_error_percent": 0.0866656329460147 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 49707.6312564172, + "new_calibrated": 36954.8482666016, + "household_support": 56, + "original_source_household_support": 20, + "source_contribution_ess": 15.8872620836, + "largest_source_contribution_share": 0.1191375599, + "own_target_error_percent": -0.17599063586818398 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18233.8123168945, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.2092227826, + "largest_source_contribution_share": 0.2335474008, + "own_target_error_percent": -0.1434155701287021 + }, + { + "name": "dwp.uc.households@2025", + "target": 6197311.0, + "prior": 5269174.120337904, + "new_calibrated": 5931362.699224494, + "household_support": 7142, + "original_source_household_support": 2871, + "source_contribution_ess": 816.4086464907, + "largest_source_contribution_share": 0.0078238611, + "own_target_error_percent": -4.291349922176013 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "inherited": 289313914131.21344, + "calibrated": 289535332447.16125 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "inherited": 50393322117.66525, + "calibrated": 50794175944.29352 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "inherited": 129477328617.13513, + "calibrated": 137545214240.72293 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "inherited": 16108472393.809944, + "calibrated": 15719417047.011074 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2643284992.71517, + "inherited": 12151292067.240917, + "calibrated": 2890066386.2352314 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "inherited": 1153611067512.239, + "calibrated": 1162343280948.8562 + } + ], + "canonical_parity": null, + "original_canonical_outcome": null + }, + "fy-paid-administrative-run": { + "status": "completed_private_diagnostic", + "receipt_sha256": "679b5aecf897c320cb8f3afc093a73d60faaf965c9935c272c277dd233f20402", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "target_contract_sha256": "53c23b0f0343fdcecd6feef7eecf5e5e5e2185651ba929fcad0136adb49d262f", + "target_references_sha256": "a90fb7fa1ae54db55361f35d23cbea91c1ebff82e79f8b4db80c78e3f74276eb", + "matrix_sha256": "acc1a362c5140629e718f84a67959ce72f020d497e873b2f36ad91cb7060c1a4", + "inputs_private_sha256": "0d70bf176d0522bef7b26db2d7b898c12bcab096c7162395ad40673fcb9a2ece", + "weights_private_sha256": "9eb89509cb5f90510f72c26e551450eba6569f32bb09a3a513d95d2fe36bbeb4", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "epochs": 1500, + "learning_rate": 0.02, + "seed": 0, + "mass": "free", + "max_weight_ratio": 10, + "l0_lambda": 0, + "target_loss_cap": 10.0, + "target_weight_rule": "family_equal", + "initial_loss": 0.298128604888916, + "final_loss": 0.011843518610159696, + "elapsed_seconds": 89.80818491696846, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 14255.521667261879, + "source_household_ess": 5145.0346137511115, + "weight_mass": 29877865.196713805, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1195831.0833333333, + "prior": 860596.475731856, + "new_calibrated": 958749.3010704572, + "household_support": 1367, + "original_source_household_support": 532, + "source_contribution_ess": 198.9295768827, + "largest_source_contribution_share": 0.0263894348, + "own_target_error_percent": -19.82569156858004 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1048750.0833333333, + "prior": 867779.3776267973, + "new_calibrated": 958443.85887146, + "household_support": 1307, + "original_source_household_support": 503, + "source_contribution_ess": 141.0900715772, + "largest_source_contribution_share": 0.0436294189, + "own_target_error_percent": -8.61084312621413 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 476283.6666666667, + "prior": 387874.3329053013, + "new_calibrated": 475704.8692092896, + "household_support": 537, + "original_source_household_support": 203, + "source_contribution_ess": 75.36808994, + "largest_source_contribution_share": 0.0574937681, + "own_target_error_percent": -0.12152368386425527 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 169737.3333333333, + "prior": 119179.3662093048, + "new_calibrated": 169115.4536437988, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 22.4678691351, + "largest_source_contribution_share": 0.1106971104, + "own_target_error_percent": -0.36637767150097256 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 76082.3333333333, + "prior": 70230.2187944456, + "new_calibrated": 76041.2071838379, + "household_support": 80, + "original_source_household_support": 29, + "source_contribution_ess": 10.1091079806, + "largest_source_contribution_share": 0.2732892584, + "own_target_error_percent": -0.05405479523769019 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 3179423.0, + "prior": 2593939.1244838717, + "new_calibrated": 3181518.9223003387, + "household_support": 3351, + "original_source_household_support": 1385, + "source_contribution_ess": 391.6101518913, + "largest_source_contribution_share": 0.0118896721, + "own_target_error_percent": 0.06592146752222305 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2148910.1666666665, + "prior": 1229649.8008789453, + "new_calibrated": 1819870.8080322796, + "household_support": 1913, + "original_source_household_support": 674, + "source_contribution_ess": 238.9726782597, + "largest_source_contribution_share": 0.0229776468, + "own_target_error_percent": -15.311917814823506 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 254341.9166666667, + "prior": 369575.2245863437, + "new_calibrated": 254390.2432632446, + "household_support": 567, + "original_source_household_support": 273, + "source_contribution_ess": 155.8516034124, + "largest_source_contribution_share": 0.0177771816, + "own_target_error_percent": 0.019000641817634722 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 817774.75, + "prior": 1076009.9703887654, + "new_calibrated": 818183.8819465637, + "household_support": 1520, + "original_source_household_support": 644, + "source_contribution_ess": 286.9717303513, + "largest_source_contribution_share": 0.0228806659, + "own_target_error_percent": 0.05002990695954779 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 49707.6312564172, + "new_calibrated": 37004.9493713379, + "household_support": 56, + "original_source_household_support": 20, + "source_contribution_ess": 15.8191878441, + "largest_source_contribution_share": 0.1201094777, + "own_target_error_percent": -0.040655398871158877 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18255.0126953125, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.2216864344, + "largest_source_contribution_share": 0.2336053298, + "own_target_error_percent": -0.02731273103778742 + }, + { + "name": "dwp.uc.households@2025", + "target": 6401649.416666667, + "prior": 5269174.120337904, + "new_calibrated": 6073963.855542427, + "household_support": 7142, + "original_source_household_support": 2871, + "source_contribution_ess": 833.7766107161, + "largest_source_contribution_share": 0.0068845238, + "own_target_error_percent": -5.1187676768289165 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "inherited": 289313914131.21344, + "calibrated": 288742887597.2523 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "inherited": 50393322117.66525, + "calibrated": 50629321211.83277 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "inherited": 129477328617.13513, + "calibrated": 136346961519.19482 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "inherited": 16108472393.809944, + "calibrated": 15833053004.078028 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2643284992.71517, + "inherited": 12151292067.240917, + "calibrated": 2846591566.467654 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "inherited": 1153611067512.239, + "calibrated": 1160235579428.1265 + } + ], + "canonical_parity": null, + "original_canonical_outcome": null + }, + "fresh-current-recovered": { + "status": "completed_private_diagnostic", + "receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "4a50ee9568a01bbb57f73d927084ed6b4b9e52249b51a2338455874ae6e382b5", + "manifest_sha256": "a95d0ee9f87f36947eaecdb3de29cf81a91e47ccaa822fed42da677eedca877f", + "target_contract_sha256": "1ca9075b247ba9b1a3feff575dab18c1301c4b2c12864a0964fa91d2d1e7e73d", + "target_references_sha256": "9e8da6974bfcb59a50332b2959207bcfc0fdd761c7ec3e4cd5dd4a2a5a45c2ac", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "inputs_private_sha256": "4a69939b0fb48570cfe1dec931a89b5445b91d8e527999ca0db672552d5bd825", + "weights_private_sha256": "dd1a4953cd7243f7491d9d2d274c1deaa0ee71c757ba2bbf37ca3e0520fbe434", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "doctrine": { + "epochs": 1500, + "learning_rate": 0.02, + "max_weight_ratio": 10.0, + "seed": 0, + "target_loss_cap": 10.0, + "scale_rule": "default_target_loss_scales", + "target_weight_rule": "family_equal", + "mass_rule": "free", + "l0_lambda": 0.0 + }, + "initial_loss": 0.2981724143028259, + "final_loss": 0.01182203087237668, + "elapsed_seconds": 83.92460187501274, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 14049.762395866685, + "source_household_ess": 5062.211654145074, + "weight_mass": 29900349.733421523, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1190123.8333333333, + "prior": 852570.7672727915, + "new_calibrated": 958658.2978921045, + "household_support": 1357, + "original_source_household_support": 527, + "source_contribution_ess": 199.0512689001, + "largest_source_contribution_share": 0.026549959, + "own_target_error_percent": -19.448861451075505 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1049895.5, + "prior": 866805.0786886854, + "new_calibrated": 982488.795085907, + "household_support": 1305, + "original_source_household_support": 504, + "source_contribution_ess": 140.4509218966, + "largest_source_contribution_share": 0.0452641573, + "own_target_error_percent": -6.42032515751263 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 477887.6666666667, + "prior": 384575.415136111, + "new_calibrated": 477891.9506759644, + "household_support": 533, + "original_source_household_support": 201, + "source_contribution_ess": 74.2864813629, + "largest_source_contribution_share": 0.0571751132, + "own_target_error_percent": 0.000896446926024197 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 170713.6666666667, + "prior": 119179.3662093048, + "new_calibrated": 170759.3681640625, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 23.1268701378, + "largest_source_contribution_share": 0.0931646245, + "own_target_error_percent": 0.026770848689605664 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 76320.0833333333, + "prior": 68485.0408009181, + "new_calibrated": 76415.2034606934, + "household_support": 78, + "original_source_household_support": 28, + "source_contribution_ess": 9.8668918668, + "largest_source_contribution_share": 0.2754864806, + "own_target_error_percent": 0.12463315448001389 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 2990070.1666666665, + "prior": 2627176.614961808, + "new_calibrated": 2992522.4791736603, + "household_support": 3398, + "original_source_household_support": 1409, + "source_contribution_ess": 388.8594173461, + "largest_source_contribution_share": 0.0126602282, + "own_target_error_percent": 0.08201521604183082 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2138780.1666666665, + "prior": 1234482.5039304134, + "new_calibrated": 1839214.2526192775, + "household_support": 1917, + "original_source_household_support": 677, + "source_contribution_ess": 237.3702930812, + "largest_source_contribution_share": 0.0241796339, + "own_target_error_percent": -14.00639105954815 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 241130.9166666667, + "prior": 363965.6286277607, + "new_calibrated": 246619.8213291168, + "household_support": 557, + "original_source_household_support": 268, + "source_contribution_ess": 149.5793271487, + "largest_source_contribution_share": 0.0240707882, + "own_target_error_percent": 2.276317254679472 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 826160.8333333334, + "prior": 1057133.1641774026, + "new_calibrated": 826999.3626594543, + "household_support": 1498, + "original_source_household_support": 634, + "source_contribution_ess": 288.9887811883, + "largest_source_contribution_share": 0.0192366925, + "own_target_error_percent": 0.10149710471478723 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 47962.4532628897, + "new_calibrated": 37098.3656311035, + "household_support": 54, + "original_source_household_support": 19, + "source_contribution_ess": 14.537037682, + "largest_source_contribution_share": 0.1292913162, + "own_target_error_percent": 0.21168457888574022 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18265.4823608398, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.1815506579, + "largest_source_contribution_share": 0.2360516723, + "own_target_error_percent": 0.030023881926610763 + }, + { + "name": "dwp.uc.households@2025", + "target": 6197311.0, + "prior": 5282757.911697364, + "new_calibrated": 5905355.915781509, + "household_support": 7159, + "original_source_household_support": 2881, + "source_contribution_ess": 828.1772105412, + "largest_source_contribution_share": 0.0075307108, + "own_target_error_percent": -4.710996175897753 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "canonical": 289208975664.4923, + "calibrated": 289208975664.4923 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "canonical": 50714902097.432236, + "calibrated": 50714902097.432236 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "canonical": 137018135866.62589, + "calibrated": 137018135866.62589 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "canonical": 15759391835.595295, + "calibrated": 15759391835.595295 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2647496805.2805147, + "canonical": 2869341984.136963, + "calibrated": 2869341984.136963 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "canonical": 1161753903316.7969, + "calibrated": 1161753903316.7969 + } + ], + "canonical_parity": { + "row_count": 366, + "targets_exact": true, + "final_estimates_exact": true, + "maximum_final_absolute_difference": 0.0, + "maximum_final_scaled_difference": 0.0, + "initial_estimates_exact": true, + "maximum_initial_absolute_difference": 0.0, + "summary_scalars": { + "initial_loss": { + "canonical": 0.2981724143028259, + "recovered": 0.2981724143028259 + }, + "final_loss": { + "canonical": 0.01182203087237668, + "recovered": 0.01182203087237668 + }, + "effective_sample_size": { + "canonical": 14049.76239586668, + "recovered": 14049.76239586668 + }, + "realized_max_weight_ratio": { + "canonical": 10.0, + "recovered": 10.0 + } + } + }, + "original_canonical_outcome": { + "exit_code": 1, + "shippable": false, + "blocked_at_phase": "terminal", + "gate_report_sha256": "6faf75dd3bdb66b7dfb18c17e657e058a46c65ee80c4e5b9d6cfe4045259ab28", + "gate_outcomes": { + "uk_aggregate_admin": "passed", + "uk_calibration_reference_coverage": "passed", + "uk_target_fit": "failed", + "uk_weight_ess": "passed", + "uk_weight_ratio": "passed", + "uk_zero_weight_strata": "passed" + }, + "calibrated_h5_created": false, + "passing_build_record_created": false + } + }, + "fresh-old-contract": { + "status": "completed_private_diagnostic", + "receipt_sha256": "470b46fadf66eb1b5293f0120cab805fa20fea23e8aad7ecef87d279f0aafdbb", + "source_year": 2024, + "model_year": 2025, + "versions": { + "python": "3.13.14", + "policyengine-uk": "2.97.0", + "policyengine-core": "3.31.0", + "numpy": "2.4.6", + "pandas": "3.0.3", + "scipy": "1.17.1", + "torch": "2.12.0" + }, + "facts_sha256": "6ae49d7d7ab297df25a0b9bfe2d6776827c672d284fbb360957fe8337089549f", + "manifest_sha256": "a89fb928d9da26c341a02c5b59e312e76bd144a23aa9ffd0e1fd559f626d569a", + "target_contract_sha256": "ae6401db7eff8047d345d31a800cbc483c65112905c3ddcefd47b50c1028b93e", + "target_references_sha256": "c831712077251df5e7dc2cc69435e1c83b2c0737d8bc7ae4cfb1ffef643f2e48", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "inputs_private_sha256": "869bf524d5cf5241938b0a3f27846c5262defd026688c6336bda560ba4ab451e", + "weights_private_sha256": "05f042e0a794a7593ca0a1e413733260d70b2674510546398d529ff4652edd78", + "compiled_rows": 415, + "active_rows": 366, + "solver": { + "doctrine": { + "epochs": 1500, + "learning_rate": 0.02, + "max_weight_ratio": 10.0, + "seed": 0, + "target_loss_cap": 10.0, + "scale_rule": "default_target_loss_scales", + "target_weight_rule": "family_equal", + "mass_rule": "free", + "l0_lambda": 0.0 + }, + "initial_loss": 0.2981818914413452, + "final_loss": 0.011774394805188734, + "elapsed_seconds": 92.78148837503977, + "torch_threads": 2 + }, + "concentration": { + "household_ess": 13466.650095920992, + "source_household_ess": 4913.702513038591, + "weight_mass": 29897041.82706398, + "max_weight_ratio": 10.0 + }, + "selected_rows": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1278537.0, + "prior": 852570.7672727915, + "new_calibrated": 978180.3449158777, + "household_support": 1357, + "original_source_household_support": 527, + "source_contribution_ess": 192.1598849352, + "largest_source_contribution_share": 0.0259834896, + "own_target_error_percent": -23.4922145455409 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1100617.5555555555, + "prior": 866805.0786886854, + "new_calibrated": 1008458.1791610718, + "household_support": 1305, + "original_source_household_support": 504, + "source_contribution_ess": 139.1783988833, + "largest_source_contribution_share": 0.0448872419, + "own_target_error_percent": -8.373424168031251 + }, + { + "name": "dwp.uc.households_children_3@2025", + "target": 494553.2222222222, + "prior": 384575.415136111, + "new_calibrated": 493742.2852325439, + "household_support": 533, + "original_source_household_support": 201, + "source_contribution_ess": 69.0086445117, + "largest_source_contribution_share": 0.0553934031, + "own_target_error_percent": -0.1639736540456571 + }, + { + "name": "dwp.uc.households_children_4@2025", + "target": 174668.8888888889, + "prior": 119179.3662093048, + "new_calibrated": 174496.8233642578, + "household_support": 146, + "original_source_household_support": 53, + "source_contribution_ess": 22.1063164064, + "largest_source_contribution_share": 0.098613294, + "own_target_error_percent": -0.0985095432424421 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 77376.7777777778, + "prior": 68485.0408009181, + "new_calibrated": 77385.5673522949, + "household_support": 78, + "original_source_household_support": 28, + "source_contribution_ess": 9.4575342275, + "largest_source_contribution_share": 0.2846349956, + "own_target_error_percent": 0.01135944758818841 + }, + { + "name": "dwp.uc.households_single_no_children@2025", + "target": 3446962.0, + "prior": 2627176.614961808, + "new_calibrated": 3452411.7215709686, + "household_support": 3398, + "original_source_household_support": 1409, + "source_contribution_ess": 371.116083446, + "largest_source_contribution_share": 0.0181260066, + "own_target_error_percent": 0.15810216564524637 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2226220.0, + "prior": 1234482.5039304134, + "new_calibrated": 1831438.397333633, + "household_support": 1917, + "original_source_household_support": 677, + "source_contribution_ess": 227.7519703166, + "largest_source_contribution_share": 0.0247165869, + "own_target_error_percent": -17.733269967315323 + }, + { + "name": "dwp.uc.households_couple_no_children@2025", + "target": 284345.5555555556, + "prior": 363965.6286277607, + "new_calibrated": 284056.9292869568, + "household_support": 557, + "original_source_household_support": 268, + "source_contribution_ess": 95.7075703795, + "largest_source_contribution_share": 0.0543143627, + "own_target_error_percent": -0.10150546156240114 + }, + { + "name": "dwp.uc.households_couple_with_children@2025", + "target": 899534.6666666666, + "prior": 1057133.1641774026, + "new_calibrated": 900824.8026924133, + "household_support": 1498, + "original_source_household_support": 634, + "source_contribution_ess": 248.1960755294, + "largest_source_contribution_share": 0.0191021678, + "own_target_error_percent": 0.14342260210242763 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "target": 746.3333333333, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025", + "target": 605.7777777778, + "prior": 0.0, + "new_calibrated": 0.0, + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "own_target_error_percent": -100.0 + }, + { + "name": "dwp.uc.two_child_limit.households_5_children@2025", + "target": 37020.0, + "prior": 47962.4532628897, + "new_calibrated": 37133.3965148926, + "household_support": 54, + "original_source_household_support": 19, + "source_contribution_ess": 14.6038398218, + "largest_source_contribution_share": 0.1311483259, + "own_target_error_percent": 0.3063114934970246 + }, + { + "name": "dwp.uc.two_child_limit.households_6_plus_children@2025", + "target": 18260.0, + "prior": 17466.0808307114, + "new_calibrated": 18225.5302124023, + "household_support": 20, + "original_source_household_support": 8, + "source_contribution_ess": 6.1961488464, + "largest_source_contribution_share": 0.2366658364, + "own_target_error_percent": -0.18877211170701402 + }, + { + "name": "dwp.uc.households@2025", + "target": 6758888.888888889, + "prior": 5282757.911697364, + "new_calibrated": 6468731.850883972, + "household_support": 7159, + "original_source_household_support": 2881, + "source_contribution_ess": 784.3370538836, + "largest_source_contribution_share": 0.0096739885, + "own_target_error_percent": -4.292969492099708 + } + ], + "protected_outcomes": [ + { + "name": "income_tax", + "geography": "UK", + "prior": 289458864728.9993, + "canonical": 289208975664.4923, + "calibrated": 289421809012.78406 + }, + { + "name": "national_insurance", + "geography": "UK", + "prior": 49902267953.151474, + "canonical": 50714902097.432236, + "calibrated": 50746817921.82611 + }, + { + "name": "state_pension", + "geography": "UK", + "prior": 153763335778.56433, + "canonical": 137018135866.62589, + "calibrated": 136818310613.57419 + }, + { + "name": "child_benefit", + "geography": "UK", + "prior": 15451136723.728737, + "canonical": 15759391835.595295, + "calibrated": 15719075768.196598 + }, + { + "name": "housing_benefit", + "geography": "UK", + "prior": 2647496805.2805147, + "canonical": 2869341984.136963, + "calibrated": 2791165446.3615165 + }, + { + "name": "employment_income", + "geography": "UK", + "prior": 1122500368129.387, + "canonical": 1161753903316.7969, + "calibrated": 1161053778600.9978 + } + ], + "canonical_parity": null, + "original_canonical_outcome": { + "exit_code": 1, + "shippable": false, + "blocked_at_phase": "terminal", + "gate_report_sha256": "6faf75dd3bdb66b7dfb18c17e657e058a46c65ee80c4e5b9d6cfe4045259ab28", + "gate_outcomes": { + "uk_aggregate_admin": "passed", + "uk_calibration_reference_coverage": "passed", + "uk_target_fit": "failed", + "uk_weight_ess": "passed", + "uk_weight_ratio": "passed", + "uk_zero_weight_strata": "passed" + }, + "calibrated_h5_created": false, + "passing_build_record_created": false + } + } + }, + "retained_common_cy_errors": { + "baseline-uk297-v4": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.197742498919188, + "own_contract_capped_coefficient_weighted_mape_pct": 1.1801282514179074, + "common_cy_rows_within_5pct": 339, + "own_contract_rows_within_5pct": 341 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.7605525333960745, + "own_contract_capped_coefficient_weighted_mape_pct": 1.5756029346326295, + "common_cy_rows_within_5pct": 103, + "own_contract_rows_within_5pct": 105 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 9.146306716206396, + "own_contract_capped_coefficient_weighted_mape_pct": 5.632264339700931, + "common_cy_rows_within_5pct": 5, + "own_contract_rows_within_5pct": 7 + } + }, + "cy-paid-structural-run": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.170111611775804, + "own_contract_capped_coefficient_weighted_mape_pct": 1.170111611775804, + "common_cy_rows_within_5pct": 343, + "own_contract_rows_within_5pct": 343 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.4694293478192337, + "own_contract_capped_coefficient_weighted_mape_pct": 1.4694293478192337, + "common_cy_rows_within_5pct": 105, + "own_contract_rows_within_5pct": 105 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 4.354137750373933, + "own_contract_capped_coefficient_weighted_mape_pct": 4.354137750373933, + "common_cy_rows_within_5pct": 7, + "own_contract_rows_within_5pct": 7 + } + }, + "cy-paid-administrative-run": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.170111611775804, + "own_contract_capped_coefficient_weighted_mape_pct": 1.170111611775804, + "common_cy_rows_within_5pct": 343, + "own_contract_rows_within_5pct": 343 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.4694293478192337, + "own_contract_capped_coefficient_weighted_mape_pct": 1.4694293478192337, + "common_cy_rows_within_5pct": 105, + "own_contract_rows_within_5pct": 105 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 4.354137750373933, + "own_contract_capped_coefficient_weighted_mape_pct": 4.354137750373933, + "common_cy_rows_within_5pct": 7, + "own_contract_rows_within_5pct": 7 + } + }, + "fy-paid-administrative-run": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.1894317115043673, + "own_contract_capped_coefficient_weighted_mape_pct": 1.1843518610159696, + "common_cy_rows_within_5pct": 338, + "own_contract_rows_within_5pct": 339 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.5664530205648908, + "own_contract_capped_coefficient_weighted_mape_pct": 1.513114590436715, + "common_cy_rows_within_5pct": 103, + "own_contract_rows_within_5pct": 104 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 5.967843007770236, + "own_contract_capped_coefficient_weighted_mape_pct": 4.9544128353349, + "common_cy_rows_within_5pct": 5, + "own_contract_rows_within_5pct": 6 + } + } + }, + "fresh_common_cy_errors": { + "fresh-old-contract": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.1950675357311318, + "own_contract_capped_coefficient_weighted_mape_pct": 1.1774394805188735, + "common_cy_rows_within_5pct": 340, + "own_contract_rows_within_5pct": 342 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.7072566067837776, + "own_contract_capped_coefficient_weighted_mape_pct": 1.5221620270550649, + "common_cy_rows_within_5pct": 103, + "own_contract_rows_within_5pct": 105 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 8.973672119562899, + "own_contract_capped_coefficient_weighted_mape_pct": 5.456875104717356, + "common_cy_rows_within_5pct": 5, + "own_contract_rows_within_5pct": 7 + } + }, + "fresh-current-recovered": { + "all_366_rows": { + "row_count": 366, + "common_cy_capped_coefficient_weighted_mape_pct": 1.182203087237668, + "own_contract_capped_coefficient_weighted_mape_pct": 1.182203087237668, + "common_cy_rows_within_5pct": 341, + "own_contract_rows_within_5pct": 341 + }, + "all_110_uc_tcl_rows_including_zero_support": { + "row_count": 110, + "common_cy_capped_coefficient_weighted_mape_pct": 1.4752202410323747, + "own_contract_capped_coefficient_weighted_mape_pct": 1.4752202410323747, + "common_cy_rows_within_5pct": 105, + "own_contract_rows_within_5pct": 105 + }, + "ten_broad_uc_count_rows": { + "row_count": 10, + "common_cy_capped_coefficient_weighted_mape_pct": 4.71987038695657, + "own_contract_capped_coefficient_weighted_mape_pct": 4.71987038695657, + "common_cy_rows_within_5pct": 7, + "own_contract_rows_within_5pct": 7 + } + } + }, + "limitations": [ + "Old/new target effects are identified within each fixed population; retained-to-fresh differences combine pipeline changes.", + "Original canonical fresh solve was refused by terminal fit gates; private replay must reproduce all saved estimates exactly.", + "Raw losses across changed target contracts are not causal improvement metrics.", + "Zero-support and single-source contrast limitations remain; this does not close issue882." + ], + "fresh_named_opposition_lp_probes": { + "purpose": "Bounded feasibility probes for named constraints that opposed the one-percentage-point lone-parent weight direction.", + "population_arm": "fresh-current-recovered", + "aggregate_receipt_sha256": "5f8ab745bc9c812919e7bbaaf1bcfa4402439b106b64b63159a32975566802f4", + "probe_script_sha256": "f99ca7274335d1096e7715313edfc913f05d98354d31d2ddc4962c578f145931", + "population_receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "input_archive_sha256": "4a69939b0fb48570cfe1dec931a89b5445b91d8e527999ca0db672552d5bd825", + "model_year": 2025, + "solver": "scipy.optimize.linprog(method=highs)", + "scipy_version": "1.17.1", + "objective": "Zero objective; feasibility only.", + "per_probe_time_limit_seconds": 20.0, + "relative_tolerance": 0.05, + "constraint_bounds": "0.95 * target <= matrix_row @ weights <= 1.05 * target for every named row.", + "weight_bounds": { + "lower": 0, + "upper_fresh_prior_multiple": 10 + }, + "fixed_household_mass_constraint": false, + "ess_constraint": false, + "full_366_row_constraint": false, + "full_active_uc_evaluation": { + "row_count": 110, + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "linprog_called": false, + "reason": "A zero matrix row cannot reach 95% of its positive target under any permitted weights." + }, + "probes": [ + { + "label": "broad10_plus_1_named_rows", + "row_count": 11, + "row_names": [ + "dwp.uc.households@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 0.0, + "elapsed_seconds": 0.023474166984669864, + "active_weight_columns": 8827 + }, + { + "label": "broad10_plus_2_named_rows", + "row_count": 12, + "row_names": [ + "dwp.uc.households@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 2.220446049250313e-16, + "elapsed_seconds": 0.01831608300562948, + "active_weight_columns": 8829 + }, + { + "label": "broad10_plus_3_named_rows", + "row_count": 13, + "row_names": [ + "dwp.uc.households@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 2.220446049250313e-16, + "elapsed_seconds": 0.01840141596039757, + "active_weight_columns": 8831 + }, + { + "label": "broad10_plus_4_named_rows", + "row_count": 14, + "row_names": [ + "dwp.uc.households@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 1.1102230246251565e-16, + "elapsed_seconds": 0.01882241596467793, + "active_weight_columns": 9171 + }, + { + "label": "broad10_plus_5_named_rows", + "row_count": 15, + "row_names": [ + "dwp.uc.households@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 2.220446049250313e-16, + "elapsed_seconds": 0.01911699998890981, + "active_weight_columns": 9203 + }, + { + "label": "supported108_uc_plus_five_named_rows", + "row_count": 113, + "row_names": [ + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp.uc.scotland_households_child_under_1@2025", + "dwp.uc.two_child_limit.households_affected@2025", + "dwp.uc.two_child_limit.children_affected@2025", + "dwp.uc.two_child_limit.children_in_affected_households@2025", + "dwp.uc.two_child_limit.households_3_children@2025", + "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "dwp.uc.two_child_limit.households_4_children@2025", + "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "dwp.uc.two_child_limit.households_claimant_pip@2025", + "dwp.uc.two_child_limit.children_claimant_pip@2025", + "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "dwp.uc.households@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025" + ], + "added_named_rows": [ + "ons.household_composition.lone_parent_dependent_children_households@2025", + "dwp.benefit_cap.capped_households@2025", + "scotgov.scottish_child_payment_spending@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025" + ], + "status": "feasible_for_named_rows_only", + "relative_tolerance": 0.05, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "normalized_constraint_violation": 2.220446049250313e-16, + "elapsed_seconds": 0.02925970801152289, + "active_weight_columns": 9203 + } + ], + "limitations": [ + "The first five probes constrain only the ten broad UC counts and the cumulative named non-UC additions; the sixth constrains 108 supported UC/TCL rows plus those same five additions.", + "The two named positive-target zero-support rows are excluded only from the supported-row LP. They remain in the full 110-row UC evaluation, which is infeasible, and the original canonical terminal-gate refusal is preserved.", + "The largest subset omits the other 253 active calibration rows. These results do not establish feasibility for all 366 rows or all protected outcomes.", + "No fixed total household mass or effective sample size constraint is imposed; feasibility does not certify population quality or an acceptable concentration of weights.", + "Feasibility applies only to the exact named subsets at 5% tolerance and the stated weight bounds; it does not establish exact equality-fit feasibility.", + "The saved matrix, targets, fresh prior weights and loss coefficients are unchanged. These probes run no new calibration and do not optimize the calibration loss.", + "LP solution weights are not exported, substituted for calibrated weights or used to create a certified data artifact.", + "The opposing one-percentage-point direction is direction-specific; the feasible named subsets do not establish that the full calibration objective has no competing priorities." + ] + }, + "fresh_full_supported_lp_probes": { + "population_arm": "fresh-current-recovered", + "population_receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "input_archive_sha256": "4a69939b0fb48570cfe1dec931a89b5445b91d8e527999ca0db672552d5bd825", + "weight_archive_sha256": "dd1a4953cd7243f7491d9d2d274c1deaa0ee71c757ba2bbf37ca3e0520fbe434", + "model_year": 2025, + "solver": "scipy.optimize.linprog(method=highs)", + "scipy_version": "1.17.1", + "objective": "Zero objective; feasibility only.", + "per_probe_time_limit_seconds": 30.0, + "weight_cap": "0 <= weight <= 10 * fresh prior weight", + "ess_constraint": false, + "aggregate_receipt_sha256": "9704eaa7b7ebece8cc7bcb7f70a03a0ec472ae6d46f2b4fb4d5eac30b9bf5bad", + "purpose": "Test the full supported target surface and distinguish 5% fit compatibility from compatibility with the 25% bounds on other rows.", + "fixed_household_mass_constraint": false, + "all_366_row_evaluation": { + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "additional_zero_rows": [], + "linprog_called": false + }, + "adjudicated_cgt_row": "obr.capital_gains_tax@2025", + "retained_cgt_rows": [ + "hmrc.cgt.taxpayers_total@2025", + "hmrc.cgt.gains_total@2025" + ], + "probes": [ + { + "label": "all_supported_364_at_5pct", + "row_count": 364, + "row_names": [ + "obr.income_tax@2025", + "obr.ni@2025", + "obr.ni_employee@2025", + "obr.ni_employer@2025", + "obr.ni_self_employed@2025", + "obr.vat@2025", + "obr.capital_gains_tax@2025", + "obr.sdlt@2025", + "obr.attendance_allowance@2025", + "obr.carers_allowance@2025", + "obr.child_benefit@2025", + "obr.council_tax@2025", + "obr.esa@2025", + "obr.jobseekers_allowance@2025", + "obr.pension_credit@2025", + "obr.pip@2025", + "obr.state_pension@2025", + "obr.statutory_maternity_pay@2025", + "obr.tv_licence_fee@2025", + "obr.winter_fuel_allowance@2025", + "isc.private_school_students@2025", + "hmrc.salary_sacrifice.users_total@2025", + "hmrc.salary_sacrifice.users_below_cap@2025", + "hmrc.salary_sacrifice.users_above_cap@2025", + "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025", + "hmrc/property_income_count_income_band_100_000_to_150_000@2025", + "hmrc/property_income_count_income_band_12_570_to_15_000@2025", + "hmrc/property_income_count_income_band_15_000_to_20_000@2025", + "hmrc/property_income_count_income_band_150_000_to_200_000@2025", + "hmrc/property_income_count_income_band_20_000_to_30_000@2025", + "hmrc/property_income_count_income_band_200_000_to_300_000@2025", + "hmrc/property_income_count_income_band_30_000_to_40_000@2025", + "hmrc/property_income_count_income_band_300_000_to_500_000@2025", + "hmrc/property_income_count_income_band_40_000_to_50_000@2025", + "hmrc/property_income_count_income_band_50_000_to_70_000@2025", + "hmrc/property_income_count_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025", + "hmrc.cgt.taxpayers_total@2025", + "hmrc.cgt.gains_total@2025", + "dwp.benefit_cap.capped_households@2025", + "dwp.esa_claimants@2025", + "dwp.esa_contrib_claimants@2025", + "dwp.esa_income_claimants@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp.uc.scotland_households_child_under_1@2025", + "dwp.uc.two_child_limit.households_affected@2025", + "dwp.uc.two_child_limit.children_affected@2025", + "dwp.uc.two_child_limit.children_in_affected_households@2025", + "dwp.uc.two_child_limit.households_3_children@2025", + "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "dwp.uc.two_child_limit.households_4_children@2025", + "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "dwp.uc.two_child_limit.households_claimant_pip@2025", + "dwp.uc.two_child_limit.children_claimant_pip@2025", + "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "ons.population.uk_total@2025", + "ons.population.age_0_9_by_region@2025", + "ons.population.age_10_19_by_region@2025", + "ons.population.age_20_29_by_region@2025", + "ons.population.age_30_39_by_region@2025", + "ons.population.age_40_49_by_region@2025", + "ons.population.age_50_59_by_region@2025", + "ons.population.age_60_69_by_region@2025", + "ons.population.age_70_79_by_region@2025", + "ons.population.age_80_89_by_region@2025", + "ons.population.female_0_4@2025", + "ons.population.female_10_14@2025", + "ons.population.female_15_19@2025", + "ons.population.female_20_24@2025", + "ons.population.female_25_29@2025", + "ons.population.female_30_34@2025", + "ons.population.female_35_39@2025", + "ons.population.female_40_44@2025", + "ons.population.female_45_49@2025", + "ons.population.female_50_54@2025", + "ons.population.female_55_59@2025", + "ons.population.female_5_9@2025", + "ons.population.female_60_64@2025", + "ons.population.female_65_69@2025", + "ons.population.female_70_74@2025", + "ons.population.female_75_79@2025", + "ons.population.female_80_84@2025", + "ons.population.female_85_89@2025", + "ons.population.female_90_plus@2025", + "ons.population.male_0_4@2025", + "ons.population.male_10_14@2025", + "ons.population.male_15_19@2025", + "ons.population.male_20_24@2025", + "ons.population.male_25_29@2025", + "ons.population.male_30_34@2025", + "ons.population.male_35_39@2025", + "ons.population.male_40_44@2025", + "ons.population.male_45_49@2025", + "ons.population.male_50_54@2025", + "ons.population.male_55_59@2025", + "ons.population.male_5_9@2025", + "ons.population.male_60_64@2025", + "ons.population.male_65_69@2025", + "ons.population.male_70_74@2025", + "ons.population.male_75_79@2025", + "ons.population.male_80_84@2025", + "ons.population.male_85_89@2025", + "ons.population.male_90_plus@2025", + "ons.population.scotland_children_under_16@2025", + "ons.population.scotland_babies_under_1@2025", + "ons.household_composition.lone_households_under_65@2025", + "ons.household_composition.lone_households_over_65@2025", + "ons.household_composition.couple_no_children_households@2025", + "ons.household_composition.couple_under_3_children_households@2025", + "ons.household_composition.couple_3_plus_children_households@2025", + "ons.household_composition.couple_non_dependent_children_only_households@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "voa.council_tax_stock.band_a@2025", + "scotgov.council_tax_stock.band_a@2025", + "voa.council_tax_stock.band_b@2025", + "scotgov.council_tax_stock.band_b@2025", + "voa.council_tax_stock.band_c@2025", + "scotgov.council_tax_stock.band_c@2025", + "voa.council_tax_stock.band_d@2025", + "scotgov.council_tax_stock.band_d@2025", + "voa.council_tax_stock.band_e@2025", + "scotgov.council_tax_stock.band_e@2025", + "voa.council_tax_stock.band_f@2025", + "scotgov.council_tax_stock.band_f@2025", + "voa.council_tax_stock.band_g@2025", + "scotgov.council_tax_stock.band_g@2025", + "voa.council_tax_stock.band_h@2025", + "scotgov.council_tax_stock.band_h@2025", + "voa.council_tax_stock.total@2025", + "scotgov.council_tax_stock.total@2025", + "scotgov.scottish_child_payment_spending@2025", + "ons.public_sector_employment@2025", + "ons.land.land_value@2025", + "ons.land.household_land_value@2025", + "ons.land.corporate_land_value@2025", + "slc.repayments.england_total_higher_education@2025", + "slc.repayments.england_plan_1@2025", + "slc.repayments.england_plan_2@2025", + "slc.borrowers.plan_5_above_threshold@2025", + "slc.support.maintenance_loan_recipients@2025", + "slc.support.maintenance_loan_spend@2025", + "slc.support.parents_learning_allowance_recipients@2025", + "slc.support.parents_learning_allowance_spend@2025", + "slc.support.adult_dependants_grant_recipients@2025", + "slc.support.adult_dependants_grant_spend@2025", + "dwp.uc.households@2025", + "hmrc.tfc.government_top_up@2025", + "hmrc.tfc.children_with_used_accounts@2025", + "dfe.funded_childcare.working_parent_children_2_to_4@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dft.bus_fare_receipts.england@2025", + "dft.bus_net_support.england@2025" + ], + "row_relative_tolerances": { + "obr.income_tax@2025": 0.05, + "obr.ni@2025": 0.05, + "obr.ni_employee@2025": 0.05, + "obr.ni_employer@2025": 0.05, + "obr.ni_self_employed@2025": 0.05, + "obr.vat@2025": 0.05, + "obr.capital_gains_tax@2025": 0.05, + "obr.sdlt@2025": 0.05, + "obr.attendance_allowance@2025": 0.05, + "obr.carers_allowance@2025": 0.05, + "obr.child_benefit@2025": 0.05, + "obr.council_tax@2025": 0.05, + "obr.esa@2025": 0.05, + "obr.jobseekers_allowance@2025": 0.05, + "obr.pension_credit@2025": 0.05, + "obr.pip@2025": 0.05, + "obr.state_pension@2025": 0.05, + "obr.statutory_maternity_pay@2025": 0.05, + "obr.tv_licence_fee@2025": 0.05, + "obr.winter_fuel_allowance@2025": 0.05, + "isc.private_school_students@2025": 0.05, + "hmrc.salary_sacrifice.users_total@2025": 0.05, + "hmrc.salary_sacrifice.users_below_cap@2025": 0.05, + "hmrc.salary_sacrifice.users_above_cap@2025": 0.05, + "hmrc/employment_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/employment_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/employment_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/employment_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/employment_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/employment_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/employment_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/employment_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/employment_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/employment_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/employment_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/dividend_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/dividend_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/dividend_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/dividend_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/dividend_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/dividend_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/dividend_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/dividend_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/dividend_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/dividend_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/dividend_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/property_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/property_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/property_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/property_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/property_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/property_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/property_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/property_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/property_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/property_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/property_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/state_pension_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/state_pension_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/state_pension_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/state_pension_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/state_pension_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/state_pension_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/state_pension_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/state_pension_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/state_pension_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/state_pension_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/state_pension_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc.cgt.taxpayers_total@2025": 0.05, + "hmrc.cgt.gains_total@2025": 0.05, + "dwp.benefit_cap.capped_households@2025": 0.05, + "dwp.esa_claimants@2025": 0.05, + "dwp.esa_contrib_claimants@2025": 0.05, + "dwp.esa_income_claimants@2025": 0.05, + "dwp.uc.households_children_1@2025": 0.05, + "dwp.uc.households_children_2@2025": 0.05, + "dwp.uc.households_children_3@2025": 0.05, + "dwp.uc.households_children_4@2025": 0.05, + "dwp.uc.households_children_5_or_more@2025": 0.05, + "dwp.uc.households_single_no_children@2025": 0.05, + "dwp.uc.households_single_with_children@2025": 0.05, + "dwp.uc.households_couple_no_children@2025": 0.05, + "dwp.uc.households_couple_with_children@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp.uc.scotland_households_child_under_1@2025": 0.05, + "dwp.uc.two_child_limit.households_affected@2025": 0.05, + "dwp.uc.two_child_limit.children_affected@2025": 0.05, + "dwp.uc.two_child_limit.children_in_affected_households@2025": 0.05, + "dwp.uc.two_child_limit.households_3_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_3_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_4_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_4_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_5_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_5_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_6_plus_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_claimant_pip@2025": 0.05, + "dwp.uc.two_child_limit.children_claimant_pip@2025": 0.05, + "dwp.uc.two_child_limit.households_disabled_child_element@2025": 0.05, + "dwp.uc.two_child_limit.children_disabled_child_element@2025": 0.05, + "ons.population.uk_total@2025": 0.05, + "ons.population.age_0_9_by_region@2025": 0.05, + "ons.population.age_10_19_by_region@2025": 0.05, + "ons.population.age_20_29_by_region@2025": 0.05, + "ons.population.age_30_39_by_region@2025": 0.05, + "ons.population.age_40_49_by_region@2025": 0.05, + "ons.population.age_50_59_by_region@2025": 0.05, + "ons.population.age_60_69_by_region@2025": 0.05, + "ons.population.age_70_79_by_region@2025": 0.05, + "ons.population.age_80_89_by_region@2025": 0.05, + "ons.population.female_0_4@2025": 0.05, + "ons.population.female_10_14@2025": 0.05, + "ons.population.female_15_19@2025": 0.05, + "ons.population.female_20_24@2025": 0.05, + "ons.population.female_25_29@2025": 0.05, + "ons.population.female_30_34@2025": 0.05, + "ons.population.female_35_39@2025": 0.05, + "ons.population.female_40_44@2025": 0.05, + "ons.population.female_45_49@2025": 0.05, + "ons.population.female_50_54@2025": 0.05, + "ons.population.female_55_59@2025": 0.05, + "ons.population.female_5_9@2025": 0.05, + "ons.population.female_60_64@2025": 0.05, + "ons.population.female_65_69@2025": 0.05, + "ons.population.female_70_74@2025": 0.05, + "ons.population.female_75_79@2025": 0.05, + "ons.population.female_80_84@2025": 0.05, + "ons.population.female_85_89@2025": 0.05, + "ons.population.female_90_plus@2025": 0.05, + "ons.population.male_0_4@2025": 0.05, + "ons.population.male_10_14@2025": 0.05, + "ons.population.male_15_19@2025": 0.05, + "ons.population.male_20_24@2025": 0.05, + "ons.population.male_25_29@2025": 0.05, + "ons.population.male_30_34@2025": 0.05, + "ons.population.male_35_39@2025": 0.05, + "ons.population.male_40_44@2025": 0.05, + "ons.population.male_45_49@2025": 0.05, + "ons.population.male_50_54@2025": 0.05, + "ons.population.male_55_59@2025": 0.05, + "ons.population.male_5_9@2025": 0.05, + "ons.population.male_60_64@2025": 0.05, + "ons.population.male_65_69@2025": 0.05, + "ons.population.male_70_74@2025": 0.05, + "ons.population.male_75_79@2025": 0.05, + "ons.population.male_80_84@2025": 0.05, + "ons.population.male_85_89@2025": 0.05, + "ons.population.male_90_plus@2025": 0.05, + "ons.population.scotland_children_under_16@2025": 0.05, + "ons.population.scotland_babies_under_1@2025": 0.05, + "ons.household_composition.lone_households_under_65@2025": 0.05, + "ons.household_composition.lone_households_over_65@2025": 0.05, + "ons.household_composition.couple_no_children_households@2025": 0.05, + "ons.household_composition.couple_under_3_children_households@2025": 0.05, + "ons.household_composition.couple_3_plus_children_households@2025": 0.05, + "ons.household_composition.couple_non_dependent_children_only_households@2025": 0.05, + "ons.household_composition.lone_parent_dependent_children_households@2025": 0.05, + "voa.council_tax_stock.band_a@2025": 0.05, + "scotgov.council_tax_stock.band_a@2025": 0.05, + "voa.council_tax_stock.band_b@2025": 0.05, + "scotgov.council_tax_stock.band_b@2025": 0.05, + "voa.council_tax_stock.band_c@2025": 0.05, + "scotgov.council_tax_stock.band_c@2025": 0.05, + "voa.council_tax_stock.band_d@2025": 0.05, + "scotgov.council_tax_stock.band_d@2025": 0.05, + "voa.council_tax_stock.band_e@2025": 0.05, + "scotgov.council_tax_stock.band_e@2025": 0.05, + "voa.council_tax_stock.band_f@2025": 0.05, + "scotgov.council_tax_stock.band_f@2025": 0.05, + "voa.council_tax_stock.band_g@2025": 0.05, + "scotgov.council_tax_stock.band_g@2025": 0.05, + "voa.council_tax_stock.band_h@2025": 0.05, + "scotgov.council_tax_stock.band_h@2025": 0.05, + "voa.council_tax_stock.total@2025": 0.05, + "scotgov.council_tax_stock.total@2025": 0.05, + "scotgov.scottish_child_payment_spending@2025": 0.05, + "ons.public_sector_employment@2025": 0.05, + "ons.land.land_value@2025": 0.05, + "ons.land.household_land_value@2025": 0.05, + "ons.land.corporate_land_value@2025": 0.05, + "slc.repayments.england_total_higher_education@2025": 0.05, + "slc.repayments.england_plan_1@2025": 0.05, + "slc.repayments.england_plan_2@2025": 0.05, + "slc.borrowers.plan_5_above_threshold@2025": 0.05, + "slc.support.maintenance_loan_recipients@2025": 0.05, + "slc.support.maintenance_loan_spend@2025": 0.05, + "slc.support.parents_learning_allowance_recipients@2025": 0.05, + "slc.support.parents_learning_allowance_spend@2025": 0.05, + "slc.support.adult_dependants_grant_recipients@2025": 0.05, + "slc.support.adult_dependants_grant_spend@2025": 0.05, + "dwp.uc.households@2025": 0.05, + "hmrc.tfc.government_top_up@2025": 0.05, + "hmrc.tfc.children_with_used_accounts@2025": 0.05, + "dfe.funded_childcare.working_parent_children_2_to_4@2025": 0.05, + "dfe.funded_childcare.early_learning_2_year_olds@2025": 0.05, + "dfe.funded_childcare.universal_only_children@2025": 0.05, + "dft.bus_fare_receipts.england@2025": 0.05, + "dft.bus_net_support.england@2025": 0.05 + }, + "excluded_zero_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "excluded_adjudicated_row": null, + "active_weight_columns": 52846, + "scipy_status": 2, + "scipy_message": "The problem is infeasible. (HiGHS Status 8: model_status is Infeasible; primal_status is None)", + "elapsed_seconds": 1.2381121250218712, + "status": "infeasible_for_named_rows_and_tolerances_under_cap" + }, + { + "label": "all_supported_non_cgt_363_at_5pct", + "row_count": 363, + "row_names": [ + "obr.income_tax@2025", + "obr.ni@2025", + "obr.ni_employee@2025", + "obr.ni_employer@2025", + "obr.ni_self_employed@2025", + "obr.vat@2025", + "obr.sdlt@2025", + "obr.attendance_allowance@2025", + "obr.carers_allowance@2025", + "obr.child_benefit@2025", + "obr.council_tax@2025", + "obr.esa@2025", + "obr.jobseekers_allowance@2025", + "obr.pension_credit@2025", + "obr.pip@2025", + "obr.state_pension@2025", + "obr.statutory_maternity_pay@2025", + "obr.tv_licence_fee@2025", + "obr.winter_fuel_allowance@2025", + "isc.private_school_students@2025", + "hmrc.salary_sacrifice.users_total@2025", + "hmrc.salary_sacrifice.users_below_cap@2025", + "hmrc.salary_sacrifice.users_above_cap@2025", + "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025", + "hmrc/property_income_count_income_band_100_000_to_150_000@2025", + "hmrc/property_income_count_income_band_12_570_to_15_000@2025", + "hmrc/property_income_count_income_band_15_000_to_20_000@2025", + "hmrc/property_income_count_income_band_150_000_to_200_000@2025", + "hmrc/property_income_count_income_band_20_000_to_30_000@2025", + "hmrc/property_income_count_income_band_200_000_to_300_000@2025", + "hmrc/property_income_count_income_band_30_000_to_40_000@2025", + "hmrc/property_income_count_income_band_300_000_to_500_000@2025", + "hmrc/property_income_count_income_band_40_000_to_50_000@2025", + "hmrc/property_income_count_income_band_50_000_to_70_000@2025", + "hmrc/property_income_count_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025", + "hmrc.cgt.taxpayers_total@2025", + "hmrc.cgt.gains_total@2025", + "dwp.benefit_cap.capped_households@2025", + "dwp.esa_claimants@2025", + "dwp.esa_contrib_claimants@2025", + "dwp.esa_income_claimants@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp.uc.scotland_households_child_under_1@2025", + "dwp.uc.two_child_limit.households_affected@2025", + "dwp.uc.two_child_limit.children_affected@2025", + "dwp.uc.two_child_limit.children_in_affected_households@2025", + "dwp.uc.two_child_limit.households_3_children@2025", + "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "dwp.uc.two_child_limit.households_4_children@2025", + "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "dwp.uc.two_child_limit.households_claimant_pip@2025", + "dwp.uc.two_child_limit.children_claimant_pip@2025", + "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "ons.population.uk_total@2025", + "ons.population.age_0_9_by_region@2025", + "ons.population.age_10_19_by_region@2025", + "ons.population.age_20_29_by_region@2025", + "ons.population.age_30_39_by_region@2025", + "ons.population.age_40_49_by_region@2025", + "ons.population.age_50_59_by_region@2025", + "ons.population.age_60_69_by_region@2025", + "ons.population.age_70_79_by_region@2025", + "ons.population.age_80_89_by_region@2025", + "ons.population.female_0_4@2025", + "ons.population.female_10_14@2025", + "ons.population.female_15_19@2025", + "ons.population.female_20_24@2025", + "ons.population.female_25_29@2025", + "ons.population.female_30_34@2025", + "ons.population.female_35_39@2025", + "ons.population.female_40_44@2025", + "ons.population.female_45_49@2025", + "ons.population.female_50_54@2025", + "ons.population.female_55_59@2025", + "ons.population.female_5_9@2025", + "ons.population.female_60_64@2025", + "ons.population.female_65_69@2025", + "ons.population.female_70_74@2025", + "ons.population.female_75_79@2025", + "ons.population.female_80_84@2025", + "ons.population.female_85_89@2025", + "ons.population.female_90_plus@2025", + "ons.population.male_0_4@2025", + "ons.population.male_10_14@2025", + "ons.population.male_15_19@2025", + "ons.population.male_20_24@2025", + "ons.population.male_25_29@2025", + "ons.population.male_30_34@2025", + "ons.population.male_35_39@2025", + "ons.population.male_40_44@2025", + "ons.population.male_45_49@2025", + "ons.population.male_50_54@2025", + "ons.population.male_55_59@2025", + "ons.population.male_5_9@2025", + "ons.population.male_60_64@2025", + "ons.population.male_65_69@2025", + "ons.population.male_70_74@2025", + "ons.population.male_75_79@2025", + "ons.population.male_80_84@2025", + "ons.population.male_85_89@2025", + "ons.population.male_90_plus@2025", + "ons.population.scotland_children_under_16@2025", + "ons.population.scotland_babies_under_1@2025", + "ons.household_composition.lone_households_under_65@2025", + "ons.household_composition.lone_households_over_65@2025", + "ons.household_composition.couple_no_children_households@2025", + "ons.household_composition.couple_under_3_children_households@2025", + "ons.household_composition.couple_3_plus_children_households@2025", + "ons.household_composition.couple_non_dependent_children_only_households@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "voa.council_tax_stock.band_a@2025", + "scotgov.council_tax_stock.band_a@2025", + "voa.council_tax_stock.band_b@2025", + "scotgov.council_tax_stock.band_b@2025", + "voa.council_tax_stock.band_c@2025", + "scotgov.council_tax_stock.band_c@2025", + "voa.council_tax_stock.band_d@2025", + "scotgov.council_tax_stock.band_d@2025", + "voa.council_tax_stock.band_e@2025", + "scotgov.council_tax_stock.band_e@2025", + "voa.council_tax_stock.band_f@2025", + "scotgov.council_tax_stock.band_f@2025", + "voa.council_tax_stock.band_g@2025", + "scotgov.council_tax_stock.band_g@2025", + "voa.council_tax_stock.band_h@2025", + "scotgov.council_tax_stock.band_h@2025", + "voa.council_tax_stock.total@2025", + "scotgov.council_tax_stock.total@2025", + "scotgov.scottish_child_payment_spending@2025", + "ons.public_sector_employment@2025", + "ons.land.land_value@2025", + "ons.land.household_land_value@2025", + "ons.land.corporate_land_value@2025", + "slc.repayments.england_total_higher_education@2025", + "slc.repayments.england_plan_1@2025", + "slc.repayments.england_plan_2@2025", + "slc.borrowers.plan_5_above_threshold@2025", + "slc.support.maintenance_loan_recipients@2025", + "slc.support.maintenance_loan_spend@2025", + "slc.support.parents_learning_allowance_recipients@2025", + "slc.support.parents_learning_allowance_spend@2025", + "slc.support.adult_dependants_grant_recipients@2025", + "slc.support.adult_dependants_grant_spend@2025", + "dwp.uc.households@2025", + "hmrc.tfc.government_top_up@2025", + "hmrc.tfc.children_with_used_accounts@2025", + "dfe.funded_childcare.working_parent_children_2_to_4@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dft.bus_fare_receipts.england@2025", + "dft.bus_net_support.england@2025" + ], + "row_relative_tolerances": { + "obr.income_tax@2025": 0.05, + "obr.ni@2025": 0.05, + "obr.ni_employee@2025": 0.05, + "obr.ni_employer@2025": 0.05, + "obr.ni_self_employed@2025": 0.05, + "obr.vat@2025": 0.05, + "obr.sdlt@2025": 0.05, + "obr.attendance_allowance@2025": 0.05, + "obr.carers_allowance@2025": 0.05, + "obr.child_benefit@2025": 0.05, + "obr.council_tax@2025": 0.05, + "obr.esa@2025": 0.05, + "obr.jobseekers_allowance@2025": 0.05, + "obr.pension_credit@2025": 0.05, + "obr.pip@2025": 0.05, + "obr.state_pension@2025": 0.05, + "obr.statutory_maternity_pay@2025": 0.05, + "obr.tv_licence_fee@2025": 0.05, + "obr.winter_fuel_allowance@2025": 0.05, + "isc.private_school_students@2025": 0.05, + "hmrc.salary_sacrifice.users_total@2025": 0.05, + "hmrc.salary_sacrifice.users_below_cap@2025": 0.05, + "hmrc.salary_sacrifice.users_above_cap@2025": 0.05, + "hmrc/employment_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/employment_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/employment_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/employment_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/employment_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/employment_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/employment_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/employment_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/employment_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/employment_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/employment_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/dividend_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/dividend_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/dividend_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/dividend_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/dividend_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/dividend_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/dividend_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/dividend_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/dividend_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/dividend_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/dividend_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/property_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/property_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/property_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/property_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/property_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/property_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/property_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/property_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/property_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/property_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/property_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/state_pension_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/state_pension_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/state_pension_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/state_pension_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/state_pension_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/state_pension_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/state_pension_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/state_pension_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/state_pension_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/state_pension_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/state_pension_income_band_70_000_to_100_000@2025": 0.05, + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025": 0.05, + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025": 0.05, + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025": 0.05, + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025": 0.05, + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025": 0.05, + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025": 0.05, + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025": 0.05, + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025": 0.05, + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025": 0.05, + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025": 0.05, + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025": 0.05, + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025": 0.05, + "hmrc.cgt.taxpayers_total@2025": 0.05, + "hmrc.cgt.gains_total@2025": 0.05, + "dwp.benefit_cap.capped_households@2025": 0.05, + "dwp.esa_claimants@2025": 0.05, + "dwp.esa_contrib_claimants@2025": 0.05, + "dwp.esa_income_claimants@2025": 0.05, + "dwp.uc.households_children_1@2025": 0.05, + "dwp.uc.households_children_2@2025": 0.05, + "dwp.uc.households_children_3@2025": 0.05, + "dwp.uc.households_children_4@2025": 0.05, + "dwp.uc.households_children_5_or_more@2025": 0.05, + "dwp.uc.households_single_no_children@2025": 0.05, + "dwp.uc.households_single_with_children@2025": 0.05, + "dwp.uc.households_couple_no_children@2025": 0.05, + "dwp.uc.households_couple_with_children@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.05, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.05, + "dwp.uc.scotland_households_child_under_1@2025": 0.05, + "dwp.uc.two_child_limit.households_affected@2025": 0.05, + "dwp.uc.two_child_limit.children_affected@2025": 0.05, + "dwp.uc.two_child_limit.children_in_affected_households@2025": 0.05, + "dwp.uc.two_child_limit.households_3_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_3_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_4_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_4_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_5_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_5_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_6_plus_children@2025": 0.05, + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025": 0.05, + "dwp.uc.two_child_limit.households_claimant_pip@2025": 0.05, + "dwp.uc.two_child_limit.children_claimant_pip@2025": 0.05, + "dwp.uc.two_child_limit.households_disabled_child_element@2025": 0.05, + "dwp.uc.two_child_limit.children_disabled_child_element@2025": 0.05, + "ons.population.uk_total@2025": 0.05, + "ons.population.age_0_9_by_region@2025": 0.05, + "ons.population.age_10_19_by_region@2025": 0.05, + "ons.population.age_20_29_by_region@2025": 0.05, + "ons.population.age_30_39_by_region@2025": 0.05, + "ons.population.age_40_49_by_region@2025": 0.05, + "ons.population.age_50_59_by_region@2025": 0.05, + "ons.population.age_60_69_by_region@2025": 0.05, + "ons.population.age_70_79_by_region@2025": 0.05, + "ons.population.age_80_89_by_region@2025": 0.05, + "ons.population.female_0_4@2025": 0.05, + "ons.population.female_10_14@2025": 0.05, + "ons.population.female_15_19@2025": 0.05, + "ons.population.female_20_24@2025": 0.05, + "ons.population.female_25_29@2025": 0.05, + "ons.population.female_30_34@2025": 0.05, + "ons.population.female_35_39@2025": 0.05, + "ons.population.female_40_44@2025": 0.05, + "ons.population.female_45_49@2025": 0.05, + "ons.population.female_50_54@2025": 0.05, + "ons.population.female_55_59@2025": 0.05, + "ons.population.female_5_9@2025": 0.05, + "ons.population.female_60_64@2025": 0.05, + "ons.population.female_65_69@2025": 0.05, + "ons.population.female_70_74@2025": 0.05, + "ons.population.female_75_79@2025": 0.05, + "ons.population.female_80_84@2025": 0.05, + "ons.population.female_85_89@2025": 0.05, + "ons.population.female_90_plus@2025": 0.05, + "ons.population.male_0_4@2025": 0.05, + "ons.population.male_10_14@2025": 0.05, + "ons.population.male_15_19@2025": 0.05, + "ons.population.male_20_24@2025": 0.05, + "ons.population.male_25_29@2025": 0.05, + "ons.population.male_30_34@2025": 0.05, + "ons.population.male_35_39@2025": 0.05, + "ons.population.male_40_44@2025": 0.05, + "ons.population.male_45_49@2025": 0.05, + "ons.population.male_50_54@2025": 0.05, + "ons.population.male_55_59@2025": 0.05, + "ons.population.male_5_9@2025": 0.05, + "ons.population.male_60_64@2025": 0.05, + "ons.population.male_65_69@2025": 0.05, + "ons.population.male_70_74@2025": 0.05, + "ons.population.male_75_79@2025": 0.05, + "ons.population.male_80_84@2025": 0.05, + "ons.population.male_85_89@2025": 0.05, + "ons.population.male_90_plus@2025": 0.05, + "ons.population.scotland_children_under_16@2025": 0.05, + "ons.population.scotland_babies_under_1@2025": 0.05, + "ons.household_composition.lone_households_under_65@2025": 0.05, + "ons.household_composition.lone_households_over_65@2025": 0.05, + "ons.household_composition.couple_no_children_households@2025": 0.05, + "ons.household_composition.couple_under_3_children_households@2025": 0.05, + "ons.household_composition.couple_3_plus_children_households@2025": 0.05, + "ons.household_composition.couple_non_dependent_children_only_households@2025": 0.05, + "ons.household_composition.lone_parent_dependent_children_households@2025": 0.05, + "voa.council_tax_stock.band_a@2025": 0.05, + "scotgov.council_tax_stock.band_a@2025": 0.05, + "voa.council_tax_stock.band_b@2025": 0.05, + "scotgov.council_tax_stock.band_b@2025": 0.05, + "voa.council_tax_stock.band_c@2025": 0.05, + "scotgov.council_tax_stock.band_c@2025": 0.05, + "voa.council_tax_stock.band_d@2025": 0.05, + "scotgov.council_tax_stock.band_d@2025": 0.05, + "voa.council_tax_stock.band_e@2025": 0.05, + "scotgov.council_tax_stock.band_e@2025": 0.05, + "voa.council_tax_stock.band_f@2025": 0.05, + "scotgov.council_tax_stock.band_f@2025": 0.05, + "voa.council_tax_stock.band_g@2025": 0.05, + "scotgov.council_tax_stock.band_g@2025": 0.05, + "voa.council_tax_stock.band_h@2025": 0.05, + "scotgov.council_tax_stock.band_h@2025": 0.05, + "voa.council_tax_stock.total@2025": 0.05, + "scotgov.council_tax_stock.total@2025": 0.05, + "scotgov.scottish_child_payment_spending@2025": 0.05, + "ons.public_sector_employment@2025": 0.05, + "ons.land.land_value@2025": 0.05, + "ons.land.household_land_value@2025": 0.05, + "ons.land.corporate_land_value@2025": 0.05, + "slc.repayments.england_total_higher_education@2025": 0.05, + "slc.repayments.england_plan_1@2025": 0.05, + "slc.repayments.england_plan_2@2025": 0.05, + "slc.borrowers.plan_5_above_threshold@2025": 0.05, + "slc.support.maintenance_loan_recipients@2025": 0.05, + "slc.support.maintenance_loan_spend@2025": 0.05, + "slc.support.parents_learning_allowance_recipients@2025": 0.05, + "slc.support.parents_learning_allowance_spend@2025": 0.05, + "slc.support.adult_dependants_grant_recipients@2025": 0.05, + "slc.support.adult_dependants_grant_spend@2025": 0.05, + "dwp.uc.households@2025": 0.05, + "hmrc.tfc.government_top_up@2025": 0.05, + "hmrc.tfc.children_with_used_accounts@2025": 0.05, + "dfe.funded_childcare.working_parent_children_2_to_4@2025": 0.05, + "dfe.funded_childcare.early_learning_2_year_olds@2025": 0.05, + "dfe.funded_childcare.universal_only_children@2025": 0.05, + "dft.bus_fare_receipts.england@2025": 0.05, + "dft.bus_net_support.england@2025": 0.05 + }, + "excluded_zero_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "excluded_adjudicated_row": "obr.capital_gains_tax@2025", + "active_weight_columns": 52846, + "scipy_status": 2, + "scipy_message": "The problem is infeasible. (HiGHS Status 8: model_status is Infeasible; primal_status is None)", + "elapsed_seconds": 1.2476186249987222, + "status": "infeasible_for_named_rows_and_tolerances_under_cap" + }, + { + "label": "lone_parent_5pct_other_supported_non_cgt_25pct", + "row_count": 363, + "row_names": [ + "obr.income_tax@2025", + "obr.ni@2025", + "obr.ni_employee@2025", + "obr.ni_employer@2025", + "obr.ni_self_employed@2025", + "obr.vat@2025", + "obr.sdlt@2025", + "obr.attendance_allowance@2025", + "obr.carers_allowance@2025", + "obr.child_benefit@2025", + "obr.council_tax@2025", + "obr.esa@2025", + "obr.jobseekers_allowance@2025", + "obr.pension_credit@2025", + "obr.pip@2025", + "obr.state_pension@2025", + "obr.statutory_maternity_pay@2025", + "obr.tv_licence_fee@2025", + "obr.winter_fuel_allowance@2025", + "isc.private_school_students@2025", + "hmrc.salary_sacrifice.users_total@2025", + "hmrc.salary_sacrifice.users_below_cap@2025", + "hmrc.salary_sacrifice.users_above_cap@2025", + "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025", + "hmrc/property_income_count_income_band_100_000_to_150_000@2025", + "hmrc/property_income_count_income_band_12_570_to_15_000@2025", + "hmrc/property_income_count_income_band_15_000_to_20_000@2025", + "hmrc/property_income_count_income_band_150_000_to_200_000@2025", + "hmrc/property_income_count_income_band_20_000_to_30_000@2025", + "hmrc/property_income_count_income_band_200_000_to_300_000@2025", + "hmrc/property_income_count_income_band_30_000_to_40_000@2025", + "hmrc/property_income_count_income_band_300_000_to_500_000@2025", + "hmrc/property_income_count_income_band_40_000_to_50_000@2025", + "hmrc/property_income_count_income_band_50_000_to_70_000@2025", + "hmrc/property_income_count_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025", + "hmrc.cgt.taxpayers_total@2025", + "hmrc.cgt.gains_total@2025", + "dwp.benefit_cap.capped_households@2025", + "dwp.esa_claimants@2025", + "dwp.esa_contrib_claimants@2025", + "dwp.esa_income_claimants@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp.uc.scotland_households_child_under_1@2025", + "dwp.uc.two_child_limit.households_affected@2025", + "dwp.uc.two_child_limit.children_affected@2025", + "dwp.uc.two_child_limit.children_in_affected_households@2025", + "dwp.uc.two_child_limit.households_3_children@2025", + "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "dwp.uc.two_child_limit.households_4_children@2025", + "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "dwp.uc.two_child_limit.households_claimant_pip@2025", + "dwp.uc.two_child_limit.children_claimant_pip@2025", + "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "ons.population.uk_total@2025", + "ons.population.age_0_9_by_region@2025", + "ons.population.age_10_19_by_region@2025", + "ons.population.age_20_29_by_region@2025", + "ons.population.age_30_39_by_region@2025", + "ons.population.age_40_49_by_region@2025", + "ons.population.age_50_59_by_region@2025", + "ons.population.age_60_69_by_region@2025", + "ons.population.age_70_79_by_region@2025", + "ons.population.age_80_89_by_region@2025", + "ons.population.female_0_4@2025", + "ons.population.female_10_14@2025", + "ons.population.female_15_19@2025", + "ons.population.female_20_24@2025", + "ons.population.female_25_29@2025", + "ons.population.female_30_34@2025", + "ons.population.female_35_39@2025", + "ons.population.female_40_44@2025", + "ons.population.female_45_49@2025", + "ons.population.female_50_54@2025", + "ons.population.female_55_59@2025", + "ons.population.female_5_9@2025", + "ons.population.female_60_64@2025", + "ons.population.female_65_69@2025", + "ons.population.female_70_74@2025", + "ons.population.female_75_79@2025", + "ons.population.female_80_84@2025", + "ons.population.female_85_89@2025", + "ons.population.female_90_plus@2025", + "ons.population.male_0_4@2025", + "ons.population.male_10_14@2025", + "ons.population.male_15_19@2025", + "ons.population.male_20_24@2025", + "ons.population.male_25_29@2025", + "ons.population.male_30_34@2025", + "ons.population.male_35_39@2025", + "ons.population.male_40_44@2025", + "ons.population.male_45_49@2025", + "ons.population.male_50_54@2025", + "ons.population.male_55_59@2025", + "ons.population.male_5_9@2025", + "ons.population.male_60_64@2025", + "ons.population.male_65_69@2025", + "ons.population.male_70_74@2025", + "ons.population.male_75_79@2025", + "ons.population.male_80_84@2025", + "ons.population.male_85_89@2025", + "ons.population.male_90_plus@2025", + "ons.population.scotland_children_under_16@2025", + "ons.population.scotland_babies_under_1@2025", + "ons.household_composition.lone_households_under_65@2025", + "ons.household_composition.lone_households_over_65@2025", + "ons.household_composition.couple_no_children_households@2025", + "ons.household_composition.couple_under_3_children_households@2025", + "ons.household_composition.couple_3_plus_children_households@2025", + "ons.household_composition.couple_non_dependent_children_only_households@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "voa.council_tax_stock.band_a@2025", + "scotgov.council_tax_stock.band_a@2025", + "voa.council_tax_stock.band_b@2025", + "scotgov.council_tax_stock.band_b@2025", + "voa.council_tax_stock.band_c@2025", + "scotgov.council_tax_stock.band_c@2025", + "voa.council_tax_stock.band_d@2025", + "scotgov.council_tax_stock.band_d@2025", + "voa.council_tax_stock.band_e@2025", + "scotgov.council_tax_stock.band_e@2025", + "voa.council_tax_stock.band_f@2025", + "scotgov.council_tax_stock.band_f@2025", + "voa.council_tax_stock.band_g@2025", + "scotgov.council_tax_stock.band_g@2025", + "voa.council_tax_stock.band_h@2025", + "scotgov.council_tax_stock.band_h@2025", + "voa.council_tax_stock.total@2025", + "scotgov.council_tax_stock.total@2025", + "scotgov.scottish_child_payment_spending@2025", + "ons.public_sector_employment@2025", + "ons.land.land_value@2025", + "ons.land.household_land_value@2025", + "ons.land.corporate_land_value@2025", + "slc.repayments.england_total_higher_education@2025", + "slc.repayments.england_plan_1@2025", + "slc.repayments.england_plan_2@2025", + "slc.borrowers.plan_5_above_threshold@2025", + "slc.support.maintenance_loan_recipients@2025", + "slc.support.maintenance_loan_spend@2025", + "slc.support.parents_learning_allowance_recipients@2025", + "slc.support.parents_learning_allowance_spend@2025", + "slc.support.adult_dependants_grant_recipients@2025", + "slc.support.adult_dependants_grant_spend@2025", + "dwp.uc.households@2025", + "hmrc.tfc.government_top_up@2025", + "hmrc.tfc.children_with_used_accounts@2025", + "dfe.funded_childcare.working_parent_children_2_to_4@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dft.bus_fare_receipts.england@2025", + "dft.bus_net_support.england@2025" + ], + "row_relative_tolerances": { + "obr.income_tax@2025": 0.25, + "obr.ni@2025": 0.25, + "obr.ni_employee@2025": 0.25, + "obr.ni_employer@2025": 0.25, + "obr.ni_self_employed@2025": 0.25, + "obr.vat@2025": 0.25, + "obr.sdlt@2025": 0.25, + "obr.attendance_allowance@2025": 0.25, + "obr.carers_allowance@2025": 0.25, + "obr.child_benefit@2025": 0.25, + "obr.council_tax@2025": 0.25, + "obr.esa@2025": 0.25, + "obr.jobseekers_allowance@2025": 0.25, + "obr.pension_credit@2025": 0.25, + "obr.pip@2025": 0.25, + "obr.state_pension@2025": 0.25, + "obr.statutory_maternity_pay@2025": 0.25, + "obr.tv_licence_fee@2025": 0.25, + "obr.winter_fuel_allowance@2025": 0.25, + "isc.private_school_students@2025": 0.25, + "hmrc.salary_sacrifice.users_total@2025": 0.25, + "hmrc.salary_sacrifice.users_below_cap@2025": 0.25, + "hmrc.salary_sacrifice.users_above_cap@2025": 0.25, + "hmrc/employment_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/employment_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/employment_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/employment_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/employment_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/employment_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/employment_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/employment_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/employment_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/employment_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/employment_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/dividend_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/dividend_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/dividend_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/dividend_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/dividend_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/dividend_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/dividend_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/dividend_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/dividend_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/dividend_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/dividend_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/property_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/property_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/property_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/property_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/property_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/property_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/property_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/property_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/property_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/property_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/property_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/state_pension_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/state_pension_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/state_pension_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/state_pension_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/state_pension_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/state_pension_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/state_pension_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/state_pension_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/state_pension_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/state_pension_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/state_pension_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc.cgt.taxpayers_total@2025": 0.25, + "hmrc.cgt.gains_total@2025": 0.25, + "dwp.benefit_cap.capped_households@2025": 0.25, + "dwp.esa_claimants@2025": 0.25, + "dwp.esa_contrib_claimants@2025": 0.25, + "dwp.esa_income_claimants@2025": 0.25, + "dwp.uc.households_children_1@2025": 0.25, + "dwp.uc.households_children_2@2025": 0.25, + "dwp.uc.households_children_3@2025": 0.25, + "dwp.uc.households_children_4@2025": 0.25, + "dwp.uc.households_children_5_or_more@2025": 0.25, + "dwp.uc.households_single_no_children@2025": 0.25, + "dwp.uc.households_single_with_children@2025": 0.05, + "dwp.uc.households_couple_no_children@2025": 0.25, + "dwp.uc.households_couple_with_children@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp.uc.scotland_households_child_under_1@2025": 0.25, + "dwp.uc.two_child_limit.households_affected@2025": 0.25, + "dwp.uc.two_child_limit.children_affected@2025": 0.25, + "dwp.uc.two_child_limit.children_in_affected_households@2025": 0.25, + "dwp.uc.two_child_limit.households_3_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_3_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_4_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_4_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_5_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_5_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_6_plus_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_claimant_pip@2025": 0.25, + "dwp.uc.two_child_limit.children_claimant_pip@2025": 0.25, + "dwp.uc.two_child_limit.households_disabled_child_element@2025": 0.25, + "dwp.uc.two_child_limit.children_disabled_child_element@2025": 0.25, + "ons.population.uk_total@2025": 0.25, + "ons.population.age_0_9_by_region@2025": 0.25, + "ons.population.age_10_19_by_region@2025": 0.25, + "ons.population.age_20_29_by_region@2025": 0.25, + "ons.population.age_30_39_by_region@2025": 0.25, + "ons.population.age_40_49_by_region@2025": 0.25, + "ons.population.age_50_59_by_region@2025": 0.25, + "ons.population.age_60_69_by_region@2025": 0.25, + "ons.population.age_70_79_by_region@2025": 0.25, + "ons.population.age_80_89_by_region@2025": 0.25, + "ons.population.female_0_4@2025": 0.25, + "ons.population.female_10_14@2025": 0.25, + "ons.population.female_15_19@2025": 0.25, + "ons.population.female_20_24@2025": 0.25, + "ons.population.female_25_29@2025": 0.25, + "ons.population.female_30_34@2025": 0.25, + "ons.population.female_35_39@2025": 0.25, + "ons.population.female_40_44@2025": 0.25, + "ons.population.female_45_49@2025": 0.25, + "ons.population.female_50_54@2025": 0.25, + "ons.population.female_55_59@2025": 0.25, + "ons.population.female_5_9@2025": 0.25, + "ons.population.female_60_64@2025": 0.25, + "ons.population.female_65_69@2025": 0.25, + "ons.population.female_70_74@2025": 0.25, + "ons.population.female_75_79@2025": 0.25, + "ons.population.female_80_84@2025": 0.25, + "ons.population.female_85_89@2025": 0.25, + "ons.population.female_90_plus@2025": 0.25, + "ons.population.male_0_4@2025": 0.25, + "ons.population.male_10_14@2025": 0.25, + "ons.population.male_15_19@2025": 0.25, + "ons.population.male_20_24@2025": 0.25, + "ons.population.male_25_29@2025": 0.25, + "ons.population.male_30_34@2025": 0.25, + "ons.population.male_35_39@2025": 0.25, + "ons.population.male_40_44@2025": 0.25, + "ons.population.male_45_49@2025": 0.25, + "ons.population.male_50_54@2025": 0.25, + "ons.population.male_55_59@2025": 0.25, + "ons.population.male_5_9@2025": 0.25, + "ons.population.male_60_64@2025": 0.25, + "ons.population.male_65_69@2025": 0.25, + "ons.population.male_70_74@2025": 0.25, + "ons.population.male_75_79@2025": 0.25, + "ons.population.male_80_84@2025": 0.25, + "ons.population.male_85_89@2025": 0.25, + "ons.population.male_90_plus@2025": 0.25, + "ons.population.scotland_children_under_16@2025": 0.25, + "ons.population.scotland_babies_under_1@2025": 0.25, + "ons.household_composition.lone_households_under_65@2025": 0.25, + "ons.household_composition.lone_households_over_65@2025": 0.25, + "ons.household_composition.couple_no_children_households@2025": 0.25, + "ons.household_composition.couple_under_3_children_households@2025": 0.25, + "ons.household_composition.couple_3_plus_children_households@2025": 0.25, + "ons.household_composition.couple_non_dependent_children_only_households@2025": 0.25, + "ons.household_composition.lone_parent_dependent_children_households@2025": 0.25, + "voa.council_tax_stock.band_a@2025": 0.25, + "scotgov.council_tax_stock.band_a@2025": 0.25, + "voa.council_tax_stock.band_b@2025": 0.25, + "scotgov.council_tax_stock.band_b@2025": 0.25, + "voa.council_tax_stock.band_c@2025": 0.25, + "scotgov.council_tax_stock.band_c@2025": 0.25, + "voa.council_tax_stock.band_d@2025": 0.25, + "scotgov.council_tax_stock.band_d@2025": 0.25, + "voa.council_tax_stock.band_e@2025": 0.25, + "scotgov.council_tax_stock.band_e@2025": 0.25, + "voa.council_tax_stock.band_f@2025": 0.25, + "scotgov.council_tax_stock.band_f@2025": 0.25, + "voa.council_tax_stock.band_g@2025": 0.25, + "scotgov.council_tax_stock.band_g@2025": 0.25, + "voa.council_tax_stock.band_h@2025": 0.25, + "scotgov.council_tax_stock.band_h@2025": 0.25, + "voa.council_tax_stock.total@2025": 0.25, + "scotgov.council_tax_stock.total@2025": 0.25, + "scotgov.scottish_child_payment_spending@2025": 0.25, + "ons.public_sector_employment@2025": 0.25, + "ons.land.land_value@2025": 0.25, + "ons.land.household_land_value@2025": 0.25, + "ons.land.corporate_land_value@2025": 0.25, + "slc.repayments.england_total_higher_education@2025": 0.25, + "slc.repayments.england_plan_1@2025": 0.25, + "slc.repayments.england_plan_2@2025": 0.25, + "slc.borrowers.plan_5_above_threshold@2025": 0.25, + "slc.support.maintenance_loan_recipients@2025": 0.25, + "slc.support.maintenance_loan_spend@2025": 0.25, + "slc.support.parents_learning_allowance_recipients@2025": 0.25, + "slc.support.parents_learning_allowance_spend@2025": 0.25, + "slc.support.adult_dependants_grant_recipients@2025": 0.25, + "slc.support.adult_dependants_grant_spend@2025": 0.25, + "dwp.uc.households@2025": 0.25, + "hmrc.tfc.government_top_up@2025": 0.25, + "hmrc.tfc.children_with_used_accounts@2025": 0.25, + "dfe.funded_childcare.working_parent_children_2_to_4@2025": 0.25, + "dfe.funded_childcare.early_learning_2_year_olds@2025": 0.25, + "dfe.funded_childcare.universal_only_children@2025": 0.25, + "dft.bus_fare_receipts.england@2025": 0.25, + "dft.bus_net_support.england@2025": 0.25 + }, + "excluded_zero_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "excluded_adjudicated_row": "obr.capital_gains_tax@2025", + "active_weight_columns": 52846, + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "elapsed_seconds": 4.884771540993825, + "status": "feasible_for_named_rows_and_tolerances_only", + "maximum_normalized_constraint_violation": 1.3766765505351941e-14, + "maximum_weight_ratio_bound_violation": -0.0, + "lone_parent_estimate": 2031841.1583333327, + "lone_parent_target": 2138780.1666666665, + "lone_parent_relative_error": -0.050000000000000155 + } + ], + "limits": [ + "The two positive-target zero UC rows remain in the full 366-row infeasibility assessment. Their omission from each LP is explicit and diagnostic only.", + "The second and third probes additionally omit only the adjudicated OBR CGT row; the two HMRC CGT rows remain constrained.", + "No total household mass, effective sample size, or source-concentration constraints are imposed.", + "Feasibility applies only to the recorded rows, relative tolerances and 0–10-times-fresh-prior bounds; it establishes no population concentration or release readiness.", + "The canonical terminal-gate failure is preserved. These probes run no engine or calibration, export no witness weights, and change no source code or saved matrix inputs.", + "An inconclusive or time-limit result is not an infeasibility proof.", + "The 364 supported rows remain jointly infeasible at 5%; omitting OBR CGT leaves 363 rows still infeasible at 5%. Neither result identifies a minimal conflicting subset.", + "Lone-parent fit within 5% is compatible with the other 362 included rows within 25% under these bounds. This does not establish that all rows can improve simultaneously or that the calibration loss is optimal." + ] + }, + "fresh_bounded_redistribution_lp_probes": { + "population_arm": "fresh-current-recovered", + "population_receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "input_archive_sha256": "4a69939b0fb48570cfe1dec931a89b5445b91d8e527999ca0db672552d5bd825", + "weight_archive_sha256": "dd1a4953cd7243f7491d9d2d274c1deaa0ee71c757ba2bbf37ca3e0520fbe434", + "model_year": 2025, + "solver": "scipy.optimize.linprog(method=highs)", + "scipy_version": "1.17.1", + "objective": "Zero objective; feasibility only.", + "per_probe_time_limit_seconds": 30.0, + "weight_cap": "0 <= weight <= 10 * fresh prior weight", + "ess_constraint": false, + "aggregate_receipt_sha256": "2aa871694a54d2f57e81589c9241238b277b1533abdb6c8ff90fef7389623a07", + "purpose": "Test bounded redistribution around current calibrated weights while preserving total household weight.", + "fixed_household_mass_constraint": true, + "fixed_household_weight_mass": 29900349.733421523, + "row_count": 363, + "row_names": [ + "obr.income_tax@2025", + "obr.ni@2025", + "obr.ni_employee@2025", + "obr.ni_employer@2025", + "obr.ni_self_employed@2025", + "obr.vat@2025", + "obr.sdlt@2025", + "obr.attendance_allowance@2025", + "obr.carers_allowance@2025", + "obr.child_benefit@2025", + "obr.council_tax@2025", + "obr.esa@2025", + "obr.jobseekers_allowance@2025", + "obr.pension_credit@2025", + "obr.pip@2025", + "obr.state_pension@2025", + "obr.statutory_maternity_pay@2025", + "obr.tv_licence_fee@2025", + "obr.winter_fuel_allowance@2025", + "isc.private_school_students@2025", + "hmrc.salary_sacrifice.users_total@2025", + "hmrc.salary_sacrifice.users_below_cap@2025", + "hmrc.salary_sacrifice.users_above_cap@2025", + "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025", + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025", + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025", + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025", + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025", + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025", + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025", + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025", + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025", + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025", + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025", + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025", + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_income_band_70_000_to_100_000@2025", + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025", + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025", + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025", + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025", + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025", + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025", + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025", + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025", + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025", + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025", + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025", + "hmrc/property_income_count_income_band_100_000_to_150_000@2025", + "hmrc/property_income_count_income_band_12_570_to_15_000@2025", + "hmrc/property_income_count_income_band_15_000_to_20_000@2025", + "hmrc/property_income_count_income_band_150_000_to_200_000@2025", + "hmrc/property_income_count_income_band_20_000_to_30_000@2025", + "hmrc/property_income_count_income_band_200_000_to_300_000@2025", + "hmrc/property_income_count_income_band_30_000_to_40_000@2025", + "hmrc/property_income_count_income_band_300_000_to_500_000@2025", + "hmrc/property_income_count_income_band_40_000_to_50_000@2025", + "hmrc/property_income_count_income_band_50_000_to_70_000@2025", + "hmrc/property_income_count_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025", + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025", + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025", + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025", + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025", + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025", + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025", + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025", + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025", + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025", + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025", + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_income_band_70_000_to_100_000@2025", + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025", + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025", + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025", + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025", + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025", + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025", + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025", + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025", + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025", + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025", + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025", + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025", + "hmrc.cgt.taxpayers_total@2025", + "hmrc.cgt.gains_total@2025", + "dwp.benefit_cap.capped_households@2025", + "dwp.esa_claimants@2025", + "dwp.esa_contrib_claimants@2025", + "dwp.esa_income_claimants@2025", + "dwp.uc.households_children_1@2025", + "dwp.uc.households_children_2@2025", + "dwp.uc.households_children_3@2025", + "dwp.uc.households_children_4@2025", + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.households_single_no_children@2025", + "dwp.uc.households_single_with_children@2025", + "dwp.uc.households_couple_no_children@2025", + "dwp.uc.households_couple_with_children@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025", + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025", + "dwp.uc.scotland_households_child_under_1@2025", + "dwp.uc.two_child_limit.households_affected@2025", + "dwp.uc.two_child_limit.children_affected@2025", + "dwp.uc.two_child_limit.children_in_affected_households@2025", + "dwp.uc.two_child_limit.households_3_children@2025", + "dwp.uc.two_child_limit.children_in_3_children_households@2025", + "dwp.uc.two_child_limit.households_4_children@2025", + "dwp.uc.two_child_limit.children_in_4_children_households@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.children_in_5_children_households@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025", + "dwp.uc.two_child_limit.households_claimant_pip@2025", + "dwp.uc.two_child_limit.children_claimant_pip@2025", + "dwp.uc.two_child_limit.households_disabled_child_element@2025", + "dwp.uc.two_child_limit.children_disabled_child_element@2025", + "ons.population.uk_total@2025", + "ons.population.age_0_9_by_region@2025", + "ons.population.age_10_19_by_region@2025", + "ons.population.age_20_29_by_region@2025", + "ons.population.age_30_39_by_region@2025", + "ons.population.age_40_49_by_region@2025", + "ons.population.age_50_59_by_region@2025", + "ons.population.age_60_69_by_region@2025", + "ons.population.age_70_79_by_region@2025", + "ons.population.age_80_89_by_region@2025", + "ons.population.female_0_4@2025", + "ons.population.female_10_14@2025", + "ons.population.female_15_19@2025", + "ons.population.female_20_24@2025", + "ons.population.female_25_29@2025", + "ons.population.female_30_34@2025", + "ons.population.female_35_39@2025", + "ons.population.female_40_44@2025", + "ons.population.female_45_49@2025", + "ons.population.female_50_54@2025", + "ons.population.female_55_59@2025", + "ons.population.female_5_9@2025", + "ons.population.female_60_64@2025", + "ons.population.female_65_69@2025", + "ons.population.female_70_74@2025", + "ons.population.female_75_79@2025", + "ons.population.female_80_84@2025", + "ons.population.female_85_89@2025", + "ons.population.female_90_plus@2025", + "ons.population.male_0_4@2025", + "ons.population.male_10_14@2025", + "ons.population.male_15_19@2025", + "ons.population.male_20_24@2025", + "ons.population.male_25_29@2025", + "ons.population.male_30_34@2025", + "ons.population.male_35_39@2025", + "ons.population.male_40_44@2025", + "ons.population.male_45_49@2025", + "ons.population.male_50_54@2025", + "ons.population.male_55_59@2025", + "ons.population.male_5_9@2025", + "ons.population.male_60_64@2025", + "ons.population.male_65_69@2025", + "ons.population.male_70_74@2025", + "ons.population.male_75_79@2025", + "ons.population.male_80_84@2025", + "ons.population.male_85_89@2025", + "ons.population.male_90_plus@2025", + "ons.population.scotland_children_under_16@2025", + "ons.population.scotland_babies_under_1@2025", + "ons.household_composition.lone_households_under_65@2025", + "ons.household_composition.lone_households_over_65@2025", + "ons.household_composition.couple_no_children_households@2025", + "ons.household_composition.couple_under_3_children_households@2025", + "ons.household_composition.couple_3_plus_children_households@2025", + "ons.household_composition.couple_non_dependent_children_only_households@2025", + "ons.household_composition.lone_parent_dependent_children_households@2025", + "voa.council_tax_stock.band_a@2025", + "scotgov.council_tax_stock.band_a@2025", + "voa.council_tax_stock.band_b@2025", + "scotgov.council_tax_stock.band_b@2025", + "voa.council_tax_stock.band_c@2025", + "scotgov.council_tax_stock.band_c@2025", + "voa.council_tax_stock.band_d@2025", + "scotgov.council_tax_stock.band_d@2025", + "voa.council_tax_stock.band_e@2025", + "scotgov.council_tax_stock.band_e@2025", + "voa.council_tax_stock.band_f@2025", + "scotgov.council_tax_stock.band_f@2025", + "voa.council_tax_stock.band_g@2025", + "scotgov.council_tax_stock.band_g@2025", + "voa.council_tax_stock.band_h@2025", + "scotgov.council_tax_stock.band_h@2025", + "voa.council_tax_stock.total@2025", + "scotgov.council_tax_stock.total@2025", + "scotgov.scottish_child_payment_spending@2025", + "ons.public_sector_employment@2025", + "ons.land.land_value@2025", + "ons.land.household_land_value@2025", + "ons.land.corporate_land_value@2025", + "slc.repayments.england_total_higher_education@2025", + "slc.repayments.england_plan_1@2025", + "slc.repayments.england_plan_2@2025", + "slc.borrowers.plan_5_above_threshold@2025", + "slc.support.maintenance_loan_recipients@2025", + "slc.support.maintenance_loan_spend@2025", + "slc.support.parents_learning_allowance_recipients@2025", + "slc.support.parents_learning_allowance_spend@2025", + "slc.support.adult_dependants_grant_recipients@2025", + "slc.support.adult_dependants_grant_spend@2025", + "dwp.uc.households@2025", + "hmrc.tfc.government_top_up@2025", + "hmrc.tfc.children_with_used_accounts@2025", + "dfe.funded_childcare.working_parent_children_2_to_4@2025", + "dfe.funded_childcare.early_learning_2_year_olds@2025", + "dfe.funded_childcare.universal_only_children@2025", + "dft.bus_fare_receipts.england@2025", + "dft.bus_net_support.england@2025" + ], + "row_relative_tolerances": { + "obr.income_tax@2025": 0.25, + "obr.ni@2025": 0.25, + "obr.ni_employee@2025": 0.25, + "obr.ni_employer@2025": 0.25, + "obr.ni_self_employed@2025": 0.25, + "obr.vat@2025": 0.25, + "obr.sdlt@2025": 0.25, + "obr.attendance_allowance@2025": 0.25, + "obr.carers_allowance@2025": 0.25, + "obr.child_benefit@2025": 0.25, + "obr.council_tax@2025": 0.25, + "obr.esa@2025": 0.25, + "obr.jobseekers_allowance@2025": 0.25, + "obr.pension_credit@2025": 0.25, + "obr.pip@2025": 0.25, + "obr.state_pension@2025": 0.25, + "obr.statutory_maternity_pay@2025": 0.25, + "obr.tv_licence_fee@2025": 0.25, + "obr.winter_fuel_allowance@2025": 0.25, + "isc.private_school_students@2025": 0.25, + "hmrc.salary_sacrifice.users_total@2025": 0.25, + "hmrc.salary_sacrifice.users_below_cap@2025": 0.25, + "hmrc.salary_sacrifice.users_above_cap@2025": 0.25, + "hmrc/employment_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/employment_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/employment_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/employment_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/employment_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/employment_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/employment_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/employment_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/employment_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/employment_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/employment_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/employment_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/employment_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/employment_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/employment_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/employment_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/employment_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/employment_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/employment_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/employment_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/employment_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/employment_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/employment_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/self_employment_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/self_employment_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/self_employment_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/self_employment_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/self_employment_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/self_employment_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/self_employment_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/self_employment_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/self_employment_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/self_employment_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/self_employment_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/self_employment_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/self_employment_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/dividend_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/dividend_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/dividend_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/dividend_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/dividend_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/dividend_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/dividend_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/dividend_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/dividend_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/dividend_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/dividend_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/dividend_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/property_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/property_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/property_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/property_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/property_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/property_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/property_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/property_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/property_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/property_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/property_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/private_pension_income_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/private_pension_income_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/private_pension_income_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/private_pension_income_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/private_pension_income_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/private_pension_income_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/private_pension_income_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/private_pension_income_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/private_pension_income_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/private_pension_income_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/private_pension_income_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/private_pension_income_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/private_pension_income_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/state_pension_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/state_pension_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/state_pension_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/state_pension_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/state_pension_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/state_pension_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/state_pension_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/state_pension_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/state_pension_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/state_pension_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/state_pension_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/state_pension_income_band_70_000_to_100_000@2025": 0.25, + "hmrc/state_pension_count_income_band_100_000_to_150_000@2025": 0.25, + "hmrc/state_pension_count_income_band_12_570_to_15_000@2025": 0.25, + "hmrc/state_pension_count_income_band_15_000_to_20_000@2025": 0.25, + "hmrc/state_pension_count_income_band_150_000_to_200_000@2025": 0.25, + "hmrc/state_pension_count_income_band_20_000_to_30_000@2025": 0.25, + "hmrc/state_pension_count_income_band_200_000_to_300_000@2025": 0.25, + "hmrc/state_pension_count_income_band_30_000_to_40_000@2025": 0.25, + "hmrc/state_pension_count_income_band_300_000_to_500_000@2025": 0.25, + "hmrc/state_pension_count_income_band_40_000_to_50_000@2025": 0.25, + "hmrc/state_pension_count_income_band_50_000_to_70_000@2025": 0.25, + "hmrc/state_pension_count_income_band_500_000_to_1_000_000@2025": 0.25, + "hmrc/state_pension_count_income_band_70_000_to_100_000@2025": 0.25, + "hmrc.cgt.taxpayers_total@2025": 0.25, + "hmrc.cgt.gains_total@2025": 0.25, + "dwp.benefit_cap.capped_households@2025": 0.25, + "dwp.esa_claimants@2025": 0.25, + "dwp.esa_contrib_claimants@2025": 0.25, + "dwp.esa_income_claimants@2025": 0.25, + "dwp.uc.households_children_1@2025": 0.25, + "dwp.uc.households_children_2@2025": 0.25, + "dwp.uc.households_children_3@2025": 0.25, + "dwp.uc.households_children_4@2025": 0.25, + "dwp.uc.households_children_5_or_more@2025": 0.25, + "dwp.uc.households_single_no_children@2025": 0.25, + "dwp.uc.households_single_with_children@2025": 0.05, + "dwp.uc.households_couple_no_children@2025": 0.25, + "dwp.uc.households_couple_with_children@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/SINGLE_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_27_600_to_28_800@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/LONE_PARENT_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_0_to_1_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_1_200_to_2_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_12_000_to_13_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_13_200_to_14_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_14_400_to_15_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_15_600_to_16_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_16_800_to_18_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_18_000_to_19_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_19_200_to_20_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_20_400_to_21_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_21_600_to_22_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_22_800_to_24_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_2_400_to_3_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_24_000_to_25_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_25_200_to_26_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_26_400_to_27_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_28_800_to_30_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_3_600_to_4_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_4_800_to_6_000@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_6_000_to_7_200@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_7_200_to_8_400@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_8_400_to_9_600@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_9_600_to_10_800@2025": 0.25, + "dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_10_800_to_12_000@2025": 0.25, + "dwp.uc.scotland_households_child_under_1@2025": 0.25, + "dwp.uc.two_child_limit.households_affected@2025": 0.25, + "dwp.uc.two_child_limit.children_affected@2025": 0.25, + "dwp.uc.two_child_limit.children_in_affected_households@2025": 0.25, + "dwp.uc.two_child_limit.households_3_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_3_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_4_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_4_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_5_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_5_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_6_plus_children@2025": 0.25, + "dwp.uc.two_child_limit.children_in_6_plus_children_households@2025": 0.25, + "dwp.uc.two_child_limit.households_claimant_pip@2025": 0.25, + "dwp.uc.two_child_limit.children_claimant_pip@2025": 0.25, + "dwp.uc.two_child_limit.households_disabled_child_element@2025": 0.25, + "dwp.uc.two_child_limit.children_disabled_child_element@2025": 0.25, + "ons.population.uk_total@2025": 0.25, + "ons.population.age_0_9_by_region@2025": 0.25, + "ons.population.age_10_19_by_region@2025": 0.25, + "ons.population.age_20_29_by_region@2025": 0.25, + "ons.population.age_30_39_by_region@2025": 0.25, + "ons.population.age_40_49_by_region@2025": 0.25, + "ons.population.age_50_59_by_region@2025": 0.25, + "ons.population.age_60_69_by_region@2025": 0.25, + "ons.population.age_70_79_by_region@2025": 0.25, + "ons.population.age_80_89_by_region@2025": 0.25, + "ons.population.female_0_4@2025": 0.25, + "ons.population.female_10_14@2025": 0.25, + "ons.population.female_15_19@2025": 0.25, + "ons.population.female_20_24@2025": 0.25, + "ons.population.female_25_29@2025": 0.25, + "ons.population.female_30_34@2025": 0.25, + "ons.population.female_35_39@2025": 0.25, + "ons.population.female_40_44@2025": 0.25, + "ons.population.female_45_49@2025": 0.25, + "ons.population.female_50_54@2025": 0.25, + "ons.population.female_55_59@2025": 0.25, + "ons.population.female_5_9@2025": 0.25, + "ons.population.female_60_64@2025": 0.25, + "ons.population.female_65_69@2025": 0.25, + "ons.population.female_70_74@2025": 0.25, + "ons.population.female_75_79@2025": 0.25, + "ons.population.female_80_84@2025": 0.25, + "ons.population.female_85_89@2025": 0.25, + "ons.population.female_90_plus@2025": 0.25, + "ons.population.male_0_4@2025": 0.25, + "ons.population.male_10_14@2025": 0.25, + "ons.population.male_15_19@2025": 0.25, + "ons.population.male_20_24@2025": 0.25, + "ons.population.male_25_29@2025": 0.25, + "ons.population.male_30_34@2025": 0.25, + "ons.population.male_35_39@2025": 0.25, + "ons.population.male_40_44@2025": 0.25, + "ons.population.male_45_49@2025": 0.25, + "ons.population.male_50_54@2025": 0.25, + "ons.population.male_55_59@2025": 0.25, + "ons.population.male_5_9@2025": 0.25, + "ons.population.male_60_64@2025": 0.25, + "ons.population.male_65_69@2025": 0.25, + "ons.population.male_70_74@2025": 0.25, + "ons.population.male_75_79@2025": 0.25, + "ons.population.male_80_84@2025": 0.25, + "ons.population.male_85_89@2025": 0.25, + "ons.population.male_90_plus@2025": 0.25, + "ons.population.scotland_children_under_16@2025": 0.25, + "ons.population.scotland_babies_under_1@2025": 0.25, + "ons.household_composition.lone_households_under_65@2025": 0.25, + "ons.household_composition.lone_households_over_65@2025": 0.25, + "ons.household_composition.couple_no_children_households@2025": 0.25, + "ons.household_composition.couple_under_3_children_households@2025": 0.25, + "ons.household_composition.couple_3_plus_children_households@2025": 0.25, + "ons.household_composition.couple_non_dependent_children_only_households@2025": 0.25, + "ons.household_composition.lone_parent_dependent_children_households@2025": 0.25, + "voa.council_tax_stock.band_a@2025": 0.25, + "scotgov.council_tax_stock.band_a@2025": 0.25, + "voa.council_tax_stock.band_b@2025": 0.25, + "scotgov.council_tax_stock.band_b@2025": 0.25, + "voa.council_tax_stock.band_c@2025": 0.25, + "scotgov.council_tax_stock.band_c@2025": 0.25, + "voa.council_tax_stock.band_d@2025": 0.25, + "scotgov.council_tax_stock.band_d@2025": 0.25, + "voa.council_tax_stock.band_e@2025": 0.25, + "scotgov.council_tax_stock.band_e@2025": 0.25, + "voa.council_tax_stock.band_f@2025": 0.25, + "scotgov.council_tax_stock.band_f@2025": 0.25, + "voa.council_tax_stock.band_g@2025": 0.25, + "scotgov.council_tax_stock.band_g@2025": 0.25, + "voa.council_tax_stock.band_h@2025": 0.25, + "scotgov.council_tax_stock.band_h@2025": 0.25, + "voa.council_tax_stock.total@2025": 0.25, + "scotgov.council_tax_stock.total@2025": 0.25, + "scotgov.scottish_child_payment_spending@2025": 0.25, + "ons.public_sector_employment@2025": 0.25, + "ons.land.land_value@2025": 0.25, + "ons.land.household_land_value@2025": 0.25, + "ons.land.corporate_land_value@2025": 0.25, + "slc.repayments.england_total_higher_education@2025": 0.25, + "slc.repayments.england_plan_1@2025": 0.25, + "slc.repayments.england_plan_2@2025": 0.25, + "slc.borrowers.plan_5_above_threshold@2025": 0.25, + "slc.support.maintenance_loan_recipients@2025": 0.25, + "slc.support.maintenance_loan_spend@2025": 0.25, + "slc.support.parents_learning_allowance_recipients@2025": 0.25, + "slc.support.parents_learning_allowance_spend@2025": 0.25, + "slc.support.adult_dependants_grant_recipients@2025": 0.25, + "slc.support.adult_dependants_grant_spend@2025": 0.25, + "dwp.uc.households@2025": 0.25, + "hmrc.tfc.government_top_up@2025": 0.25, + "hmrc.tfc.children_with_used_accounts@2025": 0.25, + "dfe.funded_childcare.working_parent_children_2_to_4@2025": 0.25, + "dfe.funded_childcare.early_learning_2_year_olds@2025": 0.25, + "dfe.funded_childcare.universal_only_children@2025": 0.25, + "dft.bus_fare_receipts.england@2025": 0.25, + "dft.bus_net_support.england@2025": 0.25 + }, + "excluded_zero_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "excluded_adjudicated_row": "obr.capital_gains_tax@2025", + "full_366_row_evaluation": { + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": [ + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025" + ], + "additional_zero_rows": [] + }, + "current_concentration": { + "households": { + "entity_count": 52846, + "positive_weight_count": 52846, + "effective_sample_size": 14049.762395866685, + "weight_mass": 29900349.733421523, + "maximum_weight_share": 0.0008226398996139875, + "top_one_percent_entity_count": 529, + "top_one_percent_weight_share": 0.12558151635559262 + }, + "original_source_households": { + "entity_count": 16288, + "positive_weight_count": 16288, + "effective_sample_size": 5062.211654145074, + "weight_mass": 29900349.733421523, + "maximum_weight_share": 0.0014873246547361064, + "top_one_percent_entity_count": 163, + "top_one_percent_weight_share": 0.10920350056909593 + }, + "share_basis": "Shares are of total household weight; source weights sum all descendant household weights. The top 1% count is ceil(0.01 * all entity count), including zero-weight entities in the count." + }, + "probes": [ + { + "current_weight_multiplier_bounds": [ + 0.75, + 1.25 + ], + "scipy_status": 0, + "scipy_message": "Optimization terminated successfully. (HiGHS Status 7: Optimal)", + "elapsed_seconds": 8.439331583038438, + "active_weight_columns": 52846, + "status": "feasible_for_named_bounds_and_tolerances_only", + "maximum_normalized_constraint_violation": 2.220446049250313e-16, + "maximum_weight_ratio_bound_violation": 0.0, + "relative_total_mass_error": 5.551115123125783e-15, + "lone_parent_current_estimate": 1839214.2526192775, + "lone_parent_witness_estimate": 2122724.007277353, + "lone_parent_target": 2138780.1666666665, + "lone_parent_witness_relative_error": -0.0075071574159663035, + "witness_concentration": { + "households": { + "entity_count": 52846, + "positive_weight_count": 52846, + "effective_sample_size": 13791.150918528969, + "weight_mass": 29900349.73342169, + "maximum_weight_share": 0.0009007495661723542, + "top_one_percent_entity_count": 529, + "top_one_percent_weight_share": 0.12550693800540344 + }, + "original_source_households": { + "entity_count": 16288, + "positive_weight_count": 16288, + "effective_sample_size": 4992.745762091116, + "weight_mass": 29900349.73342169, + "maximum_weight_share": 0.0017866569440408804, + "top_one_percent_entity_count": 163, + "top_one_percent_weight_share": 0.10929754072294261 + }, + "share_basis": "Shares are of total household weight; source weights sum all descendant household weights. The top 1% count is ceil(0.01 * all entity count), including zero-weight entities in the count." + }, + "protected_matrix_outcome_changes": [ + { + "name": "obr.income_tax@2025", + "current_estimate": 289208975664.497, + "witness_estimate": 248578188121.03146, + "change_percent": -14.048937260716333, + "target": 331437583074.4429, + "witness_target_error_percent": -24.99999975404138, + "constrained": true + }, + { + "name": "obr.ni@2025", + "current_estimate": 196836566204.77274, + "witness_estimate": 177413635813.24832, + "change_percent": -9.867541771338551, + "target": 200081395082.7125, + "witness_target_error_percent": -11.32926890083581, + "constrained": true + }, + { + "name": "obr.ni_employee@2025", + "current_estimate": 47811612495.26749, + "witness_estimate": 43311485951.90435, + "change_percent": -9.41220408286495, + "target": 49544363784.26465, + "witness_target_error_percent": -12.580397357609963, + "constrained": true + }, + { + "name": "obr.ni_employer@2025", + "current_estimate": 146121664326.81866, + "witness_estimate": 131550290348.51138, + "change_percent": -9.97208322628782, + "target": 145324007512.71753, + "witness_target_error_percent": -9.477936508873652, + "constrained": true + }, + { + "name": "obr.ni_self_employed@2025", + "current_estimate": 2903289600.529053, + "witness_estimate": 2551859703.4528856, + "change_percent": -12.104541586623952, + "target": 2902816090.4147716, + "witness_target_error_percent": -12.09020399606987, + "constrained": true + }, + { + "name": "obr.vat@2025", + "current_estimate": 192246685136.8141, + "witness_estimate": 180900369068.8394, + "change_percent": -5.90195667608, + "target": 180168938685.41794, + "witness_target_error_percent": 0.4059691913368857, + "constrained": true + }, + { + "name": "obr.capital_gains_tax@2025", + "current_estimate": 31562324644.515053, + "witness_estimate": 26064838281.839798, + "change_percent": -17.417875345346644, + "target": 21801546197.09165, + "witness_target_error_percent": 19.554998742781283, + "constrained": false + }, + { + "name": "obr.sdlt@2025", + "current_estimate": 15467288072.986925, + "witness_estimate": 11668292887.718458, + "change_percent": -24.561482060344364, + "target": 15406516698.785578, + "witness_target_error_percent": -24.263913019104354, + "constrained": true + }, + { + "name": "obr.attendance_allowance@2025", + "current_estimate": 8495117485.085889, + "witness_estimate": 8782081214.382246, + "change_percent": 3.3779842338867327, + "target": 8492497075.074617, + "witness_target_error_percent": 3.4098821200369223, + "constrained": true + }, + { + "name": "obr.carers_allowance@2025", + "current_estimate": 4571134406.246751, + "witness_estimate": 4648875517.34041, + "change_percent": 1.7006962426530547, + "target": 4569403813.760573, + "witness_target_error_percent": 1.7392138409941138, + "constrained": true + }, + { + "name": "obr.child_benefit@2025", + "current_estimate": 15759391835.595362, + "witness_estimate": 15769144643.195559, + "change_percent": 0.06188568506919623, + "target": 13389272724.45089, + "witness_target_error_percent": 17.774467424198882, + "constrained": true + }, + { + "name": "obr.council_tax@2025", + "current_estimate": 47022874245.53085, + "witness_estimate": 44315294770.92021, + "change_percent": -5.758005051909343, + "target": 50925163826.30539, + "witness_target_error_percent": -12.97957347359745, + "constrained": true + }, + { + "name": "obr.esa@2025", + "current_estimate": 6475729628.614429, + "witness_estimate": 7106834684.442913, + "change_percent": 9.745698045202623, + "target": 7206287181.538654, + "witness_target_error_percent": -1.380079569275594, + "constrained": true + }, + { + "name": "obr.jobseekers_allowance@2025", + "current_estimate": 281315294.25617826, + "witness_estimate": 271544490.02499485, + "change_percent": -3.473257384394346, + "target": 280558748.04472804, + "witness_target_error_percent": -3.2129662976312146, + "constrained": true + }, + { + "name": "obr.pension_credit@2025", + "current_estimate": 6146934201.258123, + "witness_estimate": 7035116153.603315, + "change_percent": 14.44918593993414, + "target": 6146422389.476461, + "witness_target_error_percent": 14.458716108551585, + "constrained": true + }, + { + "name": "obr.pip@2025", + "current_estimate": 36900612286.28908, + "witness_estimate": 38042763478.33379, + "change_percent": 3.095209323854764, + "target": 36910059270.5278, + "witness_target_error_percent": 3.0688225112400325, + "constrained": true + }, + { + "name": "obr.state_pension@2025", + "current_estimate": 137018135866.62624, + "witness_estimate": 134319837164.75609, + "change_percent": -1.969300403047869, + "target": 146185954351.57382, + "witness_target_error_percent": -8.117139050363209, + "constrained": true + }, + { + "name": "obr.statutory_maternity_pay@2025", + "current_estimate": 3195978838.32002, + "witness_estimate": 3196272283.5107465, + "change_percent": 0.009181700054083919, + "target": 3194800881.520547, + "witness_target_error_percent": 0.04605614073511788, + "constrained": true + }, + { + "name": "obr.tv_licence_fee@2025", + "current_estimate": 3873761399.8596377, + "witness_estimate": 3839831604.2843866, + "change_percent": -0.8758875953609468, + "target": 3872000000.0, + "witness_target_error_percent": -0.8307953438949744, + "constrained": true + }, + { + "name": "obr.winter_fuel_allowance@2025", + "current_estimate": 1911426611.002743, + "witness_estimate": 1927285544.1862385, + "change_percent": 0.8296909278235898, + "target": 1911040880.4619167, + "witness_target_error_percent": 0.8500427118228515, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_100_000_to_150_000@2025", + "current_estimate": 82437277887.10991, + "witness_estimate": 67825015141.63399, + "change_percent": -17.7253096171929, + "target": 82300000000.0, + "witness_target_error_percent": -17.588073946981787, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_12_570_to_15_000@2025", + "current_estimate": 16867559505.962223, + "witness_estimate": 17358474303.450073, + "change_percent": 2.910407977599405, + "target": 16900000000.0, + "witness_target_error_percent": 2.712865700888001, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_15_000_to_20_000@2025", + "current_estimate": 48571104009.64969, + "witness_estimate": 48273215509.14653, + "change_percent": -0.61330395216872, + "target": 48600000000.0, + "witness_target_error_percent": -0.6723960717149535, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_150_000_to_200_000@2025", + "current_estimate": 39343722658.34471, + "witness_estimate": 32986466395.202564, + "change_percent": -16.158247958251582, + "target": 39200000000.0, + "witness_target_error_percent": -15.850851032646517, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_20_000_to_30_000@2025", + "current_estimate": 172083482725.8886, + "witness_estimate": 169416038758.96976, + "change_percent": -1.5500871580846676, + "target": 172000000000.0, + "witness_target_error_percent": -1.5023030471106091, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_200_000_to_300_000@2025", + "current_estimate": 36686181384.16371, + "witness_estimate": 29448043066.796326, + "change_percent": -19.729876602779562, + "target": 36600000000.0, + "witness_target_error_percent": -19.54086593771496, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_30_000_to_40_000@2025", + "current_estimate": 170115166383.40378, + "witness_estimate": 164168467122.80783, + "change_percent": -3.4956902356332753, + "target": 170000000000.0, + "witness_target_error_percent": -3.430313457171863, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_300_000_to_500_000@2025", + "current_estimate": 30564748001.398754, + "witness_estimate": 24359725337.200485, + "change_percent": -20.301239401398973, + "target": 29000000000.0, + "witness_target_error_percent": -16.00094711310177, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_40_000_to_50_000@2025", + "current_estimate": 139158516908.86105, + "witness_estimate": 128124956316.80344, + "change_percent": -7.928771330096751, + "target": 139000000000.0, + "witness_target_error_percent": -7.823772433954357, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_50_000_to_70_000@2025", + "current_estimate": 174344680401.29572, + "witness_estimate": 151909345742.53357, + "change_percent": -12.868379239975603, + "target": 174000000000.0, + "witness_target_error_percent": -12.69577830888875, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_500_000_to_1_000_000@2025", + "current_estimate": 23117163879.138275, + "witness_estimate": 17453317127.402832, + "change_percent": -24.500612537711397, + "target": 23100000000.0, + "witness_target_error_percent": -24.444514599987745, + "constrained": true + }, + { + "name": "hmrc/employment_income_income_band_70_000_to_100_000@2025", + "current_estimate": 118035277549.29321, + "witness_estimate": 100049016395.25098, + "change_percent": -15.238038599545733, + "target": 118000000000.0, + "witness_target_error_percent": -15.212697970126287, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_100_000_to_150_000@2025", + "current_estimate": 792964.9012224728, + "witness_estimate": 651918.5933465522, + "change_percent": -17.7872069316658, + "target": 791000.0, + "witness_target_error_percent": -17.5829844062513, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_12_570_to_15_000@2025", + "current_estimate": 1365177.517014742, + "witness_estimate": 1405807.344140628, + "change_percent": 2.9761570652534486, + "target": 1360000.0, + "witness_target_error_percent": 3.3681870691638194, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_15_000_to_20_000@2025", + "current_estimate": 3109879.536339771, + "witness_estimate": 3098951.9132848475, + "change_percent": -0.35138412685222775, + "target": 3100000.0, + "witness_target_error_percent": -0.033809248875882325, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_150_000_to_200_000@2025", + "current_estimate": 264663.1562137604, + "witness_estimate": 222437.04441785812, + "change_percent": -15.954661918184598, + "target": 264000.0, + "witness_target_error_percent": -15.743543781114344, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_20_000_to_30_000@2025", + "current_estimate": 7499823.851601991, + "witness_estimate": 7365234.681989172, + "change_percent": -1.7945644094570334, + "target": 7470000.0, + "witness_target_error_percent": -1.4024808301315694, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_200_000_to_300_000@2025", + "current_estimate": 180104.21351242065, + "witness_estimate": 145691.67932600848, + "change_percent": -19.107012276555622, + "target": 180000.0, + "witness_target_error_percent": -19.06017815221751, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_30_000_to_40_000@2025", + "current_estimate": 5449477.36409642, + "witness_estimate": 5252668.95918537, + "change_percent": -3.6115097239913463, + "target": 5370000.0, + "witness_target_error_percent": -2.184935583140224, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_300_000_to_500_000@2025", + "current_estimate": 92867.96628284454, + "witness_estimate": 73996.13939610227, + "change_percent": -20.321137246900665, + "target": 93000.0, + "witness_target_error_percent": -20.434258713868523, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_40_000_to_50_000@2025", + "current_estimate": 3507028.743809776, + "witness_estimate": 3230443.0938410764, + "change_percent": -7.886609154740986, + "target": 3500000.0, + "witness_target_error_percent": -7.7016258902549595, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_50_000_to_70_000@2025", + "current_estimate": 3434298.003418244, + "witness_estimate": 3003112.704308243, + "change_percent": -12.555267442744666, + "target": 3430000.0, + "witness_target_error_percent": -12.445693751946262, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_500_000_to_1_000_000@2025", + "current_estimate": 43993.48078918457, + "witness_estimate": 33475.78768539429, + "change_percent": -23.907390174900577, + "target": 44000.0, + "witness_target_error_percent": -23.918664351376616, + "constrained": true + }, + { + "name": "hmrc/employment_income_count_income_band_70_000_to_100_000@2025", + "current_estimate": 1657474.498050928, + "witness_estimate": 1405049.3609141582, + "change_percent": -15.22950352681769, + "target": 1640000.0, + "witness_target_error_percent": -14.326258480844011, + "constrained": true + } + ] + } + ], + "wider_redistribution_probe": { + "current_weight_multiplier_bounds": [ + 0.5, + 1.5 + ], + "status": "not_run", + "reason": "The tighter 0.75–1.25 probe was feasible; the wider probe was conditional on infeasibility." + }, + "protected_outcome_basis": "Exact saved matrix rows, with their original OBR/HMRC measurement definitions. OBR NI includes employer NI. Raw housing-benefit and unrestricted employment-income per-household vectors are not archived, so their witness changes are unavailable without rematerialization.", + "material_tradeoffs": { + "interpretation": "This feasibility witness is not a recommended allocation. Its improved lone-parent fit accompanies a substantial reduction in income-tax and National Insurance estimates; the income-tax row approaches its permitted 25% lower target bound.", + "selected_changes": [ + { + "name": "obr.income_tax@2025", + "current_estimate": 289208975664.497, + "witness_estimate": 248578188121.03146, + "change_percent": -14.048937260716333, + "target": 331437583074.4429, + "witness_target_error_percent": -24.99999975404138, + "constrained": true + }, + { + "name": "obr.ni@2025", + "current_estimate": 196836566204.77274, + "witness_estimate": 177413635813.24832, + "change_percent": -9.867541771338551, + "target": 200081395082.7125, + "witness_target_error_percent": -11.32926890083581, + "constrained": true + }, + { + "name": "obr.child_benefit@2025", + "current_estimate": 15759391835.595362, + "witness_estimate": 15769144643.195559, + "change_percent": 0.06188568506919623, + "target": 13389272724.45089, + "witness_target_error_percent": 17.774467424198882, + "constrained": true + }, + { + "name": "obr.state_pension@2025", + "current_estimate": 137018135866.62624, + "witness_estimate": 134319837164.75609, + "change_percent": -1.969300403047869, + "target": 146185954351.57382, + "witness_target_error_percent": -8.117139050363209, + "constrained": true + } + ], + "employment_income_and_count_band_change_percent_range": { + "minimum": -24.500612537711397, + "maximum": 2.9761570652534486, + "row_count": 24 + } + }, + "limits": [ + "These LPs constrain lone-parent count within 5% and every other included row within 25%, preserving total fresh calibrated household weight and intersecting per-household redistribution bounds with 0–10 times fresh priors.", + "The two positive-target zero UC rows and adjudicated OBR CGT row are omitted only from the LP. Both HMRC CGT rows remain constrained. The original full-problem infeasibility and canonical gate refusal remain.", + "No ESS or source-concentration constraint is imposed. Concentration metrics describe one feasibility witness, not a globally optimal allocation or a population-readiness assessment.", + "The LP has no calibration-loss objective; protected outcomes may move anywhere inside the declared bounds. OBR CGT is evaluated but not constrained.", + "No engine or calibration is run, no witness weights are exported, and saved source/matrix/weight archives are unchanged.", + "The wider 0.5–1.5 bound is run only if the 0.75–1.25 bound is infeasible; a timeout is not an infeasibility proof.", + "The concentration comparison covers aggregate household weight and original-source household weight, not a guarantee about concentration within every benefit or target cell.", + "No global optimality, calibration-loss improvement, ESS guarantee, or release-readiness conclusion follows from this single feasibility witness." + ] + }, + "retired_fit_deferral_evidence": { + "canonical_diagnostics_sha256": "971e6f8cac94b69ebf82364e83845f27d19fce38490a032524db237eb4884463", + "population_arm": "fresh-current-recovered", + "population_receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "model_year": 2025, + "solver_epochs": 1500, + "target_weight_rule": "family_equal", + "unchanged_release_absolute_relative_error_bound": 0.25, + "original_adjudication": "https://github.com/PolicyEngine/microcosm/issues/796", + "retired_target_errors": [ + { + "name": "dwp.uc.households_children_1@2025", + "target": 1190123.8333333333, + "final_estimate": 958658.2978921045, + "relative_error": -0.19448861451075508 + }, + { + "name": "dwp.uc.households_children_2@2025", + "target": 1049895.5, + "final_estimate": 982488.795085907, + "relative_error": -0.0642032515751263 + }, + { + "name": "dwp.uc.households_children_5_or_more@2025", + "target": 76320.08333333333, + "final_estimate": 76415.20346069336, + "relative_error": 0.00124633154479912 + }, + { + "name": "dwp.uc.households_single_with_children@2025", + "target": 2138780.1666666665, + "final_estimate": 1839214.2526192775, + "relative_error": -0.14006391059548154 + }, + { + "name": "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", + "target": 109000.0, + "final_estimate": 109048.34322357178, + "relative_error": 0.00044351581258511325 + } + ], + "retained_cgt_adjudication": "https://github.com/PolicyEngine/microcosm/issues/875", + "retained_cgt_target": "obr.capital_gains_tax@2025", + "limitations": [ + "The evidence comes from the declared 1500-epoch family_equal run, not the default 256-epoch uniform allocation.", + "The existing terminal gate rejects stale deferrals once a target is inside its 25% bound; retirement restores that unchanged bound for renewed breaches.", + "The CGT deferral and both zero-support UC payment failures remain; no calibration target, weight, historical receipt or failed-gate report is altered." + ] + }, + "lp_evidence_reproduction": { + "status": "exact_deterministic_parity", + "command": "uv run --no-sync python tools/diagnose_uk_uc_lp_evidence.py --run-dir /path/to/fresh-current-recovered --output-dir /path/to/new-lp-reproduction --profile all --expected-evidence docs/evidence/uk-uc-882/calibration-comparison.json", + "producer": { + "path": "tools/diagnose_uk_uc_lp_evidence.py", + "sha256": "425c2595a6a6be5a5a783ac5a431433a366b546d5f478a7f162dcc34c6552481" + }, + "imported_support_helper": { + "path": "tools/diagnose_uk_uc_support.py", + "sha256": "15df89f1fd06f943da77630e5ddd70c276b30bd0d7a0be606817f3f6aef34e3c" + }, + "versions": { + "python": "3.13.14", + "numpy": "2.4.6", + "scipy": "1.17.1" + }, + "profile": "all", + "probe_counts": { + "named-opposition": 6, + "full-supported": 3, + "bounded-redistribution": 1 + }, + "result_sha256": "527dc116dc003e6693a67b4fe46362c286635df2e0b28e8909328f39a6d22cf0", + "verification_receipt_sha256": "54cb94ff74a199fc253be86cb71ac6565865354d7272f7e77f1841174abfa4d9", + "expected_evidence_sha256": "a0f344bf217099a0db24b5dc343d0ea0fc0dcce41d049353193b56f1f3a67220", + "expected_evidence_hash_scope": "Comparison JSON as read before appending this reproduction block, including the retirement evidence. A later replay against the appended JSON attests different comparison bytes while checking the same historical deterministic fields.", + "population_receipt_sha256": "87c8070aecaaa781d8dd795ee1fec2f578426f73efa168d1837f86bc3eb7ce50", + "matrix_sha256": "9d5e1598c7751dce94c6446e50a9e10d2a6a2544574720cd471c055db847c4d5", + "input_archive_sha256": "4a69939b0fb48570cfe1dec931a89b5445b91d8e527999ca0db672552d5bd825", + "weight_archive_sha256": "dd1a4953cd7243f7491d9d2d274c1deaa0ee71c757ba2bbf37ca3e0520fbe434", + "comparison": { + "excluded_runtime_fields": [ + "elapsed_seconds" + ], + "historical_only_fields": [ + "aggregate_receipt_sha256", + "limitations", + "limits", + "probe_script_sha256", + "protected_outcome_basis", + "purpose" + ], + "historical_narrative_paths": [ + "material_tradeoffs.interpretation" + ] + }, + "historical_receipts_preserved": { + "fresh_named_opposition_lp_probes": "5f8ab745bc9c812919e7bbaaf1bcfa4402439b106b64b63159a32975566802f4", + "fresh_full_supported_lp_probes": "9704eaa7b7ebece8cc7bcb7f70a03a0ec472ae6d46f2b4fb4d5eac30b9bf5bad", + "fresh_bounded_redistribution_lp_probes": "2aa871694a54d2f57e81589c9241238b277b1533abdb6c8ff90fef7389623a07" + }, + "historical_named_probe_script_sha256": "f99ca7274335d1096e7715313edfc913f05d98354d31d2ddc4962c578f145931", + "limits": [ + "Every historical deterministic number, status, row selection, bound, tolerance, concentration and protected-outcome field matches exactly; this does not establish global optimality or release readiness.", + "Original receipt hashes and the original private-script hash remain historical identities; the new producer and imported-helper identities are recorded separately.", + "The reproduction runs no population engine or Adam calibration and exports no witness weights or original source IDs.", + "The conditional wider bounded probe was not run because the tighter bound remained feasible." + ] + } +} diff --git a/docs/uk-uc-882-diagnostics.md b/docs/uk-uc-882-diagnostics.md new file mode 100644 index 000000000..4f5bfb8a9 --- /dev/null +++ b/docs/uk-uc-882-diagnostics.md @@ -0,0 +1,375 @@ +# UC target repair diagnostics, September 2026 + +The fresh controlled comparison shows that paid-claim target repairs improve +the broad UC fit but **do not close the lone-parent gap**. Against the same +paid target, the fresh lone-parent shortfall changes from 14.37% to 14.01%. +The [population comparison receipt](evidence/uk-uc-882/calibration-comparison.json) +records these completed development calibrations and their input hashes. These +fit results do not come from the [source-only compilation receipt](evidence/uk-uc-882/source-target-diff.json), +which checks source targets without a population solve. No certified release is claimed. +The [target contract](uk-uc-paid-target-contract.md) describes the statistical +repair and its remaining approximations. [#882](https://github.com/PolicyEngine/microcosm/issues/882) +remains open. + +## Retained-spine experiment + +The baseline uses merged Microcosm `a19582bd`, released PolicyEngine-UK 2.97.0 +and the authenticated retained FRS/SPI spine. All arms hold the 52,846 +household identities/order, priors, source ancestry, simulation outputs, active +366-row roster and family coefficients fixed. The historical 371-row/UK2.94 +replay is not the causal control: five additional non-UC exclusions and the +engine upgrade were already merged before this experiment. + +Each solve uses 1,500 updates, learning rate .02, seed zero, free mass, +maximum weight/prior ratio 10, no sparsity penalty, target loss cap 10 and +`family_equal`. No extra epochs or new joint targets are introduced. The loss +cap is not a 10% fit tolerance. The tool validates input, code and dependency +identities at both ends of each run and authenticates the baseline's saved +inputs and weights before comparing them. + +| Fit against each arm's own source target | Old contract | Paid CY2025 | Paid FY2025/26 | +|---|---:|---:|---:| +| UC headline | −4.49% | −4.29% | −5.12% | +| Single with children | −18.12% | −12.78% | −15.31% | +| Couple with children | −0.03% | +0.09% | +0.05% | +| Five-plus reported children | +0.29% | −0.07% | −0.05% | + +Changing the denominator explains part of the apparent lone-parent improvement. +Against the **same CY paid target of 2,138,780**, the old-contract weights are +14.77% below target; CY recalibration is 12.78% below. The estimate rises from +1,822,793 to 1,865,550. The repair therefore improves the weighted estimate +without establishing closure. + +The CY structural-family and allowance-family arms produce identical matrices +and weights. Both use a matrix identical to the baseline on this retained +sample. The changed values are ten right-hand-side targets; the family +measurement introduces no new support here. It is an allowance-based model +proxy: under the tested UK2.97 claimant inputs it coincides with structural +family typing. It does not recover administrative ineligible-partner cases or +change claimant roles. `UNKNOWN` handles zero model allowance defensively; it +does not identify observed administrative missing-family records. + +Evaluated against one common CY matrix, target vector and coefficient vector, +the ten broad count rows' weighted mean absolute percentage error falls from +9.15% to 4.35%; seven of ten are within 5%, compared with five before. The FY +weights give 5.97% on that same CY comparison. This does not select CY because +it fits better: the two windows represent different observation conventions. + +CY household ESS changes from 13,846 to 13,722 and original-source household +ESS from 5,026 to 4,956. The maximum ratio remains 10. Compared with the +same-engine old-contract fit, CY income tax changes +0.12%, National Insurance ++0.15%, state pension +0.57%, Child Benefit −0.29%, employment income +0.16% +and Housing Benefit +3.09%. Housing Benefit remains a reviewed excluded +calibration row; this is an outcome change, not a validation pass. + +After these retained runs, a compiler guard was tightened to reject missing +publication identities. Recompiling the real feed before and after that change +gives identical values and metadata for all 415 targets. The fresh run below +uses the tightened guard; the completed retained comparisons remain bound to +their original code receipts. + +A later metadata correction expresses the five paid child-count averages as +explicit twelve-month source windows. It removes their misleading +December-to-year hold records and records the months and publication identity. +It leaves all 415 compiled values/statuses and all 366 active target identities +and their order unchanged. The other 410 references, including 101 other +monthly UC references, and all unrelated holds are unchanged. This correction +does not require another population solve or alter the comparisons above. + +## Fresh combined source build and calibration + +The full unsampled source build completes in 391.51 seconds with 40 graph +nodes and all 15 source-scope gates passing. It uses stock UK 2.97.0, the +pinned FRS2024/25 inputs and seed 578. The first attempt exposed two missing +read declarations on the capital stage: `person.is_benunit_head` and +`person.is_parent` existed in the full checkpoint but were removed by graph +scoping. Adding those dependencies fixes execution. The engine-free +[test](../packages/microcosm-build/tests/test_uk_uc_capital_coherence.py) runs the +production split node through executor projection and the actual capital +transform, with positive SPI reporters and claimant roles that disagree with +legal marriage. It checks the resulting donor values and redraw count. + +Existing [graph-stage integration](../packages/microcosm-build/tests/test_uk_graph.py) +and [H2 parity](../packages/microcosm-graph/tests/test_acceptance_h_parity.py) +exercise all 28 real transforms using committed synthetic source tables and +the UK engine; the legacy-versus-graph parity check passes. Running every +stage does not guarantee every conditional read is reached: capital donor +selection reads claimant roles only when a reporter redraw occurs. The new +regression forces that branch. A broader inventory of conditional branches +and reusable projected-stage fixtures remains follow-up work. + +The final spine contains 52,846 households, 61,213 benefit units and 113,590 +persons, with complete original ancestry for all descendants. The 16,288 +original households and 18,850 original benefit units survive. The capital +stage processes 893 SPI reporter redraws and refreshes 265 would-claim flags. +Source child counts and claimant couple status remain unchanged through the +inspected same-ID imputation, reporter and capital stages. Source-stage +snapshots do not store calculated UC awards/components, so they cannot +establish the first stage at which an upper payment cell became empty. + +The production national solve completes at the same 1,500-update budget in +180.90 seconds including compilation and checks. Its paid lone-parent estimate +is 1,839,214 against 2,138,780, a **14.01% shortfall**. The headline is 4.71% +below target; couples with children and five-plus reported children are within +0.13%. This confirms that the repaired targets do not close the gap on the +fresh combined pipeline either. + +An authenticated private replay reproduces every initial and final estimate +for all 366 canonical rows exactly, along with the selected iterate, loss, +ESS and maximum weight ratio. It saves diagnostic matrices/weights only and +preserves the original terminal refusal. A separate old-contract solve then +holds that fresh population, source identities, priors, awards, matrix, row +order, coefficients and solver budget fixed. + +On the same paid target, the fresh old-contract weights estimate 1,831,438 +lone-parent claims (−14.37%), compared with 1,839,214 after repair (−14.01%). +The apparent own-contract change from −17.73% to −14.01% is mostly a changed +comparison denominator. The ten broad UC rows' error on common CY targets +falls from 8.97% to 4.72%, with seven of ten within 5%, compared with five. +The retained-to-fresh differences combine prior pipeline changes and are not +an isolated causal estimate of the capital graph repair. + +Its lone-parent row has 1,917 household rows from 677 original households, +source ESS 237.37 and a largest-source share of 2.42%. Its individual-row +capacity under the existing caps is 12.35 million against a 2.14 million +target. The same supported-108-UC and named-38-protected-row feasibility +checks described below pass on the fresh matrix. The lone-parent miss is +therefore not explained by that row's own lack of support or capacity. + +A bounded directional diagnostic raises existing lone-parent-support weights +enough to improve the row by one percentage point. That direction increases +the full objective, chiefly through non-UC rows including the benefit-cap +caseload, Scottish Child Payment spending, ONS lone-parent households and +funded childcare. This identifies pressure along that particular direction; +it does not prove those rows prevent every compensating reallocation. + +Six follow-up linear programs confirm that distinction. The broad ten UC +rows remain jointly feasible at 5% as the five named opposing rows are added +one by one. All 108 supported UC/TCL rows plus those five are also feasible. +The bounds remain zero to ten times each prior, with no total-mass or ESS +constraint. The largest check leaves the other 253 active rows unconstrained. +Thus these named rows alone do not establish an unavoidable conflict; the +remaining objective/constraint audit must examine the wider system and the +concentration of any feasible redistribution. + +Across the wider system, all 364 supported rows are infeasible at 5%, and +the remaining 363 are still infeasible after omitting OBR CGT. Lone-parent +fit within 5% becomes feasible when the other 362 rows may deviate by 25%. +A further witness preserves total household weight and limits each weight +to ±25% of its current value, intersected with the existing prior caps. +It reaches a 0.75% lone-parent shortfall; household ESS changes from 14,050 +to 13,791 and original-source ESS from 5,062 to 4,993. However, its OBR +income-tax estimate falls 14.05% and total NI falls 9.87% from current +estimates; income tax reaches its permitted −25% target boundary. The two +zero UC rows and OBR CGT are omitted only from these declared diagnostic +subsets, with no production target changes. No ESS constraint or +calibration-loss optimization is imposed, and no witness weights are +exported or proposed for release. + +The terminal gate refuses export: both unsupported payment bands remain at +−100%, and five old fit exemptions are now within the permitted bound and +flagged as stale. No calibrated H5 or passing calibration build record is +produced. The signed failed-gate report and its bound diagnostic file are +retained; they are not converted into a release pass. The source HMRC replay +has reviewed-exclusion coverage only, with zero numerical comparison coverage, +so the source build's gate pass is not an HMRC fit claim. + +The five retired exemptions originated in [#796](https://github.com/PolicyEngine/microcosm/issues/796). +That adjudication deferred four UC composition residuals and a private-pension +count residual attributed at the time to related solver pressure. Its earlier +UC support/capital explanation was subsequently marked historical as claimant +and child definitions changed; removing these entries does not validate that +old causal attribution. The [pre-removal register](https://github.com/PolicyEngine/microcosm/blob/cc9c953c72b003406f4aeec8ae5e82bd211099bc/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json) +preserves the original reasons, approval and expiry dates, and annotations. + +The fresh candidate's observed errors are inside the unchanged absolute 25% +release bound: + +| Retired target ID | Relative error | +|---|---:| +| `dwp.uc.households_children_1@2025` | −19.448861% | +| `dwp.uc.households_children_2@2025` | −6.420325% | +| `dwp.uc.households_children_5_or_more@2025` | +0.124633% | +| `dwp.uc.households_single_with_children@2025` | −14.006391% | +| `hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025` | +0.044352% | + +The [`retired_fit_deferral_evidence` block](evidence/uk-uc-882/calibration-comparison.json) +records these exact target values, estimates and errors from the completed +1,500-update, `family_equal` candidate, not a default-budget run. The canonical +diagnostic SHA-256 is +`971e6f8cac94b69ebf82364e83845f27d19fce38490a032524db237eb4884463`; +its original failed-gate report and exact recovery are bound in the +[population receipt](evidence/uk-uc-882/calibration-comparison.json). + +The gate deliberately rejects an exemption once its target is back inside +the bound. Retiring these five entries removes those stale-exemption failures +and restores ordinary enforcement: any renewed absolute error above 25% +blocks release. All five targets remain in the solve. Replaying all 366 saved +errors through the updated register leaves exactly the two empty-tail +failures. `obr.capital_gains_tax@2025` remains deferred under +[#875](https://github.com/PolicyEngine/microcosm/issues/875), with a +44.771038% +error in this candidate; its exemption is unchanged. Neither the 25% gate nor +the calibration exclusions or optimizer defaults change. This does not +rewrite the original failed report or establish readiness under the default +256 updates and uniform target allocation. + +## Empty cells and bounded feasibility + +Two positive-target childless-couple payment rows have zero model records in +every retained arm: + +| Monthly payment band | Source target | Model support | +|---|---:|---:| +| £2,300.01–£2,400 | 746.33 | 0 | +| £2,400.01–£2,500 | 605.78 | 0 | + +Their annual matrix bounds are £27,600.12≤UC<£28,800.12 and +£28,800.12≤UC≤£30,000, retaining the source labels’ penny offset. Reweighting +leaves both at −100% under every feasible weight vector. These rows stay in +the evaluation; they are not silently excluded to claim a successful fit. +The same limitation was acknowledged in the +[diagnostic comment on #883](https://github.com/PolicyEngine/microcosm/pull/883#issuecomment-5587342177). + +Diagnostic linear programs use bounds of zero to ten times each prior and +explicit 5% row tolerances. The complete 110-row UC/TCL set is infeasible +because of the two zero rows. Two separate, explicitly scoped checks are +feasible: the other 108 UC/TCL rows, and the ten broad UC counts together with +four named OBR targets and 24 HMRC employment amount/count bands. Neither +proves feasibility of all 366 rows, or of all 108 UC/TCL rows jointly with +every protected target. Feasible witness weights are not release candidates +or proof that Adam has converged. They justify investigating competing rows +and objective allocation before increasing the epoch budget. + +The amount comparison remains unresolved: DWP monthly cash can contain +advances and payments on the claimant's behalf, while the model provides an +annual recurring award. No recurring entitlement is invented to fill these +cells. Component, deduction and timing evidence must precede support generation. + +The fresh component audit reproduces all 24 active childless-couple matrix +rows exactly from annual model masks. Twenty copies from seven original +families have gross maximum UC above £2,300 per month-equivalent, but all +have income reductions. Even the largest recorded maximum-minus-reduction +balance is only £2,131.58 per month-equivalent; no pre-cap award reaches +the unsupported bands. Later benefit caps or deductions therefore do not +explain the upper-band zeros in this captured state. Eight of these copies +would claim and six have a positive payment. This identifies sparse +high-element/low-income combinations and take-up inputs for further audit; +it does not establish an incorrect income formula. + +The £1,800–£2,200 near-tail has only 14 copies from seven original families, +source ESS 4.09 and a largest-source share of 38.62%. Two adjacent bands each +rely on one source despite fitting closely. The recorded UC maximum, +pre-cap and final-payment components reconcile within one penny annually. +Exact monthly cash timing and the first source stage of tail absence remain +unobserved. + +## Five-plus children and independent support + +The CY paid five-plus target itself has 80 household rows from 29 original +source households, source ESS 9.96 and a largest-source share of 27.6%. +Its near-zero residual does not demonstrate robust joint support. + +The matrix contrast **reported five-plus minus TCL five-child households +minus TCL six-plus households** has four nonzero clone rows from just **one +original family**. Its source ESS is one and its largest-source share is 100%. +For CY the fitted contrast is 21,079 against target arithmetic of 21,040. +The three component rows' 5% tolerances imply a contrast interval of +[14,460, 27,620]. Removing all descendants of that one source leaves attainable +contrast [0, 0], so the three rows cannot jointly retain that fit. The FY arm +has the same one-source dependency. + +The fresh paid five-plus row has 78 household rows from 28 original households, +source ESS 9.87 and a largest-source share of 27.5%. The contrast still has +four rows from one source, with fitted contribution 21,051. The fresh build +therefore does not remove this dependence. + +The lost paid source is still in the data: all four descendants remain, with +the same roles, five-child count, eligibility, elements and income reductions. +Two SPI copies lose reporter/would-claim status. Fresh saved checkpoints never +promote those copies to reporters; capital coherence does not demote them. +The retained replay had a promotion this complete rebuild does not reproduce. +This whole-build comparison cannot isolate the earlier donor/assignment change +responsible, and does not justify restoring a promotion solely to recover fit. + +This subtraction explains optimizer algebra across different concepts and +windows. It is not an administrative statistical identity or a newly inferred +joint. Extra clones of the same record do not provide independent evidence. +Diagnostics group descendants before calculating source concentration and +leave-one-source-out capacity. + +## Date, claim and relationship limits + +The source audit found birth-date fields entirely blank in the delivered +adult and child files. Official 2024/25 documentation confirms completed +age, adult age-80 top-coding and household `INTDATE` as interview-start date. +It does not establish the numeric TAB date encoding or exactness of every age +at that date. [UKDS variable listing](https://doc.ukdataservice.ac.uk/doc/9563/mrdoc/excel/9563_frs2425_variable_listing_eul.xlsx), +[derived-variable summary](https://doc.ukdataservice.ac.uk/doc/9563/mrdoc/excel/9563_dv_summary_2425.xlsx), +[questionnaire](https://doc.ukdataservice.ac.uk/doc/9563/mrdoc/pdf/9563_frs_2024-25_question_instructions_final.pdf#page=14) + +A conditional interval sensitivity, assuming days since 1960 and accurate age +at the household start date, finds three original large families that could +have no post-cutoff child. None is confirmed unaffected. Two survive as paid +five-plus families in the retained spine; neither supplies the one-source +contrast above. The previous model-year-minus-age proxies do not identify +these ambiguous cases. No exact birthdays are imputed and no blanket age +increment is applied. + +The next date repair must retain raw age/date validity and ancestry, verify +the encoding, then test before/after/ambiguous intervals around 6 April 2017 +independently of model-year labels. April open/nil claim history, TCL exceptions, +education transitions and exact administrative child attachment remain +separate limitations. Annual zero awards or take-up flags cannot establish +open nil claims. The new Chronicle crosses do not supply these histories. + +## Evidence and reproduction + +The [aggregate comparison receipt](evidence/uk-uc-882/calibration-comparison.json) +contains the selected target values/estimates, source concentration, protected +outcomes, runtime and input/output hashes for each completed arm. It omits +individual source IDs and records. Original private archives and failed-gate +receipts remain unchanged. + +`tools/diagnose_uk_uc_matrix.py` authenticates retained replay inputs, measures +the complete active roster and writes private diagnostic matrices/weights. +`tools/diagnose_uk_uc_support.py` reads a completed matrix receipt to reproduce +source concentration, capacity, named-subset LP probes and removal sensitivity: + +```sh +uv run --no-sync python tools/diagnose_uk_uc_support.py \ + --run-dir /path/to/completed-run --output-dir /path/to/new-support-report +``` + +The latter performs no population simulation or calibration fit. Its LP +witnesses answer only their explicitly named feasibility questions. Keep +`source_group_influence_private.json` local; aggregate reports omit IDs. + +The committed [LP evidence producer](../tools/diagnose_uk_uc_lp_evidence.py) +reproduces the later named-opposition, full-supported and bounded-redistribution +profiles, including heterogeneous tolerances and the fixed-mass/current-weight +bounds. With the authenticated fresh archives and the recorded Python 3.13.14, +NumPy 2.4.6 and SciPy 1.17.1 environment, run: + +```sh +uv run --no-sync python tools/diagnose_uk_uc_lp_evidence.py \ + --run-dir /path/to/fresh-current-recovered \ + --output-dir /path/to/new-lp-reproduction \ + --profile all \ + --expected-evidence docs/evidence/uk-uc-882/calibration-comparison.json +``` + +The formatted producer reproduces all three historical families' deterministic +constraint, solver-status, fit, concentration and protected-outcome fields +exactly. Runtime and historical narrative/provenance are excluded from this +comparison. The tool refuses changed archives, missing or unexpected zero +rows, and mismatched replay versions; it verifies successful witnesses against +the declared constraints before reporting feasibility. It exports aggregate +results and verification receipts, without witness weights or source IDs. + +The public comparison receipt retains the historical receipt/script hashes +and adds a separate reproduction attestation for the committed producer, +imported support helper, saved inputs, versions and result. Its +`expected_evidence_sha256` binds the comparison file read before appending +that attestation. A later replay against the augmented file checks the same +historical fields and creates its own receipt/hash. No population build, +model calculation or Adam calibration was rerun for this reproduction. diff --git a/docs/uk-uc-paid-target-contract.md b/docs/uk-uc-paid-target-contract.md index d9209ec5a..f95c90f1a 100644 --- a/docs/uk-uc-paid-target-contract.md +++ b/docs/uk-uc-paid-target-contract.md @@ -20,7 +20,7 @@ digests before compiling targets; local surfaces retain their separate pins. |---|---|---| | Paid headline | Within each month, sum five family categories × both child-entitlement states, with payment indicator Yes; average the 12 monthly sums | GB benefit units with annual `universal_credit > 0` | | Four paid family counts | Within each month, sum entitlement No and Yes for the named family and payment Yes; average 12 months | Positive-UC benefit units classified by the model standard allowance and the reported-child proxy | -| Five paid child-count categories | Average each publisher `total_benefit_units` series with payment Yes and `child_entitlement: all` | Positive-UC benefit units by the existing declared-under-20 child-count proxy | +| Five paid child-count categories | Use `monthly_window_average` over the 12 explicit months of each publisher `total_benefit_units` series with payment Yes and `child_entitlement: all` | Positive-UC benefit units by the existing declared-under-20 child-count proxy | Unknown family records contribute to the headline. A publisher zero must be present; it cannot be replaced by an absent cell. The family cube has no @@ -28,12 +28,16 @@ published grand Total, so its headline is explicitly derived. The child-count cube has publisher Totals over entitlement; these are used directly rather than reconstructed from independently perturbed detail cells. -The administrative-family measurement follows DWP's standard-allowance rule: -an allowance above the maximum single rate implies a couple. Zero allowance -returns UNKNOWN. It preserves source claimant roles and the structural family -measurement. It does not recover ineligible-partner cases that the model cannot -identify. The four existing family payment-band bindings use the same new family -measurement. [DWP family definition](https://stat-xplore.dwp.gov.uk/webapi/metadata/UC_Households/Family%20Type.html) +The administrative-family measurement is an allowance-based model proxy for +DWP's standard-allowance rule: an allowance above the maximum single rate implies +a couple. With the tested PolicyEngine-UK 2.97 claimant inputs, the allowance and +structural classification use the same claimant roles, so these comparison arms +coincide and create no additional support. Zero allowance returns UNKNOWN as +defensive input handling; this does not identify administrative missingness. +Source claimant roles remain unchanged. The proxy does not recover +ineligible-partner cases that the model cannot identify. The four existing +family payment-band bindings use the same proxy. +[DWP family definition](https://stat-xplore.dwp.gov.uk/webapi/metadata/UC_Households/Family%20Type.html) `uc_child_element > 0` is a separate child-entitlement diagnostic. It does not turn reported children into own qualifying children. No family × child-count @@ -56,6 +60,10 @@ every declared month × operand. They reject duplicate, missing, mixed-series or mixed-publication cells. A sum divides by the **month count**, not the number of cells. Receipts retain member identities, publication identity and the actual denominator. Existing period policies retain their calendar/future-period guards. +All ten paid count references use this explicit source-window policy. Averaging +their selected 2025 observations does not apply a December-to-annual uprating +hold. The five child-count references use the single-series operation, while +the headline and family references average their declared monthly sums. Only these ten count references acquire 12 months. The other 101 monthly UC references retain their declared nine-month coverage. TCL remains an April @@ -75,6 +83,10 @@ exclusions. No non-UC value, target roster or coefficient changes. The [source-only diff receipt](evidence/uk-uc-882/source-target-diff.json) records all ten old/CY/FY values, complete compilation counts, source hashes and monthly reconciliation. +Population fit figures reported with these changes come from the companion +[completed development comparisons](evidence/uk-uc-882/calibration-comparison.json), +described in the [diagnostic report](uk-uc-882-diagnostics.md). The source-only +receipt contains no population fit results and does not certify those runs. In calendar 2025 the family-derived paid headline is 6,197,311, including 1,168.92 unknown-family claims. Summed child-count publisher Totals differ from diff --git a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json index edbd82e25..caf6e5244 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_fit_reviewed_exclusions.json @@ -2,41 +2,6 @@ "schema_version": 2, "description": "Reviewed target-fit exclusions for the UK terminal battery (schema 2 per #610). Each entry defers one calibration target whose |relative error| breaches the 25% release bound, with the defect diagnosed, tracked, and owned elsewhere; the receipt records the reasoning, approver, adjudication reference, approval date, and expiry. The gate keeps the target BOUND in calibration (exclusion applies to the release fence only, never the solve), reports dormant entries, FAILS stale ones (targets back inside the bound), and FAILS expired ones until the adjudication is renewed, so this register cannot rot.", "exclusions": { - "dwp.uc.households_single_with_children@2025": { - "reason": "UC with-children support residual, not a fit defect: initial eligible support runs 4.24m benunits vs 6.76m DWP admin after the #750 pension-wealth split, the #813 re-bind proved this cell's grain honest (family-type cells partition dwp.uc.households exactly), and the 0.55/0.70/0.85 take-up probes proved marginal claimants ~10:1 childless, so no calibration-side lever reaches it. Root cause evidenced by the donor-truth benchmark on #809: the wealth re-draw over-spreads countable capital >16k to a 38.3% household share vs the WAS donor's 28.6%, suppressing eligibility; the fix is the #145 draw-quality workstream. Deferred one month to unblock the first certified cut. Historical-basis annotation (2026-09-07, PR #879): The preceding text preserves the original adjudication rationale as historical evidence. The FRS claimant/partner correction changes membership of the single-with-children cell, so the #813 support, take-up and wealth-draw attribution above has not been revalidated under the corrected measurement. Fresh adjudication is required; this annotation is not a renewal or new approval and changes no exclusion decision, approver, approval/expiry date or gate threshold. Source-role/codebook, redraw and native-entitlement work remain separate from calibration relabelling. See https://github.com/PolicyEngine/microcosm/blob/7fd55db0a548c0b74566d56fdec776a97e84b89b/experiments/879-corrected-calibration-comparison.md#historical-uc-fit-deferral-rationales.", - "approved_by": "juaristi22", - "adjudication": "microcosm#796", - "approved_on": "2026-08-30", - "expires_on": "2026-09-30" - }, - "dwp.uc.households_children_1@2025": { - "reason": "Same UC with-children support residual as dwp.uc.households_single_with_children@2025: honest grain after the #813 re-bind, unreachable by take-up (probes 0.55/0.70/0.85), caused by the wealth re-draw over-spread past the 16k countable-capital threshold (spine 38.3% vs WAS donor 28.6%, #809 receipts); owned by #145. Deferred one month to unblock the first certified cut. Historical-basis annotation (2026-09-07, PR #879): The preceding text preserves the original adjudication rationale as historical evidence. The corrected reported-child definition changes membership of the exactly-one-child cell, so the #813 support, take-up and wealth-draw attribution above has not been revalidated under the corrected measurement. Fresh adjudication is required; this annotation is not a renewal or new approval and changes no exclusion decision, approver, approval/expiry date or gate threshold. Source-role/codebook, redraw and native-entitlement work remain separate from calibration relabelling. See https://github.com/PolicyEngine/microcosm/blob/7fd55db0a548c0b74566d56fdec776a97e84b89b/experiments/879-corrected-calibration-comparison.md#historical-uc-fit-deferral-rationales.", - "approved_by": "juaristi22", - "adjudication": "microcosm#796", - "approved_on": "2026-08-30", - "expires_on": "2026-09-30" - }, - "dwp.uc.households_children_2@2025": { - "reason": "Same UC with-children support residual as dwp.uc.households_single_with_children@2025: honest grain after the #813 re-bind, unreachable by take-up (probes 0.55/0.70/0.85), caused by the wealth re-draw over-spread past the 16k countable-capital threshold (spine 38.3% vs WAS donor 28.6%, #809 receipts); owned by #145. Deferred one month to unblock the first certified cut. Historical-basis annotation (2026-09-07, PR #879): The preceding text preserves the original adjudication rationale as historical evidence. The corrected reported-child definition changes membership of the exactly-two-children cell. Its corrected SPI-treatment error is -21.525%, inside the unchanged 25% bound, so this entry is stale in that treatment; the historical causal attribution above has not been revalidated. Fresh adjudication is required; this annotation is not a renewal or new approval and changes no exclusion decision, approver, approval/expiry date or gate threshold. Source-role/codebook, redraw and native-entitlement work remain separate from calibration relabelling. See https://github.com/PolicyEngine/microcosm/blob/7fd55db0a548c0b74566d56fdec776a97e84b89b/experiments/879-corrected-calibration-comparison.md#historical-uc-fit-deferral-rationales.", - "approved_by": "juaristi22", - "adjudication": "microcosm#796", - "approved_on": "2026-08-30", - "expires_on": "2026-09-30" - }, - "dwp.uc.households_children_5_or_more@2025": { - "reason": "Same UC with-children support residual as dwp.uc.households_single_with_children@2025: honest grain after the #813 re-bind, unreachable by take-up (probes 0.55/0.70/0.85), caused by the wealth re-draw over-spread past the 16k countable-capital threshold (spine 38.3% vs WAS donor 28.6%, #809 receipts); owned by #145. Deferred one month to unblock the first certified cut. Historical-basis annotation (2026-09-07, PR #879): The preceding text preserves the original adjudication rationale as historical evidence. The corrected reported-child definition also governs the five-or-more-children cell. Similar residual errors do not revalidate the #813 support, take-up and wealth-draw attribution above under the corrected measurement. Fresh adjudication is required; this annotation is not a renewal or new approval and changes no exclusion decision, approver, approval/expiry date or gate threshold. Source-role/codebook, redraw and native-entitlement work remain separate from calibration relabelling. See https://github.com/PolicyEngine/microcosm/blob/7fd55db0a548c0b74566d56fdec776a97e84b89b/experiments/879-corrected-calibration-comparison.md#historical-uc-fit-deferral-rationales.", - "approved_by": "juaristi22", - "adjudication": "microcosm#796", - "approved_on": "2026-08-30", - "expires_on": "2026-09-30" - }, - "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": { - "reason": "Solver-pressure marginal drift (+25.5% at the v13 seam measurement, 0.5pp over the bound): the unreachable UC with-children cells push weight into this pension-income count band. Expected to relax when the #145 re-draw fix restores the UC gradient; deferred one month alongside the four UC composition cells rather than adjudicated as a standalone defect.", - "approved_by": "juaristi22", - "adjudication": "microcosm#796", - "approved_on": "2026-08-30", - "expires_on": "2026-09-30" - }, "obr.capital_gains_tax@2025": { "reason": "Vintage conflict, not a fit defect: the Chronicle re-pin (microcosm#874) put HMRC's 2024-25 CGT outturn on the feed (£127.3bn of chargeable gains, 584k taxpayers, against £69.9bn / 403k in 2023-24 — the forestalling year ahead of the 30 October 2024 rate rise) and the doctrine binds it at face value at the 2025 period; the frame fits both HMRC rows within 0.3% and 2025-26 rates on those gains give £31.4bn of liability (24.7% effective) against OBR's £21.8bn FY2025-26 receipts and HMRC's realised 19.0% on the same gains (+44.2% at the composed calibration; −25% with the 2023-24 gains). The facts stay bound as published; the deliverable is a declared 2024-25 → 2025 translation of the gains total under the WS-C reconciliation layer (#875: the index ruling, applying uprating_index in the compile step, the taxpayer count flat at 584k, the cash-lag mapping for self-assessed OBR lines). While in force the calibrated 2025-26 base carries ~40% more CGT liability than OBR expects.", "approved_by": "juaristi22", 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 5ef0deeee..add5eb481 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 @@ -1659,31 +1659,6 @@ "from": "2025-08", "to": "2025" }, - { - "name": "dwp.uc.households_children_1", - "from": "2025-12", - "to": "2025" - }, - { - "name": "dwp.uc.households_children_2", - "from": "2025-12", - "to": "2025" - }, - { - "name": "dwp.uc.households_children_3", - "from": "2025-12", - "to": "2025" - }, - { - "name": "dwp.uc.households_children_4", - "from": "2025-12", - "to": "2025" - }, - { - "name": "dwp.uc.households_children_5_or_more", - "from": "2025-12", - "to": "2025" - }, { "name": "dwp/uc_payment_dist/SINGLE_annual_payment_0_to_1_200", "from": "2025-12", @@ -4883,6 +4858,7 @@ "status": "active", "matched_fact_count_overall": 12, "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, "resolved_period": 2025, "resolved_value": 1190123.8333333333, "resolved_fact_period": "2025-12", @@ -4898,6 +4874,7 @@ "status": "active", "matched_fact_count_overall": 12, "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, "resolved_period": 2025, "resolved_value": 1049895.5, "resolved_fact_period": "2025-12", @@ -4913,6 +4890,7 @@ "status": "active", "matched_fact_count_overall": 12, "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, "resolved_period": 2025, "resolved_value": 477887.6666666667, "resolved_fact_period": "2025-12", @@ -4928,6 +4906,7 @@ "status": "active", "matched_fact_count_overall": 12, "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, "resolved_period": 2025, "resolved_value": 170713.66666666666, "resolved_fact_period": "2025-12", @@ -4943,6 +4922,7 @@ "status": "active", "matched_fact_count_overall": 12, "matched_fact_count_at_or_before_period": 12, + "matched_fact_count_in_source_window": 12, "resolved_period": 2025, "resolved_value": 76320.08333333333, "resolved_fact_period": "2025-12", 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 70e0d8ba0..d523ea422 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/target_references.json +++ b/packages/microcosm-build/src/microcosm/build/uk/target_references.json @@ -8,6 +8,7 @@ "calendar_year_average", "latest_plateau", "count_x_mean", + "monthly_window_average", "monthly_window_sum_average" ], "target_references": [ @@ -4184,9 +4185,8 @@ "measure_kind": "prepared_column", "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" }, - "value_operation": "calendar_year_average", - "uprating_from_period": "2025-12", - "uprating_to_period": 2025 + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" }, { "name": "dwp.uc.households_children_2", @@ -4232,9 +4232,8 @@ "measure_kind": "prepared_column", "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" }, - "value_operation": "calendar_year_average", - "uprating_from_period": "2025-12", - "uprating_to_period": 2025 + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" }, { "name": "dwp.uc.households_children_3", @@ -4280,9 +4279,8 @@ "measure_kind": "prepared_column", "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" }, - "value_operation": "calendar_year_average", - "uprating_from_period": "2025-12", - "uprating_to_period": 2025 + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" }, { "name": "dwp.uc.households_children_4", @@ -4328,9 +4326,8 @@ "measure_kind": "prepared_column", "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" }, - "value_operation": "calendar_year_average", - "uprating_from_period": "2025-12", - "uprating_to_period": 2025 + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" }, { "name": "dwp.uc.households_children_5_or_more", @@ -4376,9 +4373,8 @@ "measure_kind": "prepared_column", "uk_uc_expected_source_months": "[\"2025-01\",\"2025-02\",\"2025-03\",\"2025-04\",\"2025-05\",\"2025-06\",\"2025-07\",\"2025-08\",\"2025-09\",\"2025-10\",\"2025-11\",\"2025-12\"]" }, - "value_operation": "calendar_year_average", - "uprating_from_period": "2025-12", - "uprating_to_period": 2025 + "period_match_policy": "source_window", + "value_operation": "monthly_window_average" }, { "name": "dwp.uc.households_single_no_children", 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 ffa0f0e45..2cd2e33f1 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 @@ -7,6 +7,7 @@ "sum", "difference", "calendar_year_average", + "monthly_window_average", "monthly_window_sum_average" ], "resolution_defaults": { @@ -3589,7 +3590,8 @@ "2025-12" ] }, - "value_operation": "calendar_year_average" + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { "target_id": "dwp.uc.households_children_2", @@ -3705,7 +3707,8 @@ "2025-12" ] }, - "value_operation": "calendar_year_average" + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { "target_id": "dwp.uc.households_children_3", @@ -3821,7 +3824,8 @@ "2025-12" ] }, - "value_operation": "calendar_year_average" + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { "target_id": "dwp.uc.households_children_4", @@ -3937,7 +3941,8 @@ "2025-12" ] }, - "value_operation": "calendar_year_average" + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { "target_id": "dwp.uc.households_children_5_or_more", @@ -4053,7 +4058,8 @@ "2025-12" ] }, - "value_operation": "calendar_year_average" + "value_operation": "monthly_window_average", + "period_match_policy": "source_window" }, { "target_id": "dwp.uc.households_single_no_children", 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 d023c1f19..a00abb0ad 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -192,6 +192,8 @@ "uc_reporter_redraw": None, "uc_capital_coherence": frozenset( { + ("person", "is_benunit_head"), + ("person", "is_parent"), ("person", "person_support_channel"), ("person", "universal_credit_reported"), ("benunit", "benunit_support_channel"), diff --git a/packages/microcosm-build/tests/test_uk_population_targets.py b/packages/microcosm-build/tests/test_uk_population_targets.py index b57399a30..420f73f86 100644 --- a/packages/microcosm-build/tests/test_uk_population_targets.py +++ b/packages/microcosm-build/tests/test_uk_population_targets.py @@ -169,6 +169,7 @@ def test_uk_population_targets_shape_order_and_registry_accounting() -> None: "sum", "difference", "calendar_year_average", + "monthly_window_average", "monthly_window_sum_average", ] assert resource["resolution_defaults"] == { @@ -692,7 +693,8 @@ def test_paid_uc_targets_preserve_entitlement_margins_and_exact_calendar_months( if target["target_id"].startswith("dwp.uc.households_children_"): assert selector["source_measure_id"] == "total_benefit_units" assert selector["dimension_values"]["child_entitlement"] == "all" - assert target["value_operation"] == "calendar_year_average" + assert target["value_operation"] == "monthly_window_average" + assert target["period_match_policy"] == "source_window" assert "value_operands" not in target else: assert selector["source_measure_id"] == "benefit_units" diff --git a/packages/microcosm-build/tests/test_uk_target_references.py b/packages/microcosm-build/tests/test_uk_target_references.py index 0d2a8df5c..a921d2a64 100644 --- a/packages/microcosm-build/tests/test_uk_target_references.py +++ b/packages/microcosm-build/tests/test_uk_target_references.py @@ -194,6 +194,7 @@ def test_uk_target_references_follow_contract_derivation_rules() -> None: "calendar_year_average", "latest_plateau", "count_x_mean", + "monthly_window_average", "monthly_window_sum_average", ] assert len(names) == len(set(names)) @@ -380,7 +381,8 @@ def test_uc_composition_targets_pin_paid_cells_and_explicit_month_windows() -> N assert pins["payment_indicator"] == "Yes" assert pins["child_entitlement"] == "all" assert selector["source_measure_id"] == "total_benefit_units" - assert operations[target_id] == "calendar_year_average" + assert operations[target_id] == "monthly_window_average" + assert target["period_match_policy"] == "source_window" elif target_id == "dwp.uc.households" or target_id.startswith( ("dwp.uc.households_single_", "dwp.uc.households_couple_") ): @@ -673,6 +675,25 @@ def test_uk_target_references_compile_from_real_staged_feed_rows() -> None: assert family_type.metadata["ledger_source_cell_count_per_month"] == "2" +def test_paid_child_count_windows_remove_only_their_uprating_holds() -> None: + """A complete 2025 mean needs no December-to-annual hold (#891 review).""" + membership = _load_uk_resource("target_reference_membership.json") + holds = {row["name"]: row for row in membership["uprating_holds"]} + for children in ("1", "2", "3", "4", "5_or_more"): + name = f"dwp.uc.households_children_{children}" + assert name not in holds + candidates = membership["targets"][name]["candidates"] + assert len(candidates) == 1 + assert candidates[0]["status"] == "active" + assert candidates[0]["matched_fact_count_in_source_window"] == 12 + # A genuinely older stock observation retains its independent hold. + assert holds["isc.private_school_students"] == { + "name": "isc.private_school_students", + "from": "2024-01", + "to": "2025", + } + + def test_uk_generator_averages_paid_monthly_sums_and_preserves_other_uc_operations() -> ( None ): @@ -685,6 +706,10 @@ def test_uk_generator_averages_paid_monthly_sums_and_preserves_other_uc_operatio "dwp.uc.households_couple_no_children", "dwp.uc.households_couple_with_children", } + monthly_average_ids = { + f"dwp.uc.households_children_{children}" + for children in ("1", "2", "3", "4", "5_or_more") + } uc_target_ids = { target["target_id"] for target in contract["targets"] @@ -696,9 +721,14 @@ def test_uk_generator_averages_paid_monthly_sums_and_preserves_other_uc_operatio for target_id in uc_target_ids if operations[target_id] == "monthly_window_sum_average" } == monthly_sum_ids + assert { + target_id + for target_id in uc_target_ids + if operations[target_id] == "monthly_window_average" + } == monthly_average_ids assert all( operations[target_id] == "calendar_year_average" - for target_id in uc_target_ids - monthly_sum_ids + for target_id in uc_target_ids - monthly_sum_ids - monthly_average_ids ) facts = _fixture_feed_rows() authored = author_target_references( diff --git a/packages/microcosm-build/tests/test_uk_terminal_gates.py b/packages/microcosm-build/tests/test_uk_terminal_gates.py index 96a1ed59b..1b46d98fc 100644 --- a/packages/microcosm-build/tests/test_uk_terminal_gates.py +++ b/packages/microcosm-build/tests/test_uk_terminal_gates.py @@ -386,29 +386,68 @@ def test_target_fit_out_of_force_exclusion_fails_even_without_a_breach() -> None assert fit.details["expired_exclusions"] == ["dwp.uc.households_children_2@2025"] -def test_committed_target_fit_register_carries_the_signed_deferrals() -> None: +def test_committed_target_fit_register_retains_only_live_deferrals() -> None: register = uk_default_target_fit_reviewed_exclusions() - assert set(register) == { - "dwp.uc.households_single_with_children@2025", - "dwp.uc.households_children_1@2025", - "dwp.uc.households_children_2@2025", - "dwp.uc.households_children_5_or_more@2025", - "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025", - "obr.capital_gains_tax@2025", + assert set(register) == {"obr.capital_gains_tax@2025"} + record = register["obr.capital_gains_tax@2025"] + assert record.approved_by == "juaristi22" + assert record.adjudication == "microcosm#875" + assert record.approved_on == "2026-09-05" + assert record.expires_on == "2026-10-05" + + +# Aggregate errors from the fresh UC #882 development run: 1,500 epochs with +# the explicit family_equal override. This is not a default-doctrine fit claim. +_RESTORED_TARGET_FIT_ERRORS = { + "hmrc/private_pension_income_count_income_band_100_000_to_150_000@2025": 0.00044351581258511325, + "dwp.uc.households_children_1@2025": -0.19448861451075508, + "dwp.uc.households_children_2@2025": -0.0642032515751263, + "dwp.uc.households_children_5_or_more@2025": 0.00124633154479912, + "dwp.uc.households_single_with_children@2025": -0.14006391059548154, +} + + +def test_restored_fit_checks_leave_empty_payment_tail_cells_blocked() -> None: + empty_tail = { + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800@2025": -1.0, + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000@2025": -1.0, } - for name, record in register.items(): - assert record.approved_by == "juaristi22" - if name == "obr.capital_gains_tax@2025": - # #834 composition: the 2024-25 forestalling-year gains bound at - # the 2025 period (microcosm#875 owns the translation). - assert record.adjudication == "microcosm#875" - assert record.approved_on == "2026-09-05" - assert record.expires_on == "2026-10-05" - continue - assert record.adjudication == "microcosm#796" - assert record.approved_on == "2026-08-30" - assert record.expires_on == "2026-09-30" + fit = uk_target_fit_gate( + { + **_RESTORED_TARGET_FIT_ERRORS, + **empty_tail, + "obr.capital_gains_tax@2025": 0.45, + }, + reviewed_exclusions=uk_default_target_fit_reviewed_exclusions(), + now=date(2026, 9, 9), + ) + + assert not fit.passed + assert fit.details["stale_exclusions"] == [] + assert fit.details["failing_targets"] == empty_tail + assert set(fit.details["reviewed_exclusions"]) == {"obr.capital_gains_tax@2025"} + + +@pytest.mark.parametrize("name", sorted(_RESTORED_TARGET_FIT_ERRORS)) +@pytest.mark.parametrize( + ("relative_error", "passes"), + [(-0.25, True), (0.25, True), (-0.250001, False), (0.250001, False)], +) +def test_restored_fit_checks_apply_if_a_later_run_breaches_again( + name, relative_error, passes +) -> None: + # The fence consumes errors, not optimizer settings. A renewed breach from + # a default 256/uniform or any override run must have no old deferral. + fit = uk_target_fit_gate( + {name: relative_error}, + reviewed_exclusions=uk_default_target_fit_reviewed_exclusions(), + now=date(2026, 9, 9), + ) + + assert fit.passed is passes + assert fit.details["reviewed_exclusions"] == {} + assert fit.details["failing_targets"] == ({} if passes else {name: relative_error}) def test_ported_june_parity_gates_reject_empty_evidence() -> None: diff --git a/packages/microcosm-build/tests/test_uk_uc_capital_coherence.py b/packages/microcosm-build/tests/test_uk_uc_capital_coherence.py index e16771f05..5ca8bd030 100644 --- a/packages/microcosm-build/tests/test_uk_uc_capital_coherence.py +++ b/packages/microcosm-build/tests/test_uk_uc_capital_coherence.py @@ -7,6 +7,8 @@ import pytest from microcosm.build.country_spec import load_country_spec +from microcosm.build.uk_runtime.graph import uk_spine_graph +from microcosm.build.uk_runtime.graph_kernels import UKStageKernel from microcosm.build.uk_runtime.national_frame import uk_national_frame from microcosm.build.uk_runtime.spi_support import support_channel_column from microcosm.build.uk_runtime.uc_capital_coherence import ( @@ -21,6 +23,8 @@ ) from microcosm.frame import WeightKind from microcosm.frame.adapters.policyengine_uk import PolicyEngineUKEngine +from microcosm.graph.executor import _project_context +from microcosm.graph.population import Population def _stage(): @@ -201,6 +205,42 @@ def test_capital_donor_cells_use_claimant_partnership_and_preserve_marital_statu pd.testing.assert_series_equal(result["is_married"], marital_before) +def test_graph_scoped_capital_redraw_receives_claimant_roles() -> None: + """The real node must retain role flags through executor input pruning.""" + + frame = _frame() + person = frame.table("person") + benunit = frame.table("benunit") + frame.table("household")["region"] = "LONDON" + person["age"] = np.where(person["is_benunit_head"] | person["is_parent"], 40, 5) + person[support_channel_column("person")] = person["person_benunit_id"].map( + benunit.set_index("benunit_id")[support_channel_column("benunit")] + ) + # Legal marriage disagrees with the intended donor cells in both directions. + benunit.loc[benunit["benunit_id"] == 1007, "is_married"] = False + benunit.loc[benunit["benunit_id"] == 1005, "is_married"] = True + node = uk_spine_graph(source_mode="split").node("uc_capital_coherence") + context = _project_context( + node, + Population.from_frame(frame, "capital-input"), + key="0" * 64, + sources={}, + tolerances={}, + numerics={}, + ) + transform = UKUCCapitalCoherenceStageTransform(stage=_stage()) + result = UKStageKernel("uc_capital_coherence", transform).run(context) + + capital = result.columns[("benunit", "frs_benunit_capital")] + assert capital.loc[1005] == 200.0 + assert capital.loc[1007] == 3_000.0 + assert capital.loc[1006] == 888_888.0 # A non-reporter is unchanged. + assert result.columns[("benunit", "would_claim_uc")].loc[1007] + assert ( + transform.checkpoint_metadata()["evidence"]["redrawn_spi_reporter_count"] == 2 + ) + + def test_transform_is_deterministic_and_idempotent() -> None: transform = UKUCCapitalCoherenceStageTransform(stage=_stage()) diff --git a/packages/microcosm-build/tests/test_uk_uc_lp_evidence.py b/packages/microcosm-build/tests/test_uk_uc_lp_evidence.py new file mode 100644 index 000000000..329d2722f --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_uc_lp_evidence.py @@ -0,0 +1,432 @@ +import importlib.util +import json +from pathlib import Path +from types import SimpleNamespace + +import numpy as np +import pytest +from scipy import sparse + +_PATH = Path(__file__).resolve().parents[3] / "tools" / "diagnose_uk_uc_lp_evidence.py" +_SPEC = importlib.util.spec_from_file_location("uc_lp_evidence_tool", _PATH) +tool = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(tool) + + +def run_arrays(matrix, targets, *, prior=None, current=None, names=None, source=None): + matrix = sparse.csr_matrix(matrix, dtype=float) + rows, columns = matrix.shape + return { + "matrix": matrix, + "targets": np.array(targets, dtype=float), + "names": np.array( + names + if names is not None + else [tool.LONE_PARENT, *[f"other{i}@2025" for i in range(rows - 1)]] + ), + "prior": np.array( + prior if prior is not None else np.ones(columns), dtype=float + ), + "current": np.array( + current if current is not None else np.ones(columns), dtype=float + ), + "source_ids": np.array( + source if source is not None else np.arange(columns), dtype=int + ), + "household_ids": np.arange(columns), + "families": np.full(rows, "other"), + "coefficients": np.ones(rows), + } + + +def profile_run(): + names = [tool.LONE_PARENT, tool.CGT, *tool.RETAINED_CGT, *tool.ZERO_ROWS] + run = run_arrays( + [[1, 0], [0, 1], [0, 1], [0, 1], [0, 0], [0, 0]], + [6, 5, 5, 5, 1, 1], + prior=[10, 10], + current=[5, 5], + names=names, + ) + run["families"][[0, 4, 5]] = "dwp_universal_credit" + run["hashes"] = { + name: "a" * 64 + for name in ( + "receipt.json", + "matrix.npz", + "inputs_private.npz", + "weights_private.npz", + ) + } + return run + + +def test_mixed_tolerances_change_feasibility_without_changing_rows(): + run = run_arrays([[1, 0], [1, 0]], [5, 6]) + names = run["names"].tolist() + strict = tool.mixed_probe(run, names, [0.05, 0.05]) + relaxed = tool.mixed_probe(run, names, [0.05, 0.25]) + assert strict["scipy_status"] == 2 + assert relaxed["scipy_status"] == 0 + assert abs(relaxed["lone_parent_relative_error"]) <= 0.05 + 1e-12 + + +def test_fixed_mass_includes_columns_unused_by_target_rows(): + run = run_arrays([[1, 0]], [6], prior=[10, 10], current=[5, 5]) + result = tool.mixed_probe( + run, run["names"].tolist(), [0.05], multipliers=(0.75, 1.25) + ) + assert result["scipy_status"] == 0 + assert result["active_weight_columns"] == 2 + assert result["witness_concentration"]["households"][ + "weight_mass" + ] == pytest.approx(10) + assert result["relative_total_mass_error"] < 1e-10 + + +def test_wider_redistribution_can_restore_feasibility(): + run = run_arrays([[1, 0]], [7.5], prior=[10, 10], current=[5, 5]) + names = run["names"].tolist() + assert ( + tool.mixed_probe(run, names, [0.05], multipliers=(0.75, 1.25))["scipy_status"] + == 2 + ) + assert ( + tool.mixed_probe(run, names, [0.05], multipliers=(0.5, 1.5))["scipy_status"] + == 0 + ) + + +def test_redistribution_still_intersects_prior_cap(): + run = run_arrays([[1, 0]], [7.5], prior=[0.5, 10], current=[5, 5]) + result = tool.mixed_probe( + run, run["names"].tolist(), [0.05], multipliers=(0.5, 1.5) + ) + assert result["scipy_status"] == 2 + + +def test_zero_prior_stays_zero_and_does_not_break_mass(): + run = run_arrays([[1, 1]], [5], prior=[0, 1], current=[0, 5]) + tool.validate_arrays(run) + result = tool.mixed_probe( + run, run["names"].tolist(), [0.05], multipliers=(0.75, 1.25) + ) + assert result["scipy_status"] == 0 + assert result["active_weight_columns"] == 1 + assert result["witness_concentration"]["households"]["positive_weight_count"] == 1 + + +@pytest.mark.parametrize("values", [[0.05, 0.25], [float("nan")], [0], [1]]) +def test_tolerances_must_match_rows_and_be_finite(values): + run = run_arrays([[1]], [1]) + with pytest.raises(ValueError, match="tolerance"): + tool.mixed_probe(run, run["names"].tolist(), values) + + +def test_postverification_rejects_false_success(monkeypatch): + run = run_arrays([[1]], [5]) + monkeypatch.setattr( + tool, + "linprog", + lambda *a, **k: SimpleNamespace(status=0, message="fake", x=np.array([100.0])), + ) + with pytest.raises(ValueError, match="independent"): + tool.mixed_probe(run, run["names"].tolist(), [0.05]) + + +def test_postverification_rejects_mass_error(monkeypatch): + run = run_arrays([[1, 0]], [6], prior=[10, 10], current=[5, 5]) + monkeypatch.setattr( + tool, + "linprog", + lambda *a, **k: SimpleNamespace( + status=0, message="fake", x=np.array([0.6, 0.5]) + ), + ) + with pytest.raises(ValueError, match="fixed-mass"): + tool.mixed_probe(run, run["names"].tolist(), [0.05], multipliers=(0.75, 1.25)) + + +def test_timeout_is_inconclusive(monkeypatch): + run = run_arrays([[1]], [5]) + monkeypatch.setattr( + tool, + "linprog", + lambda *a, **k: SimpleNamespace(status=1, message="Time limit reached"), + ) + result = tool.mixed_probe(run, run["names"].tolist(), [0.05]) + assert result["status"] == "time_limit_inconclusive" + + +def test_bounded_profile_never_widens_after_timeout(monkeypatch): + calls = [] + + def probe(*a, **kw): + calls.append(kw["multipliers"]) + return {"scipy_status": 1, "status": "time_limit_inconclusive"} + + monkeypatch.setattr(tool, "mixed_probe", probe) + result = tool.bounded_redistribution(profile_run()) + assert calls == [(0.75, 1.25)] + assert result["wider_redistribution_probe"]["status"] == "not_run" + + +def test_bounded_profile_widens_only_after_infeasibility(monkeypatch): + calls = [] + + def probe(*a, **kw): + calls.append(kw["multipliers"]) + return { + "scipy_status": 2, + "status": "infeasible_for_named_bounds_and_tolerances", + } + + monkeypatch.setattr(tool, "mixed_probe", probe) + result = tool.bounded_redistribution(profile_run()) + assert calls == [(0.75, 1.25), (0.5, 1.5)] + assert result["wider_redistribution_probe"]["status"] == "run" + + +def test_unexpected_zero_rows_are_not_silently_removed(): + run = profile_run() + run["matrix"] = run["matrix"].tolil() + run["matrix"][0] = 0 + run["matrix"] = run["matrix"].tocsr() + run["matrix"].eliminate_zeros() + with pytest.raises(ValueError, match="zero rows"): + tool.full_supported(run) + + +def test_full_profile_keeps_hmrc_cgt_and_records_only_approved_exclusions(monkeypatch): + monkeypatch.setattr(tool, "mixed_probe", lambda *a, **k: {"scipy_status": 2}) + result = tool.full_supported(profile_run()) + assert result["probes"][0]["excluded_adjudicated_row"] is None + for probe in result["probes"]: + assert set(tool.RETAINED_CGT) <= set(probe["row_names"]) + assert probe["excluded_zero_rows"] == tool.ZERO_ROWS + assert result["probes"][2]["row_relative_tolerances"] == { + tool.LONE_PARENT: 0.05, + **{name: 0.25 for name in tool.RETAINED_CGT}, + } + + +@pytest.mark.parametrize( + "field,values,error", + [ + ("names", [tool.LONE_PARENT, tool.LONE_PARENT], "unique"), + ( + "names", + [tool.LONE_PARENT, "dwp.uc.households_single_with_children@2024"], + "Ambiguous", + ), + ("source_ids", [0.0, float("nan")], "integers"), + ("household_ids", [0, 0], "unique"), + ("targets", [1.0, float("inf")], "finite"), + ("current", [11.0, 1.0], "prior cap"), + ("prior", [0.0, 1.0], "prior cap"), + ("coefficients", [0.0, 0.0], "positive"), + ], +) +def test_invalid_archived_arrays_refused(field, values, error): + run = run_arrays([[1, 0], [0, 1]], [1, 1]) + run[field] = np.array(values) + with pytest.raises(ValueError, match=error): + tool.validate_arrays(run) + + +def test_exact_row_lookup_refuses_missing_or_duplicate_requests(): + run = run_arrays([[1]], [1]) + with pytest.raises(ValueError, match="missing"): + tool.exact_indices(run, ["wrong@2025"]) + with pytest.raises(ValueError, match="unique"): + tool.exact_indices(run, [tool.LONE_PARENT, tool.LONE_PARENT]) + + +def test_concentration_groups_descendants_and_defines_top_one_percent(): + result = tool.concentration(np.array([2.0, 4.0, 4.0]), np.array([0, 0, 1])) + assert result["households"]["effective_sample_size"] == pytest.approx(100 / 36) + assert result["original_source_households"][ + "effective_sample_size" + ] == pytest.approx(100 / 52) + assert result["households"]["top_one_percent_entity_count"] == 1 + assert result["households"]["top_one_percent_weight_share"] == 0.4 + assert result["original_source_households"]["top_one_percent_weight_share"] == 0.6 + + +def test_protected_changes_are_from_saved_rows_and_cgt_is_evaluated_not_constrained(): + run = profile_run() + result = tool.mixed_probe( + run, + [tool.LONE_PARENT, *tool.RETAINED_CGT], + [0.05, 0.25, 0.25], + multipliers=(0.75, 1.25), + ) + assert result["scipy_status"] == 0 + cgt = result["protected_matrix_outcome_changes"][0] + assert cgt["name"] == tool.CGT and not cgt["constrained"] + assert cgt["change_percent"] == pytest.approx( + 100 * (cgt["witness_estimate"] / cgt["current_estimate"] - 1) + ) + serialized = json.dumps(result) + assert "source_ids" not in serialized and '"weights"' not in serialized + + +def write_run(tmp_path): + run = profile_run() + directory = tmp_path / "run" + directory.mkdir() + sparse.save_npz(directory / "matrix.npz", run["matrix"]) + np.savez( + directory / "inputs_private.npz", + names=run["names"], + target_values=run["targets"], + initial_weights=run["prior"], + household_source_ids=run["source_ids"], + household_ids=run["household_ids"], + target_families=run["families"], + target_loss_weights=run["coefficients"], + ) + np.savez(directory / "weights_private.npz", weights=run["current"]) + receipt = { + "model_year": 2025, + **{ + key: tool.support.digest(directory / name) + for name, key in [ + ("matrix.npz", "matrix_sha256"), + ("inputs_private.npz", "inputs_private_sha256"), + ("weights_private.npz", "weights_private_sha256"), + ] + }, + } + (directory / "receipt.json").write_text(json.dumps(receipt)) + return directory + + +def test_authenticated_input_boundary_and_hash_refusal(tmp_path): + directory = write_run(tmp_path) + run = tool.load_run(directory) + assert run["matrix"].shape == (6, 2) + with (directory / "weights_private.npz").open("ab") as stream: + stream.write(b"changed") + with pytest.raises(ValueError, match="receipt"): + tool.load_run(directory) + + +def test_producer_refuses_existing_output_directory_before_solving( + tmp_path, monkeypatch +): + monkeypatch.setattr( + tool, + "load_run", + lambda *a: pytest.fail("must refuse before loading or solving"), + ) + with pytest.raises(ValueError, match="new"): + tool.produce(tmp_path, tmp_path) + + +def test_exact_historical_check_ignores_only_runtime_and_historical_description(): + expected = { + tool.PROFILE_KEYS["full-supported"]: { + "purpose": "historical", + "aggregate_receipt_sha256": "old", + "probes": [{"elapsed_seconds": 10, "value": 0.1, "row_names": ["x@2025"]}], + } + } + actual = { + "full-supported": { + "probes": [{"elapsed_seconds": 11, "value": 0.1, "row_names": ["x@2025"]}] + } + } + assert ( + tool.verify_historical(actual, expected)["status"] + == "exact_deterministic_parity" + ) + actual["full-supported"]["probes"][0]["value"] = np.nextafter(0.1, 1.0) + with pytest.raises(ValueError, match="Replay mismatch"): + tool.verify_historical(actual, expected) + + +def test_producer_exports_only_aggregate_results_and_attests_both_sources( + tmp_path, monkeypatch +): + directory = write_run(tmp_path) + monkeypatch.setattr( + tool, "full_supported", lambda run: {"count": len(run["names"])} + ) + output = tmp_path / "output" + result = tool.produce(directory, output, "full-supported") + report = json.loads((output / "lp-evidence-reproduction.json").read_text()) + assert result["producer_sha256"] == tool.support.digest(_PATH) + assert result["support_helper_sha256"] == tool.support.digest(tool._HELPER_PATH) + assert report["profiles"] == {"full-supported": {"count": 6}} + assert str(directory) not in json.dumps(report) + assert set(p.name for p in output.iterdir()) == { + "lp-evidence-reproduction.json", + "verification.json", + } + + +def test_named_profile_preserves_explicit_cumulative_row_order(): + names = [ + *[name + "@2025" for name in tool.support.BROAD], + *[name + "@2025" for name in tool.ADDITIONS], + *tool.ZERO_ROWS, + ] + matrix = np.ones((len(names), 1)) + matrix[-2:] = 0 + run = run_arrays(matrix, np.ones(len(names)), names=names) + run["families"] = np.array( + [ + "dwp_universal_credit" + if name + in [*[name + "@2025" for name in tool.support.BROAD], *tool.ZERO_ROWS] + else "other" + for name in names + ] + ) + run["hashes"] = profile_run()["hashes"] + result = tool.named_opposition(run) + assert len(result["probes"]) == 6 + assert ( + result["full_active_uc_evaluation"]["zero_support_positive_rows"] + == tool.ZERO_ROWS + ) + for i, probe in enumerate(result["probes"][:5]): + assert probe["row_names"] == names[:10] + [ + name + "@2025" for name in tool.ADDITIONS[: i + 1] + ] + assert probe["relative_tolerance"] == 0.05 and probe["scipy_status"] == 0 + assert result["probes"][-1]["row_names"] == names[:-2] + + +def test_input_mutation_during_probe_prevents_receipt(tmp_path, monkeypatch): + directory = write_run(tmp_path) + + def changed(run): + with (directory / "weights_private.npz").open("ab") as stream: + stream.write(b"mutation") + return {"count": 6} + + monkeypatch.setattr(tool, "full_supported", changed) + output = tmp_path / "output" + with pytest.raises(ValueError, match="changed during"): + tool.produce(directory, output, "full-supported") + assert not output.exists() + + +def test_protected_numeric_comparison_remains_exact_when_narrative_is_historical(): + expected = { + "material_tradeoffs": { + "interpretation": "historical prose", + "selected_changes": [{"change_percent": -14.0}], + } + } + tool.assert_equal( + {"material_tradeoffs": {"selected_changes": [{"change_percent": -14.0}]}}, + expected, + ) + with pytest.raises(ValueError, match="Replay mismatch"): + tool.assert_equal( + {"material_tradeoffs": {"selected_changes": [{"change_percent": -13.0}]}}, + expected, + ) diff --git a/packages/microcosm-build/tests/test_uk_uc_matrix_diagnostics.py b/packages/microcosm-build/tests/test_uk_uc_matrix_diagnostics.py new file mode 100644 index 000000000..7aa794dd8 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_uc_matrix_diagnostics.py @@ -0,0 +1,402 @@ +"""Target comparisons preserve source ancestry and their declared controls.""" + +import importlib.util +import json +import sys +from pathlib import Path +from types import SimpleNamespace + +import numpy as np +import pandas as pd +import pytest +from scipy import sparse + + +@pytest.fixture(scope="module") +def diagnostic_tool(): + root = Path(__file__).resolve().parents[3] + tools = root / "tools" + sys.path.insert(0, str(tools)) + try: + spec = importlib.util.spec_from_file_location( + "uc_matrix_diagnostics", tools / "diagnose_uk_uc_matrix.py" + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + yield module + finally: + sys.path.remove(str(tools)) + + +def test_source_support_groups_clones_before_concentration(diagnostic_tool): + # Two clones are the same source. Their combined contribution is six, + # equal to the independently observed third record's contribution. + row = sparse.csr_matrix([[1.0, 1.0, 2.0, 0.0]]) + result = diagnostic_tool.source_support_metrics( + row, np.array([2.0, 4.0, 3.0, 100.0]), np.array([8, 8, 9, 10]) + ) + assert result["household_support"] == 3 + assert result["original_source_household_support"] == 2 + assert result["source_contribution_ess"] == 2 + assert result["largest_source_contribution_share"] == 0.5 + assert result["largest_source_absolute_contribution"] == 6 + + +def test_empty_source_support_is_explicit(diagnostic_tool): + result = diagnostic_tool.source_support_metrics( + sparse.csr_matrix((1, 3)), np.ones(3), np.arange(3) + ) + assert result == { + "household_support": 0, + "original_source_household_support": 0, + "source_contribution_ess": 0.0, + "largest_source_contribution_share": 0.0, + "largest_source_absolute_contribution": 0.0, + } + + +def test_support_accepts_production_sparse_array(diagnostic_tool): + matrix = sparse.csr_array([[1.0, 0.0], [0.0, 0.0]]) + rows = diagnostic_tool.matrix_support_metrics(matrix, np.ones(2), np.arange(2)) + assert rows[0]["household_support"] == 1 + assert rows[1]["household_support"] == 0 + + +def test_joint_report_counts_benefit_units_and_sources_in_gb( + diagnostic_tool, monkeypatch, tmp_path +): + tables = { + "person": pd.DataFrame( + {"person_benunit_id": [1, 1, 2, 3], "person_household_id": [8, 8, 8, 9]} + ), + "benunit": pd.DataFrame( + {"benunit_id": [1, 2, 3], "benunit_source_id": [11, 12, 13]} + ), + "household": pd.DataFrame( + {"household_id": [8, 9], "household_source_id": [18, 19]} + ), + } + monkeypatch.setattr( + diagnostic_tool, + "compute_uc_paid_diagnostic_masks", + lambda *_: {"paid.total": np.ones(3, dtype=bool)}, + ) + resolver = SimpleNamespace( + year=2025, + simulation=SimpleNamespace( + tax_benefit_system=SimpleNamespace( + variables=dict.fromkeys(diagnostic_tool.BU_VARIABLES) + ) + ), + compute=lambda entity, variable: ( + np.array(["WALES", "NORTHERN_IRELAND"]) + if variable == "region" + else np.ones(len(tables[entity])), + "test", + ), + ) + diagnostic_tool.write_uc_support_diagnostics( + SimpleNamespace(table=tables.__getitem__), + resolver, + {"prior": np.array([2.0, 5.0]), "calibrated": np.array([3.0, 10.0])}, + tmp_path, + ) + row = json.loads((tmp_path / "uc_joint_diagnostics.json").read_text())["rows"][0] + assert row["prior"] == 4 + assert row["calibrated"] == 6 + assert row["benefit_unit_support"] == 2 + assert row["household_support"] == 1 + assert row["original_source_benefit_unit_support"] == 2 + assert row["original_source_household_support"] == 1 + + +@pytest.mark.requires_uk +def test_complete_joint_export_on_released_uk_engine(diagnostic_tool, tmp_path): + from microcosm.build.uk_runtime.national_frame import uk_national_frame + from microcosm.frame import WeightKind + + person = pd.DataFrame( + { + "person_id": [1, 2, 3, 4], + "person_benunit_id": [10, 10, 20, 20], + "person_household_id": [100, 100, 200, 200], + "age": [35, 8, 40, 38], + "is_benunit_head": [True, False, True, False], + "is_parent": [True, False, False, False], + "is_uc_claimant": [True, False, True, True], + } + ) + benunit = pd.DataFrame( + { + "benunit_id": [10, 20], + "benunit_source_id": [10, 20], + "dependent_children": [1, 0], + "is_married": [False, False], + } + ) + household = pd.DataFrame( + { + "household_id": [100, 200], + "household_source_id": [100, 200], + "region": ["WALES", "NORTHERN_IRELAND"], + "council_tax": [1200.0, 0.0], + "rent": [6000.0, 6000.0], + "tenure_type": ["RENT_PRIVATELY", "RENT_PRIVATELY"], + } + ) + frame = uk_national_frame( + person=person, + benunit=benunit, + household=household, + time_period=2024, + household_weights=np.ones(2), + weight_kind=WeightKind.IMPORTANCE, + ) + resolver = diagnostic_tool.UKMeasureResolver( + simulation_source=None, frame=frame, year=2025, scratch_dir=tmp_path / "engine" + ) + diagnostic_tool.write_uc_support_diagnostics( + frame, + resolver, + {"prior": np.ones(2), "calibrated": np.array([2.0, 3.0])}, + tmp_path, + ) + report = json.loads((tmp_path / "uc_joint_diagnostics.json").read_text()) + assert len(report["rows"]) == 39 + assert report["unavailable_optional_components"] == [ + "uc_net_earned_income", + "uc_capital_income", + ] + assert "uc_tariff_income" in report["available_component_variables"] + private = pd.read_pickle(tmp_path / "benefit_units_private.pkl") + assert private["great_britain"].tolist() == [True, False] + assert len(json.loads((tmp_path / "protected_outcomes.json").read_text())) == 6 + + +def test_comparison_refuses_a_changed_population_or_prior(diagnostic_tool): + baseline = { + "household_ids": np.array([1, 2]), + "household_source_ids": np.array([8, 9]), + "target_loss_weights": np.array([1.0]), + "initial_weights": np.array([3.0, 4.0]), + "names": np.array(["a"]), + "target_values": np.array([20.0]), + } + with pytest.raises(ValueError, match="household identities"): + diagnostic_tool.validate_comparison_controls( + baseline, + household_source_ids=baseline["household_source_ids"], + target_loss_weights=baseline["target_loss_weights"], + household_ids=np.array([2, 1]), + initial_weights=baseline["initial_weights"], + names=["a"], + target_values=np.array([21.0]), + ) + with pytest.raises(ValueError, match="prior weights"): + diagnostic_tool.validate_comparison_controls( + baseline, + household_source_ids=baseline["household_source_ids"], + target_loss_weights=baseline["target_loss_weights"], + household_ids=baseline["household_ids"], + initial_weights=np.array([3.0, 5.0]), + names=["a"], + target_values=np.array([21.0]), + ) + + +def test_target_changes_are_enumerated_not_called_unchanged(diagnostic_tool): + baseline = { + "household_ids": np.array([1, 2]), + "household_source_ids": np.array([8, 9]), + "target_loss_weights": np.array([0.5, 0.5]), + "initial_weights": np.array([3.0, 4.0]), + "names": np.array(["a", "b"]), + "target_values": np.array([20.0, 30.0]), + } + result = diagnostic_tool.validate_comparison_controls( + baseline, + household_source_ids=baseline["household_source_ids"], + target_loss_weights=baseline["target_loss_weights"], + household_ids=baseline["household_ids"], + initial_weights=baseline["initial_weights"], + names=["a", "b"], + target_values=np.array([21.0, 30.0]), + ) + assert result == { + "same_household_order_and_priors": True, + "target_values_and_roster_unchanged": False, + "added_rows": [], + "removed_rows": [], + "changed_target_values": [{"name": "a", "old": 20.0, "new": 21.0}], + } + + +@pytest.mark.parametrize("names", [["a", "c"], ["b", "a"], ["a"]]) +def test_target_only_comparison_refuses_roster_or_order_drift(diagnostic_tool, names): + baseline = { + "household_ids": np.array([1, 2]), + "household_source_ids": np.array([8, 9]), + "target_loss_weights": np.array([0.5, 0.5]), + "initial_weights": np.array([3.0, 4.0]), + "names": np.array(["a", "b"]), + "target_values": np.array([20.0, 30.0]), + } + with pytest.raises(ValueError, match="target names/order"): + diagnostic_tool.validate_comparison_controls( + baseline, + household_source_ids=baseline["household_source_ids"], + target_loss_weights=baseline["target_loss_weights"], + household_ids=baseline["household_ids"], + initial_weights=baseline["initial_weights"], + names=names, + target_values=np.ones(len(names)), + ) + + +def test_released_baseline_allows_only_reviewed_historical_removals(diagnostic_tool): + old = { + "names": np.array(["a@2025", "b@2025"]), + "target_values": np.array([20.0, 30.0]), + } + assert diagnostic_tool.validate_inherited_contract( + old, ["a@2025"], np.array([20.0]), allowed_removals={"b"} + ) == {"removed_reviewed_rows": ["b@2025"], "surviving_values_unchanged": True} + with pytest.raises(ValueError, match="unreviewed"): + diagnostic_tool.validate_inherited_contract( + old, ["a@2025"], np.array([20.0]), allowed_removals=set() + ) + with pytest.raises(ValueError, match="values"): + diagnostic_tool.validate_inherited_contract( + old, ["a@2025"], np.array([21.0]), allowed_removals={"b"} + ) + + +@pytest.mark.parametrize( + "field, changed, match", + [ + ("household_source_ids", np.array([8, 10]), "source household"), + ("target_loss_weights", np.array([0.2, 0.8]), "loss coefficients"), + ], +) +def test_comparison_refuses_changed_ancestry_and_loss_weights( + diagnostic_tool, field, changed, match +): + baseline = { + "household_ids": np.array([1, 2]), + "initial_weights": np.array([3.0, 4.0]), + "names": np.array(["a", "b"]), + "target_values": np.array([20.0, 30.0]), + "household_source_ids": np.array([8, 9]), + "target_loss_weights": np.array([0.5, 0.5]), + } + arguments = {key: value for key, value in baseline.items()} + arguments[field] = changed + with pytest.raises(ValueError, match=match): + diagnostic_tool.validate_comparison_controls(baseline, **arguments) + + +@pytest.mark.parametrize( + "field", + [ + "replay_receipt_sha256", + "model_year", + "source_year", + "versions", + "code_sha256", + "solver_epochs", + ], +) +def test_comparison_refuses_changed_or_unrecorded_runtime_controls( + diagnostic_tool, field +): + context = {key: "stable" for key in diagnostic_tool.COMPARISON_CONTEXT_FIELDS} + diagnostic_tool.validate_comparison_context(context, dict(context)) + changed = {**context, field: "changed"} + with pytest.raises(ValueError, match=field): + diagnostic_tool.validate_comparison_context(context, changed) + missing = dict(context) + del missing[field] + with pytest.raises(ValueError, match=field): + diagnostic_tool.validate_comparison_context(missing, context) + + +def test_input_hash_receipt_refuses_midrun_edits(diagnostic_tool, tmp_path): + declaration = tmp_path / "contract.json" + declaration.write_text('{"value":1}') + paths = {"contract": declaration} + captured = diagnostic_tool.capture_file_hashes(paths) + diagnostic_tool.verify_file_hashes(paths, captured) + declaration.write_text('{"value":2}') + with pytest.raises(ValueError, match="bytes changed"): + diagnostic_tool.verify_file_hashes(paths, captured) + + +def test_pinned_source_feed_change_is_enumerated_without_relaxing_data_controls( + diagnostic_tool, +): + baseline = {field: "fixed" for field in diagnostic_tool.COMPARISON_CONTEXT_FIELDS} + baseline.update(facts_sha256="old-facts", manifest_sha256="old-manifest") + current = { + **baseline, + "facts_sha256": "new-facts", + "manifest_sha256": "new-manifest", + } + assert diagnostic_tool.validate_comparison_context(baseline, current) == { + "facts_sha256": {"baseline": "old-facts", "current": "new-facts"}, + "manifest_sha256": {"baseline": "old-manifest", "current": "new-manifest"}, + } + + +def test_comparison_requires_receipted_baseline_weighting_inputs(diagnostic_tool): + diagnostic_tool.validate_baseline_inputs( + {"inputs_private_sha256": "captured"}, "captured" + ) + for receipt in ({}, {"inputs_private_sha256": "other"}): + with pytest.raises(ValueError, match="completed receipt"): + diagnostic_tool.validate_baseline_inputs(receipt, "captured") + + +def test_code_manifest_includes_the_numerical_and_relationship_seams(diagnostic_tool): + paths = diagnostic_tool.diagnostic_code_paths() + assert { + "tool", + "microcosm.calibrate.solve", + "microcosm.calibrate.matrix", + "microcosm.build.uk_runtime.uc_target_measurements", + "microcosm.frame.adapters.policyengine_uk", + } <= paths.keys() + assert all(path.is_file() for path in paths.values()) + + +def test_missing_source_ancestry_cannot_disappear_from_ess(diagnostic_tool): + with pytest.raises(ValueError, match="complete source"): + diagnostic_tool.source_support_metrics( + sparse.csr_matrix([[1.0, 1.0]]), np.ones(2), np.array([8.0, np.nan]) + ) + + +def test_saved_matrix_vectors_support_common_evaluation_and_source_removal( + diagnostic_tool, tmp_path +): + matrix = sparse.csr_array([[1.0, 2.0, 3.0], [0.0, 1.0, 0.0]]) + weights = np.array([2.0, 4.0, 1.0]) + source_ids = np.array([8, 8, 9]) + sparse.save_npz(tmp_path / "matrix.npz", matrix) + np.savez_compressed( + tmp_path / "inputs.npz", + household_ids=np.array([1, 2, 3]), + household_source_ids=source_ids, + initial_weights=weights, + target_loss_weights=np.array([0.5, 0.5]), + names=np.array(["a", "b"]), + target_values=np.array([13.0, 4.0]), + ) + saved = np.load(tmp_path / "inputs.npz", allow_pickle=False) + loaded = sparse.load_npz(tmp_path / "matrix.npz") + np.testing.assert_array_equal( + loaded @ saved["initial_weights"], np.array([13.0, 4.0]) + ) + keep = saved["household_source_ids"] != 8 + np.testing.assert_array_equal( + loaded[:, keep] @ saved["initial_weights"][keep], np.array([3.0, 0.0]) + ) diff --git a/packages/microcosm-build/tests/test_uk_uc_source_periods.py b/packages/microcosm-build/tests/test_uk_uc_source_periods.py index 0ccee370f..971e71308 100644 --- a/packages/microcosm-build/tests/test_uk_uc_source_periods.py +++ b/packages/microcosm-build/tests/test_uk_uc_source_periods.py @@ -438,8 +438,12 @@ def test_shipped_uc_monthly_references_preserve_each_declared_window(): 10 if reference.name == "dwp.uc.households" else 2 ) else: - assert reference.value_operation == "calendar_year_average" + assert reference.value_operation == "monthly_window_average" + assert reference.period_match_policy == "source_window" + assert not reference.value_operands assert reference.name.startswith("dwp.uc.households_children_") + assert reference.uprating_from_period is None + assert reference.uprating_to_period is None else: expected_months = MONTHS assert reference.value_operation == "calendar_year_average" diff --git a/packages/microcosm-build/tests/test_uk_uc_support_diagnostics.py b/packages/microcosm-build/tests/test_uk_uc_support_diagnostics.py new file mode 100644 index 000000000..e35504b60 --- /dev/null +++ b/packages/microcosm-build/tests/test_uk_uc_support_diagnostics.py @@ -0,0 +1,367 @@ +import importlib.util +import json +from pathlib import Path + +import numpy as np +import pytest +from scipy import sparse + +_TOOL_PATH = Path(__file__).resolve().parents[3] / "tools" / "diagnose_uk_uc_support.py" +_SPEC = importlib.util.spec_from_file_location("diagnose_uk_uc_support", _TOOL_PATH) +support_tool = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(support_tool) +lp_probe = support_tool.lp_probe +row_support = support_tool.row_support +weighted_loss = support_tool.weighted_loss + + +def test_support_groups_clones_and_distinguishes_prior_capacity(): + row = sparse.csr_matrix([[1.0, 1.0, 2.0, 0.0]]) + r = row_support( + row, + np.array([2.0, 4.0, 3.0, 100.0]), + np.array([1.0, 1.0, 2.0, 100.0]), + np.array([8, 8, 9, 10]), + 30.0, + ) + assert r["household_support"] == 3 and r["original_source_household_support"] == 2 + assert ( + r["source_contribution_ess"] == 2 + and r["largest_source_contribution_share"] == 0.5 + ) + assert r["cap_only_maximum"] == 60 + assert r["fitted_estimate"] == 12 + + +def test_zero_support_is_not_turned_into_feasibility(): + r = row_support( + sparse.csr_matrix((1, 2)), np.ones(2), np.ones(2), np.arange(2), 100.0 + ) + assert ( + r["zero_support_positive_target"] + and not r["row_capacity_can_intersect_tolerance"] + ) + probe = lp_probe( + sparse.csr_matrix((1, 2)), np.array([100.0]), np.ones(2), ["a@2025"], ["a"] + ) + assert ( + probe["status"] == "infeasible_by_zero_support" and not probe["linprog_called"] + ) + + +def test_lp_finds_named_subset_but_refuses_joint_inconsistency(): + a = sparse.csr_matrix([[1.0, 0.0], [1.0, 0.0]]) + b = np.array([5.0, 9.0]) + prior = np.ones(2) + names = ["a@2025", "b@2025"] + assert ( + lp_probe(a, b, prior, names, ["a"])["status"] == "feasible_for_named_rows_only" + ) + assert ( + lp_probe(a, b, prior, names, ["a", "b"])["status"] + == "infeasible_for_named_rows_under_cap" + ) + + +def test_lp_respects_weight_cap_and_missing_rows(): + a = sparse.csr_matrix([[1.0]]) + assert ( + lp_probe(a, np.array([20.0]), np.array([1.0]), ["a@2025"], ["a"])["status"] + == "infeasible_for_named_rows_under_cap" + ) + with pytest.raises(ValueError, match="missing rows"): + lp_probe(a, np.array([20.0]), np.array([1.0]), ["a@2025"], ["missing"]) + + +def test_lp_does_not_silently_select_another_period(): + with pytest.raises(ValueError, match="Ambiguous period"): + lp_probe( + sparse.csr_matrix([[1.0], [1.0]]), + np.array([2.0, 3.0]), + np.ones(1), + ["a@2024", "a@2025"], + ["a"], + ) + + +def test_supported_probe_does_not_silently_drop_an_unexpected_zero_row(): + supported_uc_probe = support_tool.supported_uc_probe + rows = [{"name": "new_zero@2025", "zero_support_positive_target": True}] + r = supported_uc_probe( + sparse.csr_matrix([[0.0]]), + np.array([10.0]), + np.ones(1), + ["new_zero@2025"], + rows, + ) + assert r["status"] == "not_run_unexpected_zero_support" + assert r["unexpected_zero_rows"] == ["new_zero@2025"] + + +def test_supported_probe_explicitly_records_known_zero_exclusions(): + supported_uc_probe = support_tool.supported_uc_probe + known_zero_rows = support_tool.KNOWN_ZERO_ROWS + zero = sorted(known_zero_rows)[0] + "@2025" + rows = [ + {"name": zero, "zero_support_positive_target": True}, + {"name": "supported@2025", "zero_support_positive_target": False}, + ] + r = supported_uc_probe( + sparse.csr_matrix([[0.0], [1.0]]), + np.array([10.0, 2.0]), + np.ones(1), + [zero, "supported@2025"], + rows, + ) + assert r["status"] == "feasible_for_named_rows_only" + assert r["excluded_zero_rows"] == [zero] and not r["full_uc_probe"] + + +def test_no_refit_loss_preserves_original_coefficients_and_row_scales(): + targets = np.array([100.0, 10.0, 0.0]) + estimates = np.array([80.0, 8.0, 30.0]) + coefficients = np.array([0.2, 0.3, 0.5]) + assert weighted_loss(estimates, targets, coefficients) == pytest.approx(5.1) + # One original source, with multiple clone columns, is removed as a group. + a = sparse.csr_matrix([[1.0, 2.0, 0.0], [0.0, 0.0, 1.0], [0.0, 0.0, 0.0]]) + weights = np.array([2.0, 4.0, 3.0]) + source = np.array([8, 8, 9]) + remove = source == 8 + delta = np.asarray(a[:, remove] @ weights[remove]) + np.testing.assert_array_equal(delta, np.array([10.0, 0.0, 0.0])) + np.testing.assert_array_equal(a @ weights - delta, np.array([0.0, 3.0, 0.0])) + + +def test_signed_contrast_removal_uses_both_cap_bounds_and_component_tolerances(): + signed_contrast = support_tool.signed_contrast + names = [ + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + ] + a = sparse.csr_matrix( + [[1.0, 1.0, 0.0, 1.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0]] + ) + report, private = signed_contrast( + a, + np.array([100.0, 30.0, 20.0]), + names, + np.array([2.0, 4.0, 3.0, 5.0]), + np.array([1.0, 1.0, 2.0, 3.0]), + np.array([8, 8, 9, 10]), + ) + assert report["cap_only_minimum"] == -20 and report["cap_only_maximum"] == 40 + assert report["optimizer_implied_contrast_interval"] == [42.5, 57.5] + assert [c["name"] for c in report["components"]] == names + by_source = {r["source_household_id"]: r for r in private} + assert by_source[8]["remaining_cap_only_minimum"] == -20 + assert by_source[8]["remaining_cap_only_maximum"] == 30 + assert by_source[9]["remaining_cap_only_minimum"] == 0 + assert by_source[9]["remaining_cap_only_maximum"] == 40 + assert by_source[9]["no_refit_contrast_contribution_loss"] == -3 + + +def test_computational_contrast_can_have_one_source_despite_many_component_sources(): + signed_contrast = support_tool.signed_contrast + names = [ + "dwp.uc.households_children_5_or_more@2025", + "dwp.uc.two_child_limit.households_5_children@2025", + "dwp.uc.two_child_limit.households_6_plus_children@2025", + ] + a = sparse.csr_matrix([[1.0, 1.0, 1.0], [1.0, 0.0, 0.0], [0.0, 0.0, 1.0]]) + r, private = signed_contrast( + a, + np.array([10.0, 3.0, 2.0]), + names, + np.array([2.0, 5.0, 3.0]), + np.ones(3), + np.array([8, 9, 10]), + ) + assert r["household_support"] == 1 and r["original_source_household_support"] == 1 + assert ( + r["source_contribution_ess"] == 1 + and r["largest_source_contribution_share"] == 1 + ) + assert r["one_source_supplies_all_nonzero_contrast_columns"] + assert r["zero_contrast_excluded_by_component_implied_interval"] + assert ( + private[0]["remaining_cap_only_minimum"] + == private[0]["remaining_cap_only_maximum"] + == 0 + ) + assert not private[0]["remaining_capacity_can_intersect_component_implied_interval"] + + +def write_saved_run(tmp_path, **overrides): + """Tiny synthetic matrix with each named diagnostic row and authenticated bytes.""" + run_dir = tmp_path / "run" + run_dir.mkdir() + bases = list( + dict.fromkeys( + [ + *support_tool.BROAD, + *sorted(support_tool.FIVE_PLUS), + *sorted(support_tool.KNOWN_ZERO_ROWS), + "obr.income_tax", + "obr.ni", + "obr.state_pension", + "obr.child_benefit", + "hmrc/employment_income_count_income_band_0_to_5000", + ] + ) + ) + matrix = sparse.csr_matrix(np.ones((len(bases), 3))) + matrix = matrix.tolil() + for index, base in enumerate(bases): + if base in support_tool.KNOWN_ZERO_ROWS: + matrix[index] = 0 + sparse.save_npz(run_dir / "matrix.npz", matrix.tocsr()) + arrays = { + "names": np.array([base + "@2025" for base in bases]), + "target_values": np.full(len(bases), 3.0), + "target_loss_weights": np.ones(len(bases)), + "target_families": np.array( + [ + "dwp_universal_credit" if base.startswith("dwp") else "other" + for base in bases + ] + ), + "household_ids": np.array([10, 11, 12]), + "household_source_ids": np.array([8, 8, 9]), + "initial_weights": np.ones(3), + } + fitted = overrides.pop("fitted_weights", np.ones(3)) + arrays.update(overrides) + np.savez(run_dir / "inputs_private.npz", **arrays) + np.savez(run_dir / "weights_private.npz", weights=fitted) + receipt = { + field: support_tool.digest(run_dir / name) + for name, field in ( + ("matrix.npz", "matrix_sha256"), + ("inputs_private.npz", "inputs_private_sha256"), + ("weights_private.npz", "weights_private_sha256"), + ) + } + (run_dir / "receipt.json").write_text(json.dumps(receipt)) + return run_dir + + +@pytest.mark.parametrize( + "source_ids", + [ + np.array([8.0, np.nan, 9.0]), + np.array([8.0, np.inf, 9.0]), + np.array([8.0, 8.5, 9.0]), + np.array(["8", "", "9"]), + np.array([8, -1, 9]), + np.array([True, False, True]), + ], +) +def test_saved_run_refuses_missing_or_invalid_source_identity(tmp_path, source_ids): + run_dir = write_saved_run(tmp_path, household_source_ids=source_ids) + with pytest.raises(ValueError, match="household_source_ids"): + support_tool.analyze(run_dir, tmp_path / "output") + assert not (tmp_path / "output").exists() + + +@pytest.mark.parametrize( + "override", + [ + {"initial_weights": np.ones((3, 1))}, + {"household_source_ids": np.array([[8, 8, 9]])}, + {"household_ids": np.array([10, 11])}, + {"target_values": np.ones(2)}, + {"target_loss_weights": np.ones((1, 21))}, + {"target_families": np.array(["dwp_universal_credit"])}, + {"fitted_weights": np.ones((3, 1))}, + ], +) +def test_saved_run_refuses_unaligned_or_nonvector_arrays(tmp_path, override): + run_dir = write_saved_run(tmp_path, **override) + with pytest.raises(ValueError, match="one-dimensional|aligned"): + support_tool.analyze(run_dir, tmp_path / "output") + assert not (tmp_path / "output").exists() + + +@pytest.mark.parametrize("failure", ["missing", "mismatch", "not_mapping"]) +def test_saved_run_requires_matching_completed_receipt(tmp_path, failure): + run_dir = write_saved_run(tmp_path) + receipt = run_dir / "receipt.json" + if failure == "missing": + receipt.unlink() + elif failure == "mismatch": + receipt.write_text(json.dumps({"matrix_sha256": "0" * 64})) + else: + receipt.write_text("null") + with pytest.raises(ValueError, match="receipt"): + support_tool.analyze(run_dir, tmp_path / "output") + assert not (tmp_path / "output").exists() + + +@pytest.mark.parametrize("tolerance", [0.05, 0.1]) +def test_saved_run_reports_named_scope_and_custom_tolerance(tmp_path, tolerance): + run_dir = write_saved_run(tmp_path) + output = tmp_path / "output" + result = support_tool.analyze(run_dir, output, tolerance=tolerance) + report = json.loads((output / "aggregate_support_report.json").read_text()) + assert result["zero_rows"] == 2 + assert report["controls"]["weight_cap_ratio"] == 10 + assert report["controls"]["original_source_household_count"] == 2 + assert ( + report["full_uc_necessary_conditions"]["can_satisfy_all_uc_rows_at_tolerance"] + is False + ) + probe = report["lp_probes"][ + f"supported_uc_rows_excluding_named_zero_cells_{100 * tolerance:g}pct" + ] + assert probe["status"] == "feasible_for_named_rows_only" + assert not probe["full_uc_probe"] and not probe["fixed_mass_constraint"] + assert len(probe["excluded_zero_rows"]) == 2 + assert all(p["tolerance"] == tolerance for p in report["lp_probes"].values()) + text = (output / "aggregate_support_report.md").read_text() + assert f"{100 * tolerance:g}% tolerance" in text + if tolerance != 0.05: + assert "5% tolerance" not in text + assert "source_household_id" not in json.dumps(report) + + +@pytest.mark.parametrize("tolerance", [0.0, 1.0, -0.1, np.nan, np.inf]) +def test_analyze_refuses_invalid_tolerance_before_writing(tmp_path, tolerance): + run_dir = write_saved_run(tmp_path) + with pytest.raises(ValueError, match="Tolerance"): + support_tool.analyze(run_dir, tmp_path / "output", tolerance=tolerance) + assert not (tmp_path / "output").exists() + + +def test_saved_run_requires_source_identity_array(tmp_path): + run_dir = write_saved_run(tmp_path) + path = run_dir / "inputs_private.npz" + with np.load(path, allow_pickle=False) as archive: + arrays = { + name: archive[name] + for name in archive.files + if name != "household_source_ids" + } + np.savez(path, **arrays) + receipt_path = run_dir / "receipt.json" + receipt = json.loads(receipt_path.read_text()) + receipt["inputs_private_sha256"] = support_tool.digest(path) + receipt_path.write_text(json.dumps(receipt)) + with pytest.raises( + ValueError, match="missing required arrays.*household_source_ids" + ): + support_tool.analyze(run_dir, tmp_path / "output") + + +def test_cli_has_no_unreceipted_bypass(tmp_path): + with pytest.raises(SystemExit) as error: + support_tool.main( + [ + "--run-dir", + str(tmp_path / "run"), + "--output-dir", + str(tmp_path / "out"), + "--allow-unreceipted-development", + ] + ) + assert error.value.code == 2 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 f238fb92b..1a3698802 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":[{"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":"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_uc_claimant","dtype":"bool","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":"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":"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":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"7ed918cd9dfa27874110bececf0c2513e7348df10b79ed55ea432e0e9ed70f3f","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"],"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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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":"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_uc_claimant","dtype":"bool","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":"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":"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"],"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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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":"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":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["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":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"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"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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},{"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"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"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":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_person_draws","stage_contract_sha256":"e87b779c3977aa520c298f9bca54b675a8cacb8baed0b58412a1f783b42968ff","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","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","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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.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":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"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":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"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"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"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":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"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":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","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},{"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","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"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"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"4c2edca1f77416a00cff10c7e9d0a9da50e332a2bb6a995ef9ac1bdd00ff97a9","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"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 uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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},{"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","person_support_channel","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":"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":{"stage":"uc_capital_coherence","stage_contract_sha256":"059f27ee687ee15385b246d43068b17aeecbe3645ccc41fd52fcad06a006a081","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"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":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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.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","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":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","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","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"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":["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":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"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"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"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","employee_pension_contributions","highest_education","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":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","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":[{"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":"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_uc_claimant","dtype":"bool","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":"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":"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":{"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"7ed918cd9dfa27874110bececf0c2513e7348df10b79ed55ea432e0e9ed70f3f","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"],"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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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":"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_uc_claimant","dtype":"bool","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":"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":"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"],"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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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":"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":{"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["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":{"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_council_tax","stage_contract_sha256":"3381cd9f7a736514d5073c57480e07f5098890f3ca9ed3865392043594771eb9","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"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"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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},{"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"],"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","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital"],"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":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"stage":"frs_take_up","stage_contract_sha256":"d10ca01bfa5d719640ded8e62196b0692236d3be0a2417899deeefd241088abf","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_person_draws","stage_contract_sha256":"e87b779c3977aa520c298f9bca54b675a8cacb8baed0b58412a1f783b42968ff","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"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":{"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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":{"stage":"frs_brma","stage_contract_sha256":"5b8f0b361310c7cd3efbaae3762b347649b7d4afb9e9943131d9bef9266fc3c8","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","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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},{"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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.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":{"stage":"was_wealth","stage_contract_sha256":"c499dcb7c49a0176229dbc363b400415cb5c1da44af266ba2155f9a62a0bd2ed","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"base":"frs_brma.checkpoint","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"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":["region"],"entity":"household","rows":"all"},{"columns":["age","student_loan_balance"],"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"}],"params":{"stage":"regional_property_uprating","stage_contract_sha256":"4304356c6c5ba91a04883148cbf9078761ee926c8387aadb6c15b6b70ebb31f6","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"lcfs_consumption","stage_contract_sha256":"eb0a529c357c84290a001209a18c5a43b0a0310553c77963d6842fd0111b73ad","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"etb_vat","stage_contract_sha256":"99a6756256adfe8255672fafda89710c08ae56bd2b8f011b20c3b8381eabfa1e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance"],"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":{"stage":"etb_services","stage_contract_sha256":"48294c9d86dd422238a723aca5845e9ceb9eda2903a3bb87bb32a86092447e19","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"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":["region"],"entity":"household","rows":"all"},{"columns":["age","employee_pension_contributions","nhs_outpatient_spending"],"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":{"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"2bb3d068003489b47cc8676ac26c203ce3c39a9b6e92f3ecd0a3c06acd6addc4","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","stage":"spi_support_channel","stage_contract_sha256":"4b10f1a4a215cdf2c406c9974de2d1e580eb3cd3a25ed34973c1b63abf4a54bb","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},{"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","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index"],"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"}],"params":{"stage":"hmrc_spi_income_spine","stage_contract_sha256":"4c2edca1f77416a00cff10c7e9d0a9da50e332a2bb6a995ef9ac1bdd00ff97a9","time_period":"2024"},"population":"spi_support_channel","sources":["frs"],"structural":"none","weights":null},{"base":"spi_support_channel","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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},{"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"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 uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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},{"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","is_benunit_head","is_parent","person_support_channel","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":"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":{"stage":"uc_capital_coherence","stage_contract_sha256":"059f27ee687ee15385b246d43068b17aeecbe3645ccc41fd52fcad06a006a081","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["frs_benunit_capital","would_claim_uc"],"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":{"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","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","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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.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","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":"Run structural UK stage cgt_band_donors.","id":"cgt_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_band_donors@1","mass":"free","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_band_donor","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","stage":"cgt_band_donors","stage_contract_sha256":"e10e10c49c0ca2a6a65048c91b683f818e8b6e207a6c6f57a20d76ea299160b0","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_band_donors.","id":"cgt_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_band_donor"]},"population":"cgt_band_donors","sources":[],"structural":"none","weights":null},{"base":"cgt_band_donors","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","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"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":["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":{"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"20ada8d8ee94400bd160223e865a910db7aff9c40a7f0c8ee8ca8c40ed901b72","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","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","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","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","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","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","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","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_capital_gains_clone","household_is_cgt_band_donor"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","is_household_head","is_benunit_head","is_parent","is_uc_claimant","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","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","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","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","student_loan_balance","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","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","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","capital_gains"],"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"}],"params":{"stage":"salary_sacrifice","stage_contract_sha256":"a4af925af21cc6766eb7c8855b6743a3aa4eeeb38df12cfc83063d7ad6890539","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"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","employee_pension_contributions","highest_education","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":{"stage":"student_loans","stage_contract_sha256":"7c4c76398c2e80b41c7f941a5f06246b57d89b5eb0c36d42e3116ac35e82e203","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","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/tools/diagnose_uk_uc_lp_evidence.py b/tools/diagnose_uk_uc_lp_evidence.py new file mode 100644 index 000000000..960a6a922 --- /dev/null +++ b/tools/diagnose_uk_uc_lp_evidence.py @@ -0,0 +1,735 @@ +"""Reproduce the three UC LP evidence families from authenticated saved matrices. + +This development tool runs no population engine or calibration optimizer. Its +zero-objective LPs export aggregate diagnostics only, never witness weights or +source IDs. A feasible witness is not a release candidate or an optimized fit. +Historical evidence is verified, not rewritten, with --expected-evidence. +""" + +from __future__ import annotations + +import argparse +import importlib.util +import json +import math +import os +import platform +import time +from pathlib import Path + +import numpy as np +import scipy +from scipy import sparse +from scipy.optimize import linprog + +_HELPER_PATH = Path(__file__).with_name("diagnose_uk_uc_support.py") +_SPEC = importlib.util.spec_from_file_location("uc_lp_support_helper", _HELPER_PATH) +support = importlib.util.module_from_spec(_SPEC) +_SPEC.loader.exec_module(support) + +ADDITIONS = [ + "ons.household_composition.lone_parent_dependent_children_households", + "dwp.benefit_cap.capped_households", + "scotgov.scottish_child_payment_spending", + "dfe.funded_childcare.universal_only_children", + "dfe.funded_childcare.early_learning_2_year_olds", +] +LONE_PARENT = "dwp.uc.households_single_with_children@2025" +CGT = "obr.capital_gains_tax@2025" +RETAINED_CGT = ["hmrc.cgt.taxpayers_total@2025", "hmrc.cgt.gains_total@2025"] +ZERO_ROWS = sorted(name + "@2025" for name in support.KNOWN_ZERO_ROWS) +PROFILE_KEYS = { + "named-opposition": "fresh_named_opposition_lp_probes", + "full-supported": "fresh_full_supported_lp_probes", + "bounded-redistribution": "fresh_bounded_redistribution_lp_probes", +} +# Only descriptive prose and historical production identity are outside replay +# equality. Every operational field and deterministic number must be reproduced. +HISTORICAL_ONLY = { + "purpose", + "limitations", + "limits", + "aggregate_receipt_sha256", + "probe_script_sha256", + "protected_outcome_basis", +} + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def validate_arrays(run): + matrix = run["matrix"] + vector_keys = ( + "names", + "targets", + "prior", + "current", + "source_ids", + "household_ids", + "families", + "coefficients", + ) + require( + all(run[key].ndim == 1 for key in vector_keys), + "Saved arrays must be one-dimensional.", + ) + rows, columns = matrix.shape + require( + all( + len(run[k]) == rows + for k in ("names", "targets", "families", "coefficients") + ), + "Saved row arrays are not aligned.", + ) + require( + all( + len(run[k]) == columns + for k in ("prior", "current", "source_ids", "household_ids") + ), + "Saved household arrays are not aligned.", + ) + for key in ("source_ids", "household_ids"): + values = run[key] + require( + values.dtype.kind in "iu" and (values >= 0).all(), + "Saved identities must be nonnegative integers.", + ) + require( + len(set(run["household_ids"])) == columns, + "Household identities must be unique.", + ) + require(len(set(run["names"])) == rows, "Matrix row names must be unique.") + support.row_lookup(run["names"]) + require( + all(str(name).endswith("@2025") for name in run["names"]), + "These evidence profiles require exact 2025 rows.", + ) + require( + all( + np.isfinite(run[k]).all() + for k in ("targets", "prior", "current", "coefficients") + ) + and np.isfinite(matrix.data).all(), + "Saved numerical arrays must be finite.", + ) + require( + all( + (run[k] >= 0).all() for k in ("targets", "prior", "current", "coefficients") + ), + "Saved targets and weights must be nonnegative.", + ) + require( + run["coefficients"].sum() > 0 and run["current"].sum() > 0, + "Saved coefficient and current weight mass must be positive.", + ) + require( + np.all(run["current"] <= 10 * run["prior"] + 1e-8), + "Current weights exceed the prior cap.", + ) + require( + np.all(run["current"][run["prior"] == 0] == 0), + "Zero-prior households cannot have positive current weights.", + ) + matrix.sum_duplicates() + matrix.eliminate_zeros() + + +def load_run(run_dir): + run_dir = Path(run_dir) + paths = { + name: run_dir / name + for name in ( + "receipt.json", + "matrix.npz", + "inputs_private.npz", + "weights_private.npz", + ) + } + receipt = json.loads(paths["receipt.json"].read_text()) + require(isinstance(receipt, dict), "Completed receipt must be a JSON object.") + hashes = {name: support.digest(path) for name, path in paths.items()} + for filename, field in ( + ("matrix.npz", "matrix_sha256"), + ("inputs_private.npz", "inputs_private_sha256"), + ("weights_private.npz", "weights_private_sha256"), + ): + require( + receipt.get(field) == hashes[filename], + f"Saved {filename} does not match its receipt.", + ) + require( + receipt.get("model_year") == 2025, + "These evidence profiles require model year 2025.", + ) + fields = { + "names": "names", + "targets": "target_values", + "prior": "initial_weights", + "source_ids": "household_source_ids", + "household_ids": "household_ids", + "families": "target_families", + "coefficients": "target_loss_weights", + } + with np.load(paths["inputs_private.npz"], allow_pickle=False) as archive: + require( + set(fields.values()) <= set(archive.files), + "Saved inputs lack required arrays.", + ) + run = {key: archive[field] for key, field in fields.items()} + with np.load(paths["weights_private.npz"], allow_pickle=False) as archive: + require("weights" in archive.files, "Saved weights lack the weights array.") + run["current"] = archive["weights"] + run["matrix"] = sparse.csr_matrix(sparse.load_npz(paths["matrix.npz"])) + validate_arrays(run) + run.update(paths=paths, hashes=hashes) + return run + + +def checked_zero_rows(run): + zero = run["names"][np.diff(run["matrix"].indptr) == 0].tolist() + require( + sorted(zero) == ZERO_ROWS, + "Unexpected or missing zero rows; no additional rows may be silently removed.", + ) + require( + all(run["targets"][list(run["names"]).index(name)] > 0 for name in zero), + "Known zero rows must have positive targets.", + ) + return zero + + +def exact_indices(run, names): + lookup = {str(name): index for index, name in enumerate(run["names"])} + require(len(names) == len(set(names)), "Requested rows must be unique.") + require(set(names) <= set(lookup), "Requested exact rows are missing.") + return [lookup[name] for name in names] + + +def base_metadata(run, time_limit): + return { + "population_arm": "fresh-current-recovered", + "population_receipt_sha256": run["hashes"]["receipt.json"], + "matrix_sha256": run["hashes"]["matrix.npz"], + "input_archive_sha256": run["hashes"]["inputs_private.npz"], + "weight_archive_sha256": run["hashes"]["weights_private.npz"], + "model_year": 2025, + "solver": "scipy.optimize.linprog(method=highs)", + "scipy_version": scipy.__version__, + "objective": "Zero objective; feasibility only.", + "per_probe_time_limit_seconds": time_limit, + "weight_cap": "0 <= weight <= 10 * fresh prior weight", + "ess_constraint": False, + } + + +def named_opposition(run): + zero = checked_zero_rows(run) + uc = np.flatnonzero(np.isin(run["families"], list(support.UC_FAMILIES))) + require( + all(name in run["names"][uc] for name in zero), + "Known zero rows must belong to the UC roster.", + ) + selections = [[*support.BROAD, *ADDITIONS[:n]] for n in range(1, 6)] + selections.append( + [ + *[ + str(run["names"][i]).rsplit("@", 1)[0] + for i in uc + if run["names"][i] not in zero + ], + *ADDITIONS, + ] + ) + probes = [] + for i, selected in enumerate(selections): + exact_indices(run, [name + "@2025" for name in selected]) + result = support.lp_probe( + run["matrix"], + run["targets"], + run["prior"], + run["names"], + selected, + tolerance=0.05, + time_limit=20.0, + ) + probe = { + "label": f"broad10_plus_{i + 1}_named_rows" + if i < 5 + else f"supported{len(selected) - len(ADDITIONS)}_uc_plus_five_named_rows", + "row_count": len(selected), + "row_names": [name + "@2025" for name in selected], + "added_named_rows": [name + "@2025" for name in ADDITIONS[: i + 1]], + "status": result["status"], + "relative_tolerance": 0.05, + } + for key in ( + "scipy_status", + "scipy_message", + "normalized_constraint_violation", + "elapsed_seconds", + "active_weight_columns", + ): + if key in result: + probe[key] = result[key] + probes.append(probe) + return { + **base_metadata(run, 20.0), + "relative_tolerance": 0.05, + "constraint_bounds": "0.95 * target <= matrix_row @ weights <= 1.05 * target for every named row.", + "weight_bounds": {"lower": 0, "upper_fresh_prior_multiple": 10}, + "fixed_household_mass_constraint": False, + "full_366_row_constraint": False, + "full_active_uc_evaluation": { + "row_count": len(uc), + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": zero, + "linprog_called": False, + "reason": "A zero matrix row cannot reach 95% of its positive target under any permitted weights.", + }, + "probes": probes, + } + + +def concentration(weights, source_ids): + _, inverse = np.unique(source_ids, return_inverse=True) + source_weights = np.bincount(inverse, weights=weights) + + def metrics(values): + total = float(values.sum()) + count = len(values) + top = max(1, math.ceil(0.01 * count)) + return { + "entity_count": count, + "positive_weight_count": int(np.count_nonzero(values > 0)), + "effective_sample_size": total**2 / float(values @ values), + "weight_mass": total, + "maximum_weight_share": float(values.max() / total), + "top_one_percent_entity_count": top, + "top_one_percent_weight_share": float( + np.partition(values, count - top)[count - top :].sum() / total + ), + } + + return { + "households": metrics(weights), + "original_source_households": metrics(source_weights), + "share_basis": "Shares are of total household weight; source weights sum all descendant household weights. The top 1% count is ceil(0.01 * all entity count), including zero-weight entities in the count.", + } + + +def mixed_probe(run, selected_names, tolerances, *, multipliers=None, time_limit=30.0): + """Preserve the original sparse construction; aggregate a witness in memory.""" + indices = exact_indices(run, selected_names) + tolerance = np.asarray(tolerances, dtype=float) + require( + tolerance.shape == (len(indices),) + and np.isfinite(tolerance).all() + and ((tolerance > 0) & (tolerance < 1)).all(), + "Each row needs a finite tolerance between zero and one.", + ) + a = run["matrix"][indices] + b = run["targets"][indices] + prior, current = run["prior"], run["current"] + scales = np.maximum(np.abs(b), 1.0) + if multipliers is None: + columns = np.unique(a.indices) + columns = columns[prior[columns] > 0] + else: + factor_low, factor_high = multipliers + require( + 0 <= factor_low <= 1 <= factor_high and np.isfinite(multipliers).all(), + "Redistribution bounds must contain the current weights.", + ) + # Fixed mass constrains otherwise-unused columns too; do not prune them. + columns = np.flatnonzero(prior > 0) + normalized = ( + a[:, columns].multiply(prior[columns]).multiply((1.0 / scales)[:, None]).tocsr() + ) + lower = (b - tolerance * np.abs(b)) / scales + upper = (b + tolerance * np.abs(b)) / scales + started = time.monotonic() + if multipliers is None: + solution = linprog( + np.zeros(len(columns)), + A_ub=sparse.vstack([normalized, -normalized], format="csr"), + b_ub=np.concatenate([upper, -lower]), + bounds=(0.0, 10.0), + method="highs", + options={"time_limit": time_limit}, + ) + else: + bound_low = factor_low * current[columns] / prior[columns] + bound_high = np.minimum(factor_high * current[columns] / prior[columns], 10.0) + require( + np.all(bound_low <= bound_high + 1e-12), + "Empty current/prior bound intersection.", + ) + mass = float(current.sum()) + mass_row = sparse.csr_matrix((prior[columns] / mass).reshape(1, -1)) + solution = linprog( + np.zeros(len(columns)), + A_ub=sparse.vstack([normalized, -normalized], format="csr"), + b_ub=np.concatenate([upper, -lower]), + A_eq=mass_row, + b_eq=np.array([1.0]), + bounds=np.column_stack([bound_low, bound_high]), + method="highs", + options={"time_limit": time_limit}, + ) + result = { + "scipy_status": int(solution.status), + "scipy_message": solution.message, + "elapsed_seconds": time.monotonic() - started, + "active_weight_columns": len(columns), + } + if multipliers is not None: + result["current_weight_multiplier_bounds"] = list(multipliers) + if solution.status == 0: + evaluated = np.asarray(normalized @ solution.x) + residual = max( + float(np.max(lower - evaluated)), float(np.max(evaluated - upper)), 0.0 + ) + if multipliers is None: + bound_violation = max( + float(-solution.x.min()), float(solution.x.max() - 10.0), 0.0 + ) + else: + bound_violation = max( + float(np.max(bound_low - solution.x)), + float(np.max(solution.x - bound_high)), + 0.0, + ) + require( + np.isfinite(solution.x).all() + and np.isfinite(residual) + and residual <= 1e-6 + and bound_violation <= 1e-6, + "Successful LP failed independent row/bound verification.", + ) + li = selected_names.index(LONE_PARENT) + result.update( + status="feasible_for_named_rows_and_tolerances_only", + maximum_normalized_constraint_violation=residual, + maximum_weight_ratio_bound_violation=bound_violation, + ) + if multipliers is None: + result.update( + lone_parent_estimate=float(evaluated[li] * scales[li]), + lone_parent_target=float(b[li]), + lone_parent_relative_error=float( + evaluated[li] * scales[li] / b[li] - 1 + ), + ) + else: + witness = np.zeros(len(prior)) + witness[columns] = solution.x * prior[columns] + mass_error = abs(float(witness.sum()) / mass - 1.0) + require(mass_error <= 1e-8, "Successful LP failed fixed-mass verification.") + actual = np.asarray(run["matrix"] @ witness) + before = np.asarray(run["matrix"] @ current) + full_li = list(run["names"]).index(LONE_PARENT) + protected = [ + i + for i, name in enumerate(run["names"]) + if name.startswith("obr.") + or name.startswith( + ( + "hmrc/employment_income_income_band_", + "hmrc/employment_income_count_income_band_", + ) + ) + ] + result.update( + status="feasible_for_named_bounds_and_tolerances_only", + relative_total_mass_error=mass_error, + lone_parent_current_estimate=float(before[full_li]), + lone_parent_witness_estimate=float(actual[full_li]), + lone_parent_target=float(run["targets"][full_li]), + lone_parent_witness_relative_error=float( + actual[full_li] / run["targets"][full_li] - 1 + ), + witness_concentration=concentration(witness, run["source_ids"]), + protected_matrix_outcome_changes=[ + { + "name": str(run["names"][i]), + "current_estimate": float(before[i]), + "witness_estimate": float(actual[i]), + "change_percent": float(100 * (actual[i] / before[i] - 1)) + if before[i] + else None, + "target": float(run["targets"][i]), + "witness_target_error_percent": float( + 100 * (actual[i] / run["targets"][i] - 1) + ) + if run["targets"][i] + else None, + "constrained": str(run["names"][i]) != CGT, + } + for i in protected + ], + ) + elif solution.status == 2: + result["status"] = ( + "infeasible_for_named_rows_and_tolerances_under_cap" + if multipliers is None + else "infeasible_for_named_bounds_and_tolerances" + ) + elif solution.status == 1 and "time limit" in solution.message.lower(): + result["status"] = "time_limit_inconclusive" + else: + result["status"] = "inconclusive" + return result + + +def supported_names(run): + zero = checked_zero_rows(run) + exact_indices(run, [LONE_PARENT, CGT, *RETAINED_CGT]) + return zero, [str(name) for name in run["names"] if name not in zero] + + +def full_supported(run): + zero, supported = supported_names(run) + non_cgt = [name for name in supported if name != CGT] + probes = [] + profiles = [ + (f"all_supported_{len(supported)}_at_5pct", supported, 0.05), + (f"all_supported_non_cgt_{len(non_cgt)}_at_5pct", non_cgt, 0.05), + ("lone_parent_5pct_other_supported_non_cgt_25pct", non_cgt, 0.25), + ] + for label, names, default in profiles: + tolerance = [0.05 if name == LONE_PARENT else default for name in names] + result = mixed_probe(run, names, tolerance) + result.update( + label=label, + row_count=len(names), + row_names=names, + row_relative_tolerances=dict(zip(names, tolerance, strict=True)), + excluded_zero_rows=zero, + excluded_adjudicated_row=CGT if CGT not in names else None, + ) + probes.append(result) + return { + **base_metadata(run, 30.0), + "fixed_household_mass_constraint": False, + "all_366_row_evaluation": { + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": zero, + "additional_zero_rows": [], + "linprog_called": False, + }, + "adjudicated_cgt_row": CGT, + "retained_cgt_rows": RETAINED_CGT, + "probes": probes, + } + + +def bounded_redistribution(run): + zero, supported = supported_names(run) + names = [name for name in supported if name != CGT] + tolerance = [0.05 if name == LONE_PARENT else 0.25 for name in names] + probes = [] + for multipliers in ((0.75, 1.25), (0.5, 1.5)): + result = mixed_probe(run, names, tolerance, multipliers=multipliers) + probes.append(result) + if result["scipy_status"] != 2: + break + protected = probes[-1].get("protected_matrix_outcome_changes", []) + employment = [ + row["change_percent"] + for row in protected + if row["name"].startswith("hmrc/employment_income") + and row["change_percent"] is not None + ] + result = { + **base_metadata(run, 30.0), + "fixed_household_mass_constraint": True, + "fixed_household_weight_mass": float(run["current"].sum()), + "row_count": len(names), + "row_names": names, + "row_relative_tolerances": dict(zip(names, tolerance, strict=True)), + "excluded_zero_rows": zero, + "excluded_adjudicated_row": CGT, + "full_366_row_evaluation": { + "status": "infeasible_by_zero_support", + "zero_support_positive_rows": zero, + "additional_zero_rows": [], + }, + "current_concentration": concentration(run["current"], run["source_ids"]), + "probes": probes, + "wider_redistribution_probe": { + "current_weight_multiplier_bounds": [0.5, 1.5], + "status": "run" if len(probes) == 2 else "not_run", + "reason": "The tighter 0.75–1.25 probe was feasible; the wider probe was conditional on infeasibility." + if probes[0]["scipy_status"] == 0 + else "Widening requires proved infeasibility, not a timeout or another inconclusive result.", + }, + } + if protected: + result["material_tradeoffs"] = { + "selected_changes": [ + row + for row in protected + if row["name"] + in [ + "obr.income_tax@2025", + "obr.ni@2025", + "obr.state_pension@2025", + "obr.child_benefit@2025", + ] + ], + "employment_income_and_count_band_change_percent_range": { + "minimum": min(employment) if employment else None, + "maximum": max(employment) if employment else None, + "row_count": len(employment), + }, + } + return result + + +def assert_equal(actual, expected, path="root"): + """Exact recursive equality; only wall-clock runtime may vary.""" + if isinstance(expected, dict): + require(isinstance(actual, dict), f"Replay mismatch: {path} is not an object.") + for key, value in expected.items(): + if key == "elapsed_seconds" or ( + key == "interpretation" and path.endswith(".material_tradeoffs") + ): + continue + require(key in actual, f"Replay missing field: {path}.{key}") + assert_equal(actual[key], value, f"{path}.{key}") + elif isinstance(expected, list): + require( + isinstance(actual, list) and len(actual) == len(expected), + f"Replay list mismatch: {path}", + ) + for i, value in enumerate(expected): + assert_equal(actual[i], value, f"{path}[{i}]") + else: + require( + actual == expected, f"Replay mismatch at {path}: {actual!r} != {expected!r}" + ) + + +def verify_historical(results, evidence): + for profile, observed in results.items(): + key = PROFILE_KEYS[profile] + require(key in evidence, f"Historical evidence lacks {key}.") + expected = {k: v for k, v in evidence[key].items() if k not in HISTORICAL_ONLY} + assert_equal(observed, expected, key) + return { + "status": "exact_deterministic_parity", + "profiles": list(results), + "excluded_runtime_fields": ["elapsed_seconds"], + "historical_only_fields": sorted(HISTORICAL_ONLY), + "historical_narrative_paths": ["material_tradeoffs.interpretation"], + } + + +def produce(run_dir, output_dir, profile="all", expected_evidence=None): + output_dir = Path(output_dir) + require(not output_dir.exists(), "Output directory must be new.") + require(profile == "all" or profile in PROFILE_KEYS, "Unknown LP profile.") + run = load_run(run_dir) + sources = { + "producer_sha256": support.digest(__file__), + "support_helper_sha256": support.digest(_HELPER_PATH), + } + expected_path = Path(expected_evidence) if expected_evidence is not None else None + expected = ( + json.loads(expected_path.read_text()) if expected_path is not None else None + ) + expected_hash = support.digest(expected_path) if expected_path is not None else None + versions = { + "python": platform.python_version(), + "numpy": np.__version__, + "scipy": scipy.__version__, + } + if expected is not None: + recorded = expected["arms"]["fresh-current-recovered"]["versions"] + require( + all(recorded[k] == value for k, value in versions.items()), + "Exact replay requires the historical Python/NumPy/SciPy versions.", + ) + profiles = list(PROFILE_KEYS) if profile == "all" else [profile] + operators = { + "named-opposition": named_opposition, + "full-supported": full_supported, + "bounded-redistribution": bounded_redistribution, + } + results = {name: operators[name](run) for name in profiles} + parity = ( + verify_historical(results, expected) + if expected is not None + else {"status": "not_requested"} + ) + require( + all( + support.digest(path) == run["hashes"][name] + for name, path in run["paths"].items() + ), + "Saved input changed during LP reproduction.", + ) + require( + sources + == { + "producer_sha256": support.digest(__file__), + "support_helper_sha256": support.digest(_HELPER_PATH), + }, + "Producer/helper changed during LP reproduction.", + ) + if expected_path is not None: + require( + support.digest(expected_path) == expected_hash, + "Historical evidence changed during reproduction.", + ) + report = { + "schema_version": 1, + "profiles": results, + "provenance": { + **sources, + "versions": versions, + "profile": profile, + "expected_evidence_sha256": expected_hash, + }, + "verification": parity, + "limitations": [ + "No population engine or calibration optimizer runs; these are zero-objective feasibility checks only.", + "The two positive-target zero rows remain in full-roster evaluation; diagnostic exclusions change no production targets or gates.", + "No ESS guarantee, global-optimality claim or release-readiness conclusion follows. Protected OBR/HMRC matrix outcomes retain their distinct definitions.", + "No witness weights, original source IDs or private filesystem paths are exported.", + ], + } + output_dir.mkdir(parents=True, exist_ok=False) + path = output_dir / "lp-evidence-reproduction.json" + path.write_text(json.dumps(report, indent=2, allow_nan=False) + "\n") + verification = { + **parity, + "result_sha256": support.digest(path), + **report["provenance"], + } + (output_dir / "verification.json").write_text( + json.dumps(verification, indent=2, allow_nan=False) + "\n" + ) + return verification + + +def main(argv=None): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--run-dir", type=Path, required=True) + parser.add_argument("--output-dir", type=Path, required=True) + parser.add_argument("--profile", choices=[*PROFILE_KEYS, "all"], default="all") + parser.add_argument("--expected-evidence", type=Path) + args = parser.parse_args(argv) + os.umask(0o077) + print( + json.dumps( + produce(args.run_dir, args.output_dir, args.profile, args.expected_evidence) + ) + ) + + +if __name__ == "__main__": + main() diff --git a/tools/diagnose_uk_uc_matrix.py b/tools/diagnose_uk_uc_matrix.py index 7946e0b91..06324eee2 100644 --- a/tools/diagnose_uk_uc_matrix.py +++ b/tools/diagnose_uk_uc_matrix.py @@ -8,24 +8,45 @@ from __future__ import annotations import argparse +import hashlib +import importlib.metadata import json import os +import platform +import time from pathlib import Path import numpy as np import pandas as pd -from diagnose_uk_uc_relationships import sha256, variable_overlay +from diagnose_uk_uc_relationships import ( + BU_VARIABLES, + GB_REGIONS, + sha256, + variable_overlay, +) from scipy import sparse from microcosm.build.ledger_artifact import load_ledger_consumer_artifact -from microcosm.build.target_materialization import resolve_target_measures +from microcosm.build.ledger_targets import ( + LedgerTargetReference, + compile_ledger_target_references, +) +from microcosm.build.target_materialization import ( + materialize_target_bindings, + resolve_target_measures, +) from microcosm.build.uk_runtime.ledger_targets import ( + _candidate_facts_for_reference, + _uk_baseline_flag_crosstab, + _uk_input_substitution, + _uk_parameter_gated_threshold, compile_uk_target_registry, materialize_uk_ledger_targets, ) from microcosm.build.uk_runtime.measure_simulation import ( UKMeasureResolver, apply_uk_calibration_measure_exclusions, + compute_uc_paid_diagnostic_masks, load_uk_calibration_measure_exclusions, ) from microcosm.build.uk_runtime.national_calibration import ( @@ -36,10 +57,363 @@ from microcosm.build.uk_runtime.national_doctrine import uk_national_target_loss_weights from microcosm.build.uk_runtime.national_frame import uk_national_frame from microcosm.build.uk_runtime.uc_relationships import frs_uc_claimant_mask -from microcosm.calibrate import calibrate +from microcosm.build.uk_runtime.uc_source_periods import ( + validate_uc_source_month_coverage, +) +from microcosm.build.uk_runtime.uc_target_measurements import ( + uc_paid_comparison_contract, +) +from microcosm.calibrate import TargetRegistry, calibrate from microcosm.calibrate.matrix import build_constraint_matrix from microcosm.frame import WeightKind +OPTIONAL_UC_DIAGNOSTIC_VARIABLES = frozenset( + {"uc_net_earned_income", "uc_capital_income", "uc_tariff_income"} +) + + +def uc_diagnostic_variables(resolver): + """Expose actual engine components without equating differently named flows.""" + requested = dict.fromkeys( + ( + *BU_VARIABLES, + "uc_tariff_income", + "uc_calibration_administrative_family_type", + "uc_calibration_child_entitlement", + ) + ) + available, unavailable = [], [] + for variable in requested: + if ( + variable.startswith("uc_calibration_") + or variable in resolver.simulation.tax_benefit_system.variables + ): + available.append(variable) + elif variable in OPTIONAL_UC_DIAGNOSTIC_VARIABLES: + unavailable.append(variable) + else: + raise ValueError( + f"Required UC diagnostic variable is unavailable: {variable}" + ) + return available, unavailable + + +DIAGNOSTIC_CODE_MODULES = ( + "microcosm.build.ledger_targets", + "microcosm.build.target_materialization", + "microcosm.build.uk_runtime.ledger_targets", + "microcosm.build.uk_runtime.measure_simulation", + "microcosm.build.uk_runtime.national_calibration", + "microcosm.build.uk_runtime.national_doctrine", + "microcosm.build.uk_runtime.national_frame", + "microcosm.build.uk_runtime.uc_relationships", + "microcosm.build.uk_runtime.uc_source_periods", + "microcosm.build.uk_runtime.uc_target_measurements", + "microcosm.calibrate.solve", + "microcosm.calibrate.matrix", + "microcosm.calibrate.target", + "microcosm.calibrate.registry", + "microcosm.frame.adapters.policyengine_uk", +) +COMPARISON_CONTEXT_FIELDS = ( + "replay_receipt_sha256", + "model_year", + "source_year", + "model_mode", + "model_overlay_used", + "versions", + "code_sha256", + "exclusions_sha256", + "solver_epochs", +) + + +def diagnostic_code_paths(): + """Explicit numerical and measurement sources held constant across arms.""" + return { + "tool": Path(__file__), + "replay_helper": Path(__file__).with_name("diagnose_uk_uc_relationships.py"), + **{ + name: Path(importlib.import_module(name).__file__) + for name in DIAGNOSTIC_CODE_MODULES + }, + } + + +def capture_file_hashes(paths): + return {name: sha256(path) for name, path in paths.items()} + + +def verify_file_hashes(paths, expected): + current = capture_file_hashes(paths) + changed = sorted( + name + for name in set(expected) | set(current) + if expected.get(name) != current.get(name) + ) + if changed: + raise ValueError( + f"Diagnostic input/code bytes changed during the run: {changed}." + ) + + +def runtime_versions(): + return { + "python": platform.python_version(), + **{ + name: importlib.metadata.version(name) + for name in ( + "policyengine-uk", + "policyengine-core", + "numpy", + "pandas", + "scipy", + "torch", + ) + }, + } + + +def validate_comparison_context(baseline, current): + for field in COMPARISON_CONTEXT_FIELDS: + if ( + field not in baseline + or field not in current + or baseline[field] != current[field] + ): + raise ValueError( + f"Target-only comparison changed or lacks control {field!r}." + ) + return { + field: {"baseline": baseline.get(field), "current": current.get(field)} + for field in ("facts_sha256", "manifest_sha256") + if baseline.get(field) != current.get(field) + } + + +def validate_baseline_inputs(baseline_receipt, observed_digest): + if baseline_receipt.get("inputs_private_sha256") != observed_digest: + raise ValueError( + "Comparison baseline inputs differ from their completed receipt." + ) + + +def source_support_metrics(row, weights, source_ids): + """Measure independent support after grouping all clones of each source. + + Concentration uses absolute source contributions so signed target rows have + a defined diagnostic too. UC count rows have nonnegative contributions. + """ + row = sparse.csr_matrix(row).copy() + row.eliminate_zeros() + if row.shape != (1, len(weights)) or len(source_ids) != len(weights): + raise ValueError("Source support inputs must share the household order.") + if pd.isna(source_ids).any(): + raise ValueError( + "Source support requires complete source household identities." + ) + columns = row.indices + grouped = ( + pd.Series(row.data * weights[columns]) + .groupby(np.asarray(source_ids)[columns]) + .sum() + .abs() + .to_numpy() + ) + mass = float(grouped.sum()) + square_sum = float(grouped @ grouped) + largest = float(grouped.max()) if len(grouped) else 0.0 + return { + "household_support": int(row.nnz), + "original_source_household_support": int( + len(np.unique(np.asarray(source_ids)[columns])) + ), + "source_contribution_ess": mass**2 / square_sum if square_sum else 0.0, + "largest_source_contribution_share": largest / mass if mass else 0.0, + "largest_source_absolute_contribution": largest, + } + + +def matrix_support_metrics(matrix, weights, source_ids): + """Accept the sparse array returned by the production matrix builder.""" + return [ + source_support_metrics(matrix[index : index + 1], weights, source_ids) + for index in range(matrix.shape[0]) + ] + + +def write_uc_support_diagnostics(frame, resolver, weight_vectors, output_dir): + """Evaluate distinct paid-claim crosses and original-source support in GB.""" + person, benunit, household = [ + frame.table(name) for name in ("person", "benunit", "household") + ] + nesting = person[["person_benunit_id", "person_household_id"]].drop_duplicates() + if nesting["person_benunit_id"].duplicated().any(): + raise ValueError("Diagnostic benefit units must nest in one household.") + ids = benunit["benunit_id"].map( + nesting.set_index("person_benunit_id")["person_household_id"] + ) + columns = pd.Index(household["household_id"]).get_indexer(ids) + if (columns < 0).any(): + raise ValueError("Diagnostic benefit units lack household membership.") + regions = resolver.compute("household", "region")[0] + gb = np.isin(regions[columns], list(GB_REGIONS)) + masks = compute_uc_paid_diagnostic_masks(frame, resolver.simulation, resolver.year) + diagnostics = [] + private = benunit[["benunit_id", "benunit_source_id"]].copy() + private["household_id"] = ids.to_numpy() + private["household_source_id"] = household["household_source_id"].to_numpy()[ + columns + ] + private["great_britain"] = gb + for label, weights in weight_vectors.items(): + private[f"weight_{label}"] = weights[columns] + for name, mask in masks.items(): + selected = mask & gb + private[f"diagnostic.{name}"] = selected + hh_counts = np.bincount(columns[selected], minlength=len(household)) + item = { + "name": name, + "geography": "GB", + "benefit_unit_support": int(selected.sum()), + "original_source_benefit_unit_support": int( + private.loc[selected, "benunit_source_id"].nunique() + ), + } + item.update( + { + label: float(hh_counts @ weights) + for label, weights in weight_vectors.items() + } + ) + item.update( + source_support_metrics( + sparse.csr_matrix(hh_counts[None, :]), + weight_vectors["calibrated"], + household["household_source_id"].to_numpy(), + ) + ) + diagnostics.append(item) + variables, unavailable = uc_diagnostic_variables(resolver) + for variable in variables: + private[variable] = resolver.compute("benunit", variable)[0] + private.to_pickle(output_dir / "benefit_units_private.pkl") + (output_dir / "uc_joint_diagnostics.json").write_text( + json.dumps( + { + "contract": uc_paid_comparison_contract(resolver.year), + "rows": diagnostics, + "unavailable_optional_components": unavailable, + "available_component_variables": variables, + }, + indent=2, + ) + + "\n" + ) + protected = [] + for variable in ( + "income_tax", + "national_insurance", + "state_pension", + "child_benefit", + "housing_benefit", + "employment_income", + ): + values = resolver.compute("household", variable)[0] + protected.append( + { + "name": variable, + "geography": "UK", + **{ + label: float(values @ weights) + for label, weights in weight_vectors.items() + }, + } + ) + (output_dir / "protected_outcomes.json").write_text( + json.dumps(protected, indent=2) + "\n" + ) + + +def validate_comparison_controls( + baseline, + *, + household_ids, + initial_weights, + names, + target_values, + household_source_ids, + target_loss_weights, +): + """Refuse population drift and enumerate a deliberately changed contract.""" + if not np.array_equal(baseline["household_ids"], household_ids): + raise ValueError("Target-only comparison changed household identities/order.") + if not np.array_equal(baseline["initial_weights"], initial_weights): + raise ValueError("Target-only comparison changed prior weights.") + if pd.isna(household_source_ids).any() or not np.array_equal( + baseline["household_source_ids"], household_source_ids + ): + raise ValueError("Target-only comparison changed source household identities.") + if not np.array_equal(baseline["target_loss_weights"], target_loss_weights): + raise ValueError("Target-only comparison changed target loss coefficients.") + old_names = baseline["names"].astype(str).tolist() + names = list(names) + if len(set(old_names)) != len(old_names) or len(set(names)) != len(names): + raise ValueError("Target comparison names must be unique.") + if old_names != names: + raise ValueError("Target-only comparison changed target names/order.") + old = dict(zip(old_names, baseline["target_values"], strict=True)) + new = dict(zip(names, target_values, strict=True)) + changed = [ + {"name": name, "old": float(old[name]), "new": float(new[name])} + for name in sorted(old.keys() & new.keys()) + if old[name] != new[name] + ] + return { + "same_household_order_and_priors": True, + "target_values_and_roster_unchanged": old == new and old_names == names, + "added_rows": sorted(new.keys() - old.keys()), + "removed_rows": sorted(old.keys() - new.keys()), + "changed_target_values": changed, + } + + +def compile_explicit_references(facts, path, year): + """Use the production reference compiler/coverage checks on a frozen roster.""" + payload = json.loads(path.read_text()) + fact_rows = tuple(facts) + specs = [] + for row in payload["target_references"]: + reference = LedgerTargetReference(**{**row, "period": year}) + candidates = _candidate_facts_for_reference(fact_rows, reference) + registry = compile_ledger_target_references( + candidates, [reference], country="uk" + ) + registry = validate_uc_source_month_coverage(reference, registry, candidates) + specs.extend(registry.specs) + return TargetRegistry(specs, country="uk") + + +def validate_inherited_contract(inherited, names, values, *, allowed_removals): + """Allow declared exclusions since an older capture, never value drift.""" + old = dict( + zip(inherited["names"].astype(str), inherited["target_values"], strict=True) + ) + new = dict(zip(names, values, strict=True)) + removed = set(old) - set(new) + if set(new) - set(old) or any( + name.rsplit("@", 1)[0] not in allowed_removals for name in removed + ): + raise ValueError("Released baseline has an unreviewed roster change.") + if any(old[name] != value for name, value in new.items()): + raise ValueError("Released baseline changed inherited target values.") + if list(new) != [name for name in old if name in new]: + raise ValueError("Released baseline changed inherited target order.") + return { + "removed_reviewed_rows": sorted(removed), + "surviving_values_unchanged": True, + } + def main(): parser = argparse.ArgumentParser(description=__doc__) @@ -49,10 +423,75 @@ def main(): parser.add_argument("--manifest-sha256", required=True) parser.add_argument("--output-dir", type=Path, required=True) parser.add_argument("--epochs", type=int, default=0) + parser.add_argument( + "--model-mode", + choices=("retained_overlay", "released"), + default="retained_overlay", + ) + parser.add_argument("--contract", type=Path) + parser.add_argument("--references", type=Path) + parser.add_argument("--comparison-baseline", type=Path) + parser.add_argument("--comparison-label") + parser.add_argument("--exclusions", type=Path) args = parser.parse_args() + if bool(args.contract) != bool(args.references): + parser.error("--contract and --references must be supplied together") + if args.comparison_baseline and not args.comparison_label: + parser.error("A changed-contract comparison needs --comparison-label") + started = time.monotonic() os.umask(0o077) args.output_dir.mkdir(parents=True, exist_ok=False) + package_dir = ( + Path( + importlib.import_module( + "microcosm.build.uk_runtime.measure_simulation" + ).__file__ + ).parent.parent + / "uk" + ) + run_paths = { + "replay_receipt": args.replay_dir / "aggregate.json", + "retained_awards": args.replay_dir / "benefit_units_private.pkl", + "contract": args.contract or package_dir / "uk_population_targets.json", + "references": args.references or package_dir / "target_references.json", + "exclusions": args.exclusions + or package_dir / "calibration_measure_exclusions.json", + } + if args.comparison_baseline: + run_paths.update( + { + "baseline_receipt": args.comparison_baseline / "receipt.json", + "baseline_inputs": args.comparison_baseline / "inputs_private.npz", + } + ) + code_paths = diagnostic_code_paths() + run_hashes = capture_file_hashes(run_paths) + code_hashes = capture_file_hashes(code_paths) + versions = runtime_versions() receipt = json.loads((args.replay_dir / "aggregate.json").read_text()) + control_context = { + "replay_receipt_sha256": run_hashes["replay_receipt"], + "source_year": receipt["source_year"], + "model_year": receipt["model_year"], + "model_mode": args.model_mode, + "model_overlay_used": receipt["model_overlay"] + if args.model_mode == "retained_overlay" + else [], + "versions": versions, + "code_sha256": code_hashes, + "facts_sha256": args.facts_sha256, + "manifest_sha256": args.manifest_sha256, + "exclusions_sha256": run_hashes["exclusions"], + "solver_epochs": args.epochs, + } + baseline_receipt = None + source_artifact_changes = {} + if args.comparison_baseline: + baseline_receipt = json.loads(run_paths["baseline_receipt"].read_text()) + source_artifact_changes = validate_comparison_context( + baseline_receipt, control_context + ) + validate_baseline_inputs(baseline_receipt, run_hashes["baseline_inputs"]) inputs = {Path(k): v for k, v in receipt["input_sha256"].items()} for path, digest in inputs.items(): assert sha256(path) == digest, path @@ -61,6 +500,9 @@ def main(): pd.read_pickle(paths[f"{name}.pkl"]) for name in ("person", "benunit", "household") ] + for entity, table in (("household", household), ("benunit", benunit)): + if table[f"{entity}_source_id"].isna().any(): + raise ValueError(f"Diagnostic {entity} source identities must be complete.") inherited = np.load(paths["solve.npz"], allow_pickle=False) if receipt["explicit_frs_claimant_input"]: person["is_uc_claimant"] = frs_uc_claimant_mask(person, benunit) @@ -73,7 +515,7 @@ def main(): weight_kind=WeightKind.IMPORTANCE, ) factory = None - if receipt["model_overlay"]: + if receipt["model_overlay"] and args.model_mode == "retained_overlay": from policyengine_uk import Microsimulation overlay_paths = [] @@ -93,21 +535,35 @@ def factory(**kwargs): scratch_dir=args.output_dir / "engine", microsimulation_factory=factory, ) + uc_diagnostic_variables(resolver) old = pd.read_pickle(args.replay_dir / "benefit_units_private.pkl") - np.testing.assert_array_equal( - resolver.compute("benunit", "universal_credit")[0], old.universal_credit - ) + current_uc = resolver.compute("benunit", "universal_credit")[0] + retained_awards_identical = np.array_equal(current_uc, old.universal_credit) + if args.model_mode == "retained_overlay": + np.testing.assert_array_equal(current_uc, old.universal_credit) + uc_sha256 = hashlib.sha256(current_uc.tobytes()).hexdigest() artifact = load_ledger_consumer_artifact( args.ledger_dir, expected_facts_sha256=args.facts_sha256, expected_manifest_sha256=args.manifest_sha256, ) - compilation = compile_uk_target_registry( - artifact.facts, target_period=receipt["model_year"] - ) - assert not compilation.unsupported, compilation.unsupported + contract = None + if args.references: + full_registry = compile_explicit_references( + artifact.facts, args.references, receipt["model_year"] + ) + contract = { + target["target_id"]: target + for target in json.loads(args.contract.read_text())["targets"] + } + else: + compilation = compile_uk_target_registry( + artifact.facts, target_period=receipt["model_year"] + ) + assert not compilation.unsupported, compilation.unsupported + full_registry = compilation.registry registry, exclusions = apply_uk_calibration_measure_exclusions( - compilation.registry, load_uk_calibration_measure_exclusions(None) + full_registry, load_uk_calibration_measure_exclusions(args.exclusions) ) print(f"Resolving {len(registry.specs)} active rows.", flush=True) resolution = resolve_target_measures( @@ -115,33 +571,84 @@ def factory(**kwargs): registry, resolver, period=receipt["model_year"], - band_edge_registry=compilation.registry, + contract_targets=contract, + band_edge_registry=full_registry, ) adapter = CalibrationFrameAdapter(frame) original_columns = { entity: set(table.columns) for entity, table in adapter.tables.items() } inject_measure_inputs(adapter, resolution.measure_inputs) - materialized = materialize_uk_ledger_targets( - adapter, - registry, - period=receipt["model_year"], - band_edge_registry=compilation.registry, - ) + if contract is None: + materialized = materialize_uk_ledger_targets( + adapter, + registry, + period=receipt["model_year"], + band_edge_registry=full_registry, + ) + else: + materialized = materialize_target_bindings( + adapter, + registry, + contract, + period=receipt["model_year"], + band_edge_registry=full_registry, + providers={ + "parameter_gated_threshold": _uk_parameter_gated_threshold, + "baseline_flag_crosstab": _uk_baseline_flag_crosstab, + "input_substitution_counterfactual": _uk_input_substitution, + }, + ) assert not materialized.skipped, materialized.skipped drop_injected_measure_inputs(adapter, resolution.measure_inputs, original_columns) prepared = adapter.prepared_frame() targets = registry.to_target_set() problem = build_constraint_matrix(prepared, targets, weight_entity="household") assert not problem.skipped - np.testing.assert_array_equal(problem.names, inherited["names"]) - np.testing.assert_array_equal(problem.target_vector, inherited["target_values"]) - np.testing.assert_array_equal( - problem.initial_weights.values, inherited["initial_weights"] - ) coefficients = uk_national_target_loss_weights( [spec.family for spec in registry.specs], rule="family_equal" ) + comparison = None + inherited_control = None + if args.comparison_baseline: + baseline = np.load( + args.comparison_baseline / "inputs_private.npz", allow_pickle=False + ) + comparison = validate_comparison_controls( + baseline, + household_ids=household["household_id"].to_numpy(), + initial_weights=problem.initial_weights.values, + names=problem.names, + target_values=problem.target_vector, + household_source_ids=household["household_source_id"].to_numpy(), + target_loss_weights=coefficients, + ) + if baseline_receipt["uc_awards_sha256"] != uc_sha256: + raise ValueError("Target-only comparison changed simulated UC awards.") + comparison["baseline_receipt_sha256"] = run_hashes["baseline_receipt"] + comparison["label"] = args.comparison_label + comparison["source_artifact_changes"] = source_artifact_changes + comparison["binding_changes"] = { + field: {"baseline": baseline_receipt.get(field), "current": run_hashes[key]} + for field, key in ( + ("target_contract_sha256", "contract"), + ("target_references_sha256", "references"), + ) + if baseline_receipt.get(field) != run_hashes[key] + } + elif args.model_mode == "released" and args.references and args.exclusions: + inherited_control = validate_inherited_contract( + inherited, + problem.names, + problem.target_vector, + allowed_removals=set(exclusions), + ) + else: + np.testing.assert_array_equal(problem.names, inherited["names"]) + np.testing.assert_array_equal(problem.target_vector, inherited["target_values"]) + np.testing.assert_array_equal( + problem.initial_weights.values, inherited["initial_weights"] + ) sparse.save_npz(args.output_dir / "matrix.npz", problem.matrix) np.savez_compressed( args.output_dir / "inputs_private.npz", @@ -151,6 +658,7 @@ def factory(**kwargs): inherited_weights=inherited["weights"], target_loss_weights=coefficients, household_ids=household["household_id"].to_numpy(), + household_source_ids=household["household_source_id"].to_numpy(), target_families=np.array([spec.family for spec in registry.specs]), ) row_estimates = pd.DataFrame( @@ -162,7 +670,13 @@ def factory(**kwargs): } ) run = None + matrix_seconds = time.monotonic() - started + diagnostic_weights = inherited["weights"] if args.epochs: + import torch + + torch.set_num_threads(2) + solve_started = time.monotonic() print(f"Running diagnostic Adam for {args.epochs} epochs.", flush=True) result = calibrate( prepared, @@ -182,6 +696,7 @@ def factory(**kwargs): args.output_dir / "weights_private.npz", weights=result.weights ) row_estimates["new_calibrated"] = problem.matrix @ result.weights + diagnostic_weights = result.weights run = { "epochs": args.epochs, "learning_rate": 0.02, @@ -193,29 +708,88 @@ def factory(**kwargs): "target_weight_rule": "family_equal", "initial_loss": result.initial_loss, "final_loss": result.final_loss, + "elapsed_seconds": time.monotonic() - solve_started, + "torch_threads": torch.get_num_threads(), } + (args.output_dir / "solver.json").write_text(json.dumps(run, indent=2) + "\n") + support_rows = matrix_support_metrics( + problem.matrix, diagnostic_weights, household["household_source_id"].to_numpy() + ) + for key in support_rows[0]: + row_estimates[key] = [row[key] for row in support_rows] + positive = problem.matrix.copy() + positive.data = np.maximum(positive.data, 0) + row_estimates["cap_only_maximum"] = positive @ (10 * problem.initial_weights.values) + source_weights = ( + pd.Series(diagnostic_weights) + .groupby(household["household_source_id"].to_numpy()) + .sum() + .to_numpy() + ) + concentration = { + "household_ess": float( + diagnostic_weights.sum() ** 2 / (diagnostic_weights @ diagnostic_weights) + ), + "source_household_ess": float( + source_weights.sum() ** 2 / (source_weights @ source_weights) + ), + "weight_mass": float(diagnostic_weights.sum()), + "max_weight_ratio": float( + np.max(diagnostic_weights / problem.initial_weights.values) + ), + } row_estimates.to_json( args.output_dir / "row_estimates.json", orient="records", indent=2 ) + write_uc_support_diagnostics( + frame, + resolver, + { + "prior": problem.initial_weights.values, + "inherited": inherited["weights"], + "calibrated": diagnostic_weights, + }, + args.output_dir, + ) for path, digest in inputs.items(): assert sha256(path) == digest, path + verify_file_hashes(run_paths, run_hashes) + verify_file_hashes(code_paths, code_hashes) + if runtime_versions() != versions: + raise ValueError("Diagnostic runtime versions changed during the run.") (args.output_dir / "receipt.json").write_text( json.dumps( { "purpose": "Development matrix/solver diagnostic; no certified dataset export", - "replay_receipt_sha256": sha256(args.replay_dir / "aggregate.json"), - "tool_sha256": sha256(Path(__file__)), - "target_contract_sha256": sha256( - Path(__file__).resolve().parents[1] - / "packages/microcosm-build/src/microcosm/build/uk/uk_population_targets.json" - ), + **control_context, + "tool_sha256": code_hashes["tool"], + "run_input_sha256": run_hashes, + "target_contract_sha256": run_hashes["contract"], + "target_references_sha256": run_hashes["references"], "matrix_sha256": sha256(args.output_dir / "matrix.npz"), - "facts_sha256": args.facts_sha256, - "manifest_sha256": args.manifest_sha256, - "compiled_rows": len(compilation.registry.specs), + "inputs_private_sha256": sha256(args.output_dir / "inputs_private.npz"), + "weights_private_sha256": sha256( + args.output_dir / "weights_private.npz" + ) + if args.epochs + else None, + "compiled_rows": len(full_registry.specs), "active_rows": len(problem.names), "exclusions": exclusions, - "target_values_and_roster_unchanged": True, + "target_values_and_roster_unchanged": comparison[ + "target_values_and_roster_unchanged" + ] + if comparison + else not ( + inherited_control and inherited_control["removed_reviewed_rows"] + ), + "inherited_contract_control": inherited_control, + "comparison": comparison, + "retained_awards_identical": bool(retained_awards_identical), + "uc_awards_sha256": uc_sha256, + "matrix_and_measurement_seconds": matrix_seconds, + "total_seconds": time.monotonic() - started, + "concentration": concentration, "measure_resolver": resolver.receipt(), "solver": run, }, diff --git a/tools/diagnose_uk_uc_support.py b/tools/diagnose_uk_uc_support.py new file mode 100644 index 000000000..7891bc978 --- /dev/null +++ b/tools/diagnose_uk_uc_support.py @@ -0,0 +1,700 @@ +"""Diagnose UC support in saved, receipted calibration matrices. + +Run after ``tools/diagnose_uk_uc_matrix.py`` (or a compatible matrix producer): + + uv run python tools/diagnose_uk_uc_support.py \ + --run-dir /path/to/completed-run --output-dir /path/to/new-support-report + +Requires matrix.npz, inputs_private.npz, weights_private.npz and receipt.json. +The receipt must attest all three file hashes; this verifies saved input identity, +not dataset certification. No population engine or calibration optimizer is run. +LPs constrain only their named rows with nonnegative weights capped at 10 times +prior weights. Keep source_group_influence_private.json local: it contains source +identities and leave-one-source-out contributions. Aggregate reports omit IDs. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import platform +import time +from pathlib import Path + +import numpy as np +import scipy +from scipy import sparse +from scipy.optimize import linprog + +UC_FAMILIES = {"dwp_universal_credit", "dwp_two_child_limit"} +BROAD = [ + "dwp.uc.households", + *[ + f"dwp.uc.households_{x}" + for x in ( + "single_no_children", + "single_with_children", + "couple_no_children", + "couple_with_children", + ) + ], + *[f"dwp.uc.households_children_{x}" for x in ("1", "2", "3", "4", "5_or_more")], +] +FIVE_PLUS = { + "dwp.uc.households_children_5_or_more", + *[ + f"dwp.uc.two_child_limit.{x}" + for x in ( + "households_5_children", + "children_in_5_children_households", + "households_6_plus_children", + "children_in_6_plus_children_households", + ) + ], +} +KNOWN_ZERO_ROWS = { + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_27_600_to_28_800", + "dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_28_800_to_30_000", +} + + +def digest(path): + with Path(path).open("rb") as handle: + return hashlib.file_digest(handle, "sha256").hexdigest() + + +def weighted_loss(estimates, targets, coefficients, cap=10.0): + return float( + np.minimum(np.abs(estimates - targets) / np.maximum(np.abs(targets), 1.0), cap) + @ coefficients + / coefficients.sum() + ) + + +def row_lookup(names): + lookup = {} + for index, name in enumerate(names): + base = name.rsplit("@", 1)[0] + if base in lookup: + raise ValueError(f"Ambiguous period for requested matrix row: {base}") + lookup[base] = index + return lookup + + +def grouped_contributions(row, weights, source_ids): + row = sparse.csr_matrix(row).copy() + row.sum_duplicates() + row.eliminate_zeros() + ids, inverse = np.unique(source_ids[row.indices], return_inverse=True) + contributions = np.bincount( + inverse, weights=row.data * weights[row.indices], minlength=len(ids) + ) + return row, ids, contributions + + +def row_support( + row, weights, prior, source_ids, target, tolerance=0.05, cap_ratio=10.0 +): + row, ids, contribution = grouped_contributions(row, weights, source_ids) + mass = np.abs(contribution) + mass_sum = float(mass.sum()) + squared = float(mass @ mass) + upper = float(np.maximum(row.data, 0.0) @ (cap_ratio * prior[row.indices])) + lower = float(np.minimum(row.data, 0.0) @ (cap_ratio * prior[row.indices])) + target_low, target_high = ( + target - tolerance * abs(target), + target + tolerance * abs(target), + ) + return { + "household_support": int(row.nnz), + "original_source_household_support": len(ids), + "positive_prior_household_support": int((prior[row.indices] > 0).sum()), + "source_contribution_ess": mass_sum**2 / squared if squared else 0.0, + "largest_source_contribution_share": float(mass.max() / mass_sum) + if mass_sum + else 0.0, + "cap_only_minimum": lower, + "cap_only_maximum": upper, + "fitted_estimate": float(contribution.sum()), + "target": float(target), + "tolerance": tolerance, + "row_capacity_can_intersect_tolerance": bool( + upper >= target_low and lower <= target_high + ), + "zero_support_positive_target": bool(row.nnz == 0 and target_low > 0), + } + + +def lp_probe( + matrix, + targets, + prior, + names, + selected_names, + tolerance=0.05, + cap_ratio=10.0, + time_limit=20.0, +): + selected_names = list(selected_names) + lookup = row_lookup(names) + missing = [name for name in selected_names if name not in lookup] + if missing: + raise ValueError(f"LP probe requested missing rows: {missing}") + indices = np.array([lookup[name] for name in selected_names], dtype=int) + a = sparse.csr_matrix(matrix[indices]) + b = targets[indices] + if (b < 0).any() or not np.isfinite(b).all(): + raise ValueError("These LP probes require finite nonnegative targets.") + a.sum_duplicates() + a.eliminate_zeros() + zero = np.flatnonzero(np.diff(a.indptr) == 0) + zero_positive = [selected_names[index] for index in zero if b[index] > 0] + result = { + "rows": selected_names, + "tolerance": tolerance, + "weight_bounds": f"0 <= weight <= {cap_ratio:g} * prior_weight", + "protected_rows_included": False, + "fixed_mass_constraint": False, + "zero_support_positive_rows": zero_positive, + "solver": "scipy.optimize.linprog(method=highs)", + "time_limit_seconds": time_limit, + } + if zero_positive: + return { + **result, + "status": "infeasible_by_zero_support", + "linprog_called": False, + } + # Solve in weight ratios and normalize rows to keep all count constraints near one. + active_columns = np.unique(a.indices) + active_columns = active_columns[prior[active_columns] > 0] + if not len(active_columns): + return { + **result, + "status": "feasible" if np.all(b == 0) else "infeasible_by_zero_capacity", + "linprog_called": False, + } + scales = np.maximum(np.abs(b), 1.0) + normalized = ( + a[:, active_columns] + .multiply(prior[active_columns]) + .multiply((1 / scales)[:, None]) + .tocsr() + ) + upper = (b + tolerance * np.abs(b)) / scales + lower = (b - tolerance * np.abs(b)) / scales + started = time.monotonic() + solution = linprog( + np.zeros(len(active_columns)), + A_ub=sparse.vstack([normalized, -normalized], format="csr"), + b_ub=np.concatenate([upper, -lower]), + bounds=(0.0, cap_ratio), + method="highs", + options={"time_limit": time_limit}, + ) + result.update( + linprog_called=True, + scipy_status=int(solution.status), + scipy_message=solution.message, + elapsed_seconds=time.monotonic() - started, + active_weight_columns=len(active_columns), + ) + if solution.status == 0: + estimates = np.asarray(normalized @ solution.x) * scales + residual = max( + float(np.max(lower - normalized @ solution.x)), + float(np.max(normalized @ solution.x - upper)), + 0.0, + ) + if ( + residual > 1e-6 + or solution.x.min() < -1e-6 + or solution.x.max() > cap_ratio + 1e-6 + ): + raise ValueError( + "Successful LP failed independent tolerance/bound verification." + ) + result.update( + status="feasible_for_named_rows_only", + normalized_constraint_violation=residual, + estimates={ + name: float(value) + for name, value in zip(selected_names, estimates, strict=True) + }, + ) + elif solution.status == 2: + result["status"] = "infeasible_for_named_rows_under_cap" + else: + result["status"] = "inconclusive" + return result + + +def supported_uc_probe(matrix, targets, prior, names, rows, tolerance=0.05): + excluded = [row["name"] for row in rows if row["zero_support_positive_target"]] + unexpected = [ + name for name in excluded if name.rsplit("@", 1)[0] not in KNOWN_ZERO_ROWS + ] + if unexpected: + return { + "status": "not_run_unexpected_zero_support", + "unexpected_zero_rows": unexpected, + "excluded_zero_rows": excluded, + "full_uc_probe": False, + } + selected = [ + row["name"].rsplit("@", 1)[0] for row in rows if row["name"] not in excluded + ] + result = lp_probe(matrix, targets, prior, names, selected, tolerance) + result.update( + excluded_zero_rows=excluded, + full_uc_probe=False, + interpretation="Diagnostic supported-row subset only. The full active UC roster remains infeasible when the named positive-target zero-support rows are included.", + ) + return result + + +def protected_subset_probe(matrix, targets, prior, names, tolerance=0.05): + obr = ["obr.income_tax", "obr.ni", "obr.state_pension", "obr.child_benefit"] + employment = [ + str(name).rsplit("@", 1)[0] + for name in names + if str(name).startswith( + ( + "hmrc/employment_income_income_band_", + "hmrc/employment_income_count_income_band_", + ) + ) + ] + if not employment: + raise ValueError( + "The protected diagnostic requires the named HMRC employment band rows." + ) + result = lp_probe( + matrix, targets, prior, names, [*BROAD, *obr, *employment], tolerance + ) + result.update( + protected_rows_included=True, + protected_rows=[*obr, *employment], + employment_scope="Explicit saved employment income/count band rows; no employment total or new aggregate target is invented.", + interpretation="Only the named broad UC, OBR and HMRC employment rows are constrained. This excludes the remaining UC and protected calibration rows.", + ) + return result + + +def signed_contrast(matrix, targets, names, fitted, prior, source_ids, tolerance=0.05): + component_names = [ + "dwp.uc.households_children_5_or_more", + "dwp.uc.two_child_limit.households_5_children", + "dwp.uc.two_child_limit.households_6_plus_children", + ] + lookup = row_lookup(names) + if any(name not in lookup for name in component_names): + raise ValueError( + "Reported-5+ minus TCL5/6+ contrast is missing a declared component row." + ) + indices = [lookup[name] for name in component_names] + row = sparse.csr_matrix( + matrix[indices[0] : indices[0] + 1] + - matrix[indices[1] : indices[1] + 1] + - matrix[indices[2] : indices[2] + 1] + ) + row.sum_duplicates() + row.eliminate_zeros() + signs = np.array([1.0, -1.0, -1.0]) + b = targets[indices] + target_difference = float(signs @ b) + interval_low = target_difference - tolerance * float(np.abs(b).sum()) + interval_high = target_difference + tolerance * float(np.abs(b).sum()) + support = row_support(row, fitted, prior, source_ids, target_difference, tolerance) + for key in ( + "target", + "tolerance", + "row_capacity_can_intersect_tolerance", + "zero_support_positive_target", + ): + support.pop(key) + _, ids, contributions = grouped_contributions(row, fitted, source_ids) + private = [] + for source, contribution in zip(ids, contributions, strict=True): + columns = np.flatnonzero(source_ids == source) + removed = row[:, columns] + cap_weights = 10 * prior[columns][removed.indices] + removed_upper = float(np.maximum(removed.data, 0.0) @ cap_weights) + removed_lower = float(np.minimum(removed.data, 0.0) @ cap_weights) + lower = support["cap_only_minimum"] - removed_lower + upper = support["cap_only_maximum"] - removed_upper + private.append( + { + "kind": "computational_contrast", + "source_household_id": int(source), + "descendant_household_count": len(columns), + "no_refit_contrast_contribution_loss": float(contribution), + "no_refit_contrast_estimate": support["fitted_estimate"] + - float(contribution), + "remaining_cap_only_minimum": lower, + "remaining_cap_only_maximum": upper, + "remaining_capacity_can_intersect_component_implied_interval": bool( + upper >= interval_low and lower <= interval_high + ), + } + ) + return { + "label": "reported_5plus_minus_TCL_5_minus_TCL_6plus", + "interpretation": "Computational contrast between different concepts/source windows, not a source joint, statistical identity or new target.", + "components": [ + { + "name": str(names[index]), + "coefficient": float(sign), + "optimizer_target_value": float(value), + } + for index, sign, value in zip(indices, signs, b, strict=True) + ], + "optimizer_target_difference": target_difference, + "component_tolerance": tolerance, + "optimizer_implied_contrast_interval": [interval_low, interval_high], + "interval_basis": f"Necessary contrast interval implied by allowing every original component its own {100 * tolerance:g}% tolerance; not {100 * tolerance:g}% of the difference.", + **support, + "one_source_supplies_all_nonzero_contrast_columns": len(ids) == 1, + "zero_contrast_excluded_by_component_implied_interval": not interval_low + <= 0 + <= interval_high, + "source_removals_failing_implied_interval_capacity": sum( + not r["remaining_capacity_can_intersect_component_implied_interval"] + for r in private + ), + "source_removal_capacity_ranges": { + "min_remaining_lower": min( + (r["remaining_cap_only_minimum"] for r in private), + default=support["cap_only_minimum"], + ), + "max_remaining_lower": max( + (r["remaining_cap_only_minimum"] for r in private), + default=support["cap_only_minimum"], + ), + "min_remaining_upper": min( + (r["remaining_cap_only_maximum"] for r in private), + default=support["cap_only_maximum"], + ), + "max_remaining_upper": max( + (r["remaining_cap_only_maximum"] for r in private), + default=support["cap_only_maximum"], + ), + }, + }, private + + +def _identity_vector(name, values): + # IDs are integers in the saved matrix producer. Do not coerce absent/string + # identities, NaN, fractional values or Boolean masks into source groups. + if values.dtype.kind not in "iu" or (values < 0).any(): + raise ValueError( + f"{name} must contain nonnegative integer IDs, with no missing or nonfinite values." + ) + + +def analyze(run_dir, output_dir, *, tolerance=0.05): + if not np.isfinite(tolerance) or not 0 < tolerance < 1: + raise ValueError("Tolerance must lie between zero and one.") + run_dir, output_dir = Path(run_dir), Path(output_dir) + receipt_path = run_dir / "receipt.json" + if not receipt_path.is_file(): + raise ValueError("A completed source receipt is required.") + receipt = json.loads(receipt_path.read_text()) + if not isinstance(receipt, dict): + raise ValueError("A completed source receipt must be a JSON object.") + paths = { + name: run_dir / name + for name in ("matrix.npz", "inputs_private.npz", "weights_private.npz") + } + hashes = {name: digest(path) for name, path in paths.items()} + for name, field in ( + ("matrix.npz", "matrix_sha256"), + ("inputs_private.npz", "inputs_private_sha256"), + ("weights_private.npz", "weights_private_sha256"), + ): + if receipt.get(field) != hashes[name]: + raise ValueError(f"Input {name} does not match its completed receipt.") + hashes["receipt.json"] = digest(receipt_path) + required = ( + "initial_weights", + "names", + "target_values", + "target_loss_weights", + "household_source_ids", + "target_families", + "household_ids", + ) + with np.load(paths["inputs_private.npz"], allow_pickle=False) as archive: + missing = sorted(set(required) - set(archive.files)) + if missing: + raise ValueError(f"Saved inputs are missing required arrays: {missing}") + z = {key: archive[key] for key in required} + with np.load(paths["weights_private.npz"], allow_pickle=False) as archive: + if "weights" not in archive.files: + raise ValueError("Saved weights are missing the weights array.") + fitted = archive["weights"] + if any(values.ndim != 1 for values in (*z.values(), fitted)): + raise ValueError("Saved arrays must be one-dimensional vectors.") + matrix = sparse.csr_matrix(sparse.load_npz(paths["matrix.npz"])) + prior = z["initial_weights"] + names = z["names"].astype(str) + targets = z["target_values"] + coefficients = z["target_loss_weights"] + source_ids = z["household_source_ids"] + families = z["target_families"].astype(str) + row_count, household_count = matrix.shape + if ( + any( + len(z[key]) != row_count + for key in ( + "names", + "target_values", + "target_loss_weights", + "target_families", + ) + ) + or any( + len(z[key]) != household_count + for key in ("initial_weights", "household_source_ids", "household_ids") + ) + or len(fitted) != household_count + ): + raise ValueError("Saved row/household/weight/source arrays are not aligned.") + _identity_vector("household_source_ids", source_ids) + _identity_vector("household_ids", z["household_ids"]) + if len(set(names)) != len(names) or len(set(z["household_ids"])) != len(prior): + raise ValueError("Matrix row names and household identities must be unique.") + if ( + not np.isfinite(coefficients).all() + or (coefficients < 0).any() + or coefficients.sum() <= 0 + ): + raise ValueError("Invalid target loss coefficient vector.") + if ( + not all(np.isfinite(x).all() for x in (prior, fitted, targets, matrix.data)) + or (prior < 0).any() + or (fitted < 0).any() + ): + raise ValueError( + "Matrix weights/targets must be finite; weights must be nonnegative." + ) + matrix.sum_duplicates() + matrix.eliminate_zeros() + all_estimates = np.asarray(matrix @ fitted) + base_loss = weighted_loss(all_estimates, targets, coefficients) + selected = np.flatnonzero(np.isin(families, list(UC_FAMILIES))) + rows = [] + private = [] + source_cache = {} + for index in selected: + row = matrix[index : index + 1] + record = { + "name": names[index], + "family": families[index], + "loss_coefficient": float(coefficients[index]), + **row_support(row, fitted, prior, source_ids, targets[index], tolerance), + } + record["relative_error"] = float( + (all_estimates[index] - targets[index]) / max(abs(targets[index]), 1.0) + ) + _, ids, contributions = grouped_contributions(row, fitted, source_ids) + if len(ids) < 5 or names[index].rsplit("@", 1)[0] in FIVE_PLUS: + removals = [] + for source_id, contribution in zip(ids, contributions, strict=True): + key = int(source_id) + if key not in source_cache: + descendants = np.flatnonzero(source_ids == source_id) + delta = np.asarray(matrix[:, descendants] @ fitted[descendants]) + after = all_estimates - delta + source_cache[key] = { + "source_household_id": key, + "descendant_household_count": len(descendants), + "no_refit_saved_roster_loss": weighted_loss( + after, targets, coefficients + ), + "no_refit_saved_roster_loss_delta": weighted_loss( + after, targets, coefficients + ) + - base_loss, + } + columns = np.flatnonzero(source_ids == source_id) + removed_row = row[:, columns] + removed_cap = float( + np.maximum(removed_row.data, 0.0) + @ (10 * prior[columns][removed_row.indices]) + ) + remaining_cap = record["cap_only_maximum"] - removed_cap + effect = { + **source_cache[key], + "target_name": names[index], + "no_refit_contribution_loss": float(contribution), + "no_refit_estimate": float(all_estimates[index] - contribution), + "no_refit_relative_error": float( + (all_estimates[index] - contribution - targets[index]) + / max(abs(targets[index]), 1.0) + ), + "remaining_cap_only_maximum": remaining_cap, + "remaining_cap_can_reach_lower_tolerance": bool( + remaining_cap >= (1 - tolerance) * targets[index] + ), + "interpretation": "Necessary individual-row capacity condition only; no refit and no protected-constraint feasibility claim.", + } + private.append(effect) + removals.append(effect) + record["source_removal_summary"] = { + "sources_checked": len(removals), + "source_removals_failing_remaining_cap": sum( + not r["remaining_cap_can_reach_lower_tolerance"] for r in removals + ), + "maximum_no_refit_contribution_loss": max( + (r["no_refit_contribution_loss"] for r in removals), default=0.0 + ), + "minimum_remaining_cap_only_maximum": min( + (r["remaining_cap_only_maximum"] for r in removals), + default=record["cap_only_maximum"], + ), + } + rows.append(record) + contrast, contrast_private = signed_contrast( + matrix, targets, names, fitted, prior, source_ids, tolerance + ) + for action in contrast_private: + action.update(source_cache[action["source_household_id"]]) + private.extend(contrast_private) + tolerance_label = f"{100 * tolerance:g}pct" + probes = { + f"{label}_{tolerance_label}": lp_probe( + matrix, targets, prior, names, requested, tolerance + ) + for label, requested in { + "broad_total": BROAD[:1], + "broad_total_and_family": BROAD[:5], + "broad_total_and_child_counts": [BROAD[0], *BROAD[5:]], + "broad_total_family_and_child_counts": BROAD, + }.items() + } + probes[f"supported_uc_rows_excluding_named_zero_cells_{tolerance_label}"] = ( + supported_uc_probe(matrix, targets, prior, names, rows, tolerance) + ) + probes[f"broad_counts_and_named_protected_rows_{tolerance_label}"] = ( + protected_subset_probe(matrix, targets, prior, names, tolerance) + ) + zero = [r["name"] for r in rows if r["zero_support_positive_target"]] + cap_fail = [ + r["name"] for r in rows if not r["row_capacity_can_intersect_tolerance"] + ] + report = { + "status": "completed_receipted_run", + "run_label": run_dir.name, + "input_sha256": hashes, + "script_sha256": digest(__file__), + "versions": { + "python": platform.python_version(), + "numpy": np.__version__, + "scipy": scipy.__version__, + }, + "controls": { + "saved_row_count": len(names), + "household_count": len(prior), + "original_source_household_count": len(np.unique(source_ids)), + "weight_cap_ratio": 10.0, + "tolerance": tolerance, + "solver_coefficients": "saved unchanged; no new Adam optimization", + "fitted_weight_cap_exceedance_count": int( + (fitted > 10 * prior + 1e-8).sum() + ), + "source_ess_definition": "Square of total absolute source-group contribution divided by sum of squared source-group contributions; clones are grouped before the calculation.", + "saved_roster_capped_weighted_mape": base_loss, + }, + "limitations": [ + "Every LP constrains only its explicitly named rows and cap. The protected subset adds four OBR and the saved HMRC employment bands, but excludes all other protected outcomes. No fixed-mass constraint is imposed.", + "Saved target semantics are preserved; this tool does not relabel their source population or observation window.", + "Zero-support rows remain listed in the full UC diagnostic. No source is deleted from the observed matrix.", + "No-refit removals set all descendants of one source household to zero; other fitted weights stay unchanged.", + ], + "full_uc_necessary_conditions": { + "rows": len(rows), + "zero_support_positive_rows": zero, + "rows_failing_cap_capacity": cap_fail, + "can_satisfy_all_uc_rows_at_tolerance": False + if cap_fail + else "not_established_by_individual_row_checks", + }, + "rows": rows, + "lp_probes": probes, + "computational_contrast": contrast, + } + for name, path in paths.items(): + if digest(path) != hashes[name]: + raise ValueError(f"Input changed during postprocessing: {name}") + if digest(receipt_path) != hashes["receipt.json"]: + raise ValueError("Completed input receipt changed during postprocessing.") + output_dir.mkdir(parents=True, exist_ok=False, mode=0o700) + (output_dir / "aggregate_support_report.json").write_text( + json.dumps(report, indent=2, allow_nan=False) + "\n" + ) + (output_dir / "source_group_influence_private.json").write_text( + json.dumps(private, indent=2, allow_nan=False) + "\n" + ) + summary = [ + f"# Matrix support and capacity: {run_dir.name}", + "", + f"Status: {report['status']}. No weight refit or population-engine run.", + "", + f"{len(rows)} UC/TCL rows; {len(zero)} have no household support despite a positive target; {len(cap_fail)} fail the individual-row 10×prior capacity bound at {100 * tolerance:g}% tolerance.", + "", + f"LP checks use only their explicitly named rows, with 0–10×prior weights and {100 * tolerance:g}% tolerance:", + "", + ] + summary.extend(f"- {label}: {probe['status']}." for label, probe in probes.items()) + summary.extend( + [ + "", + "A feasible subset does not establish full-roster feasibility. The protected subset includes only four named OBR rows and the saved HMRC employment bands. Any exclusions from the supported-UC probe are listed explicitly. A positive-target zero-support row prevents full-UC feasibility. Source identities and individual-source removals are private.", + "", + "Five-plus child rows:", + "", + ] + ) + summary.extend( + f"- {r['name']}: {r['household_support']} household rows / {r['original_source_household_support']} original source households; source ESS {r['source_contribution_ess']:.2f}; largest source share {r['largest_source_contribution_share']:.1%}; fitted {r['fitted_estimate']:,.1f} versus target {r['target']:,.1f}; cap-only maximum {r['cap_only_maximum']:,.1f}." + for r in rows + if r["name"].rsplit("@", 1)[0] in FIVE_PLUS + ) + summary.extend( + [ + "", + "Computational reported-5+ minus TCL5 minus TCL6+ contrast:", + "", + f"{contrast['household_support']} household rows / {contrast['original_source_household_support']} original source households; source ESS {contrast['source_contribution_ess']:.2f}; largest source share {contrast['largest_source_contribution_share']:.1%}. Fitted contrast {contrast['fitted_estimate']:,.1f}; optimizer target difference {contrast['optimizer_target_difference']:,.1f}. The three component tolerances imply contrast interval [{contrast['optimizer_implied_contrast_interval'][0]:,.1f}, {contrast['optimizer_implied_contrast_interval'][1]:,.1f}].", + f"One original source supplies all nonzero contrast columns: {contrast['one_source_supplies_all_nonzero_contrast_columns']}. Removing a source fails the remaining signed-capacity condition in {contrast['source_removals_failing_implied_interval_capacity']} cases.", + "These rows describe different concepts and windows; the subtraction explains optimizer algebra only, not an administrative statistical identity.", + ] + ) + (output_dir / "aggregate_support_report.md").write_text("\n".join(summary) + "\n") + return { + "rows": len(rows), + "zero_rows": len(zero), + "cap_fail_rows": len(cap_fail), + "lp_status": {k: v["status"] for k, v in probes.items()}, + "private_source_interventions": len(private), + } + + +def main(argv=None): + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--run-dir", type=Path, required=True) + p.add_argument("--output-dir", type=Path, required=True) + p.add_argument("--tolerance", type=float, default=0.05) + a = p.parse_args(argv) + if not 0 < a.tolerance < 1: + raise ValueError("Tolerance must lie between zero and one.") + import os + + os.umask(0o077) + print(json.dumps(analyze(a.run_dir, a.output_dir, tolerance=a.tolerance), indent=2)) + + +if __name__ == "__main__": + main()