From 6211ee6f94d0b311060aba600229bc3763003d23 Mon Sep 17 00:00:00 2001 From: Maria Juaristi Date: Wed, 14 Oct 2026 18:59:24 +0100 Subject: [PATCH 1/2] Draw SPI-channel incomes at the FRS twin's conditional rank (#840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Stage 17 (hmrc_spi_income_spine) drew every SPI-channel claimant's and partner's income leaves from the SPI tape conditioned on age, gender and region only, at the model's random numbers. The FRS twin's own incomes, and the relation between family composition and income they carry, were discarded: half the lone-parent UC mass sat on SPI copies drawn as taxpayers, SPI lone parents passed the award screen at about half the FRS rate, and SPI employment status disagreed with the drawn income (uk-data#529). Bridge predictors. The tape forest now conditions on four facts about a record's income that the tape and the twin each carry: main_source (the largest of pay, pension and trade) and has_pay from the same leaf formulas on both sides; has_trade and at_or_over_spa from the tape's published indicator codes (SEINC_NUM, SPA; the leaf formulas serve a composite record without codes) and, on the twin, its trade leaf or self-employed status and its age against State Pension age. The read requires the three code columns and refuses unknown codes by name; the published MAINSRCE code validates the leaf-defined main source (0.969 of the classified weight on the full 2022-23 tape with the stage's preparation; floor 0.95) and the receipt reports each indicator code against its leaf both ways. Twin-conditional draw. Reference forests fitted on the FRS base claimants and partners with the same predictors and chain order locate each twin's observed leaves (FittedRegimeGatedQRF.conditional_uniforms, a Rosenblatt transform: the sign uniform in the gate's cumulative class probabilities, the quantile on the sign's magnitude forest through the new _Forest.quantile_positions, the inverse of its draw), and the tape forest draws at those uniforms through predict_from_uniforms. The reference is cross-fitted in five folds keyed on the predictor cell, so the forest locating a copy never saw its twin (an in-sample forest holds the row's own value as an atom that took a median 0.23 to 0.74 of the conditional's mass under the weighted bootstrap and kept under half of the twin's rank). Leaves without an FRS analogue, and the placements inside a class or a flat stretch, take uniforms keyed on person_source_id, so stage 1 consumes no model random stream. A full build refuses a reference the cells cannot cross-fit (only a sampled rung or a synthetic fixture may locate in-sample, and its receipt says so), a recipient whose fold differs from its twin's, a frame without person_source_id, and a located target whose reference sign classes differ from the tape forest's (FittedRegimeGatedQRF.sign_classes). No-record rule. A twin with no taxable income (no pay, trade or pension, and at most £1,000 of taxable interest, dividends, property and miscellaneous income together) has no tax record for the tape to condition on; its copy keeps the twin's values at stage 1 and stage 2. Reserved band carriers are always drawn. Stage 2, the band-donor resample, the uprating and the SPA guard are unchanged. Integration with #1145 and #1200. The restricted finance costs leaf reaches the FRS rows only at property_components, so it takes identity-keyed uniforms. The stage writes person_is_spi_income_recipient, True exactly for the rows it drew, as its last new column; the landlord stage reads it to tell tape-concept rows from FRS-concept ones (its graph node declares the read, with a test that the declaration covers the stage's inputs), so an undrawn copy keeps its twin's property income on the FRS concept. The UC gainful self-employment refresh on drawn rows takes the root's whole rule, undrawn copies keep their twin's flag, and the evidence counts the rows each route flags. Surfaces. The manifest declares the bridge, the recipient income rule, the draw, the reference model and the identity uniforms; spi_spine pins them with drift asserts; the stage evidence carries the bridge-validation receipt and the per-target transport receipt (analogue, FRS regime and sign classes, uniform source, Kolmogorov distance from uniform overall and by main source; a positive-row count under the group floor is withheld, and the counts stay with the build). Regenerated: the schema, the source_stages mirror, the coverage manifest, the UK spine parity fixture, the spec loader's golden hash, the fit.qrf parity pins, the US spec-engine inventory digests, coverage report and the multispine pool tool's spec-hash pin (the fit kernel's source hash moved), and the gate-battery vintage and release_cut pins in the data contract (the terminal-gate allow-list gained the flag). Tests: fit (round trip, uniformity, two-population transport, zero-class carry, chunked equality, sign classes, refusals); engine-free UK (bridge and code refusal with disagreeing codes, no-record rule, analogue map, transport, cell folds, cross-fit hold-out, in-sample and twin-fold and sign-class refusals, spine drift pins, graph reads); engine-side UK (identity-keyed rewrites, fit records, the recipient flag and the refresh receipt). The engine-free, engine-uk and engine-us job lists passed locally before the final rebase onto main; the parity, pin and targeted files after it. Co-Authored-By: Claude Fable 5.1 --- .../840-spi-twin-conditional-draw.changed.md | 1 + docs/evidence/spec-engine/us-f0-coverage.json | 16 +- docs/uk-income-anchors-280.md | 92 + .../build/spec_engine/inventory_coverage.py | 4 +- .../spec_engine/schema/sources.schema.json | 130 ++ .../src/microcosm/build/uk/gates.json | 1 + .../uk/release_input_coverage_manifest.json | 36 +- .../src/microcosm/build/uk/source_stages.json | 91 +- .../src/microcosm/build/uk/spec/sources.yaml | 70 +- .../src/microcosm/build/uk_runtime/graph.py | 12 +- .../build/uk_runtime/hmrc_source_contract.py | 6 +- .../build/uk_runtime/property_components.py | 57 +- .../microcosm/build/uk_runtime/spi_income.py | 626 ++++++- .../build/uk_runtime/spi_rank_transport.py | 668 ++++++++ .../microcosm/build/uk_runtime/spi_spine.py | 106 +- .../build/uk_runtime/terminal_gates.py | 1 + .../tests/engine/uk/test_uk_spi_income.py | 309 +++- .../uk/test_uk_spi_state_pension_age.py | 9 +- .../shared/test_spec_engine_loader.py | 2 +- .../tests/engine_free/uk/test_uk_graph.py | 16 + .../uk/test_uk_property_components.py | 1 + .../engine_free/uk/test_uk_source_stages.py | 5 + .../engine_free/uk/test_uk_spi_band_donors.py | 5 + .../engine_free/uk/test_uk_spi_income.py | 307 +++- .../engine_free/uk/test_uk_spi_pension_age.py | 21 +- .../uk/test_uk_spi_rank_transport.py | 544 ++++++ .../tests/engine_free/uk/test_uk_spi_spine.py | 50 +- .../us/test_us_multispine_pool_tool.py | 2 +- .../src/microcosm/data/contract.py | 10 +- .../tests/engine_free/shared/test_contract.py | 6 +- .../src/microcosm/fit/__init__.py | 2 + .../microcosm-fit/src/microcosm/fit/qrf.py | 393 ++++- .../engine_free/shared/test_qrf_stateless.py | 260 +++ .../fixtures/parity/kernels/fit.qrf/pins.json | 2 +- .../sources/cgt_asset_type_facts.json | 56 +- .../parity/uk_spine/sources/fixture.json | 87 +- .../sources/property_rental_facts.json | 68 +- .../parity/uk_spine/sources/spi_donor.csv | 1486 ++++++++--------- .../fixtures/parity/uk_spine/uk_spine.json | 2 +- test_support/microcosm_build/uk_spi_income.py | 58 + tools/graph_uk_spine_fixture.py | 41 + 41 files changed, 4621 insertions(+), 1038 deletions(-) create mode 100644 changelog.d/840-spi-twin-conditional-draw.changed.md create mode 100644 packages/microcosm-build/src/microcosm/build/uk_runtime/spi_rank_transport.py create mode 100644 packages/microcosm-build/tests/engine_free/uk/test_uk_spi_rank_transport.py diff --git a/changelog.d/840-spi-twin-conditional-draw.changed.md b/changelog.d/840-spi-twin-conditional-draw.changed.md new file mode 100644 index 0000000000..8ee39b461e --- /dev/null +++ b/changelog.d/840-spi-twin-conditional-draw.changed.md @@ -0,0 +1 @@ +The UK SPI income stage (`hmrc_spi_income_spine`) now conditions its tape forest on four bridge facts (main source, pay, trade pages, State Pension age) and draws each SPI-channel recipient's income leaves at the position its FRS twin holds among FRS people like it, located on cross-fitted FRS reference forests (`FittedRegimeGatedQRF.conditional_uniforms`, the inverse of `predict_from_uniforms`), with identity-keyed uniforms where the twin has no analogue; a twin with no taxable income keeps its values, and the stage flags the rows it drew for the landlord stage (microcosm#840, uk-data#529). The method, the receipts and the no-record rule are described in `docs/uk-income-anchors-280.md` under "The SPI draw follows the twin". diff --git a/docs/evidence/spec-engine/us-f0-coverage.json b/docs/evidence/spec-engine/us-f0-coverage.json index e04a5d0d0a..b9fd5f2707 100644 --- a/docs/evidence/spec-engine/us-f0-coverage.json +++ b/docs/evidence/spec-engine/us-f0-coverage.json @@ -1656,13 +1656,13 @@ "compiler_ir.node_slices" ], "expected": { - "map_sha256": "1efa1551b0711e69fd89e5fbfa00384a209a158989bcc830b594b93a1c5a71fc", - "protocol_sha256": "73cd2b524a057e74620e48072edaf192d158e29b6358c6ff59af6eeac46a4269" + "map_sha256": "158e0a7fb281ca879094bd3bfd226c790a92fb9bde45dab7343ad2cd62d28440", + "protocol_sha256": "e1cf6b795f88a070ca43259857a77ecc7bfcda127fadc4bd45bea44315aef09b" }, "failures": [], "observed": { - "map_sha256": "1efa1551b0711e69fd89e5fbfa00384a209a158989bcc830b594b93a1c5a71fc", - "protocol_sha256": "73cd2b524a057e74620e48072edaf192d158e29b6358c6ff59af6eeac46a4269" + "map_sha256": "158e0a7fb281ca879094bd3bfd226c790a92fb9bde45dab7343ad2cd62d28440", + "protocol_sha256": "e1cf6b795f88a070ca43259857a77ecc7bfcda127fadc4bd45bea44315aef09b" }, "status": "covered" }, @@ -1677,7 +1677,7 @@ "compiler_ir.seed_stream_map" ], "expected": { - "implementation_sha256": "73cd2b524a057e74620e48072edaf192d158e29b6358c6ff59af6eeac46a4269", + "implementation_sha256": "e1cf6b795f88a070ca43259857a77ecc7bfcda127fadc4bd45bea44315aef09b", "protocol": "legacy-v1", "streams": [ "build_model", @@ -1698,7 +1698,7 @@ }, "failures": [], "observed": { - "implementation_sha256": "73cd2b524a057e74620e48072edaf192d158e29b6358c6ff59af6eeac46a4269", + "implementation_sha256": "e1cf6b795f88a070ca43259857a77ecc7bfcda127fadc4bd45bea44315aef09b", "protocol": "legacy-v1", "streams": [ "build_model", @@ -2599,7 +2599,7 @@ "country": "us", "schema_id": "country_spec", "schema_version": 1, - "spec_sha256": "4d08ff77d2118ec4f7d63fcf17983f774b9d1142b0b8308bfdc30767ece76f1f" + "spec_sha256": "6338821db4619b1443f8790469d289cf3aa292ab10b66932b70786aabb2308d3" } }, "report_schema_version": 3, @@ -2609,7 +2609,7 @@ "country": "us", "schema_id": "country_spec", "schema_version": 1, - "spec_sha256": "4d08ff77d2118ec4f7d63fcf17983f774b9d1142b0b8308bfdc30767ece76f1f" + "spec_sha256": "6338821db4619b1443f8790469d289cf3aa292ab10b66932b70786aabb2308d3" }, "status": "pass" } diff --git a/docs/uk-income-anchors-280.md b/docs/uk-income-anchors-280.md index bf0997193b..e2ad0e9ea2 100644 --- a/docs/uk-income-anchors-280.md +++ b/docs/uk-income-anchors-280.md @@ -331,6 +331,98 @@ matching 0.328) and four or more bedrooms (0.456 against 0.557; matching 0.355), with the most distinct bundles. All three under-draw council tax band F and above at the top (about 0.19 against 0.35). +## The SPI draw follows the twin (microcosm#840) + +Until microcosm#840 the stage-1 tape forest conditioned on age, gender and +region alone and drew each recipient's quantile from the model's random +stream, so a copied lone parent on a low wage drew the pay of a random +taxpayer of her age, gender and region, and a copied adult out of work drew +pay at all. The SPI copies then passed the Universal Credit award screen at +about half the rate of the FRS rows they were copied from, and their +employment status disagreed with their drawn incomes (uk-data#529). + +The stage now does two things with the twin's own leaves. First, four bridge +predictors join age, gender and region: `main_source` (the largest of pay, +pension and trade) and `has_pay`, which the tape and the twin derive by the +same formula from their own leaves, and `has_trade` and `at_or_over_spa`, +which the tape takes from its published indicator codes (SEINC_NUM, the +self-employment pages filed, and SPA; the leaf formulas serve only a +composite record without codes) and the twin from its trade leaf or +self-employed status and its age against State Pension age. The published +MAINSRCE code validates the leaf-defined main source (0.969 of the classified +weight on the full 2022-23 tape with the stage's preparation: pay 0.983, +occupational pension 0.987, sole trader 0.851, partnership 0.744, other 0.916; +the floor is 0.95) and the receipt reports each indicator code against its +leaf both ways. An employee therefore draws from earners and a pensioner from +pensioners. + +Second, the quantile is the twin's. Reference forests fitted on the FRS base +claimants and partners, with the same predictors and chain order and the FRS +analogue of every tape leaf as their targets, locate each twin's observed +leaves on the FRS conditional (`conditional_uniforms`, a Rosenblatt +transform: the sign uniform is the twin's position in the gate's cumulative +class probabilities, the quantile its position on the sign's magnitude forest, +each leaf chained on the twin's observed earlier leaves), and the tape forest +draws at those uniforms. The copy receives the SPI income of someone in the +same position among SPI people like it as the twin holds among FRS people +like it: the FRS relation between composition and income rank is kept, the +SPI levels and tail are imported. Leaves without an FRS analogue, and the +placements inside a class or a flat stretch of a conditional, take uniforms +keyed on the recipient's identity, so no model random stream is consumed and +a draw depends on the twin and the identity alone. The reference forests are +cross-fitted in five folds keyed on the predictor cell (gender, region, +whole-year age and the four bridge predictors): a forest's conditional at a +row it was trained on holds that row's own value as an atom, and under the +weighted bootstrap a twin's own value took a median 0.23 (pay) to 0.74 +(dividends) of its conditional's mass on the 2024-25 spine, so an in-sample +location was mostly the random placement inside that atom; with a copy +sharing its twin's cell, the forest that locates it never saw the twin, and +every row of a cell is located by one forest, so the located quantiles stay +monotone in the twin's value within the cell. A full build refuses a +reference the cells cannot cross-fit (only a sampled rung or a synthetic +fixture may locate in-sample, and its receipt says so), a recipient whose +fold differs from its twin's, and a reference whose sign classes differ from +the tape forest's on any located target. One difference between the two +forests remains: the reference locates a leaf given the twin's observed +earlier analogue leaves, while the tape forest draws it given every earlier +output, the three identity-uniform leaves (`other_investment_income`, +`gift_aid`, `charitable_investment_gifts`) included, so a located quantile is +read off a conditional those identity draws also shape; pay, which follows +them in the chain, has the weakest rank fidelity, and moving the analogue +targets ahead of the identity leaves is the follow-up to measure. Because the +located quantile is deterministic given the twin, copies of one twin that the +band-donor stage stacks now share every stage-1 draw, not only the +identity-keyed ones. The manifest declares the bridge, the analogue map and +the reference model (seed 45, the stage seed plus three; five folds), and the +stage evidence carries the per-target transport receipt: the analogue, the +FRS regime and sign classes, the uniform source and the Kolmogorov distance +of the uniforms from U[0,1), overall and by main source. The counts in the +stage evidence stay with the build; the published receipts carry shares. + +A twin with no taxable income (no pay, trade or pension, and at most £1,000 of +taxable interest, dividends, property and miscellaneous income together) has +no income tax record, so the tape holds no population to condition on; its +copy keeps the twin's values at stage 1 and stage 2, and the recipient-domain +receipt counts the rows and weight so kept. Reserved band carriers are always +drawn, since their leaves come from the band pools. A twin whose only record +is the State Pension counts as having one and is drawn against a tape that +mostly holds taxpayers, which can lift its pension leaves. FRS rows are +byte-unchanged. + +**After the rebase onto #1145 and #1200.** The restricted finance costs +(`property_finance_costs`, the last stage-1 target) reach the FRS rows only +at `property_components`, after this stage, so the twin has no analogue and +the leaf takes identity-keyed uniforms. The stage now flags the rows it drew +(`person_is_spi_income_recipient`: the claimants and partners aged 16 and over +with taxable income, and the reserved band carriers), and `property_components` +reads the flag to tell tape-concept rows from FRS-concept ones: an undrawn copy +keeps its twin's property income on the FRS concept, with the sublet split and +the imputed finance costs its twin gets, instead of being read as a tape draw. +The UC gainful self-employment refresh on drawn rows takes the root's whole +rule, the self-employed main job as well as the earnings route, since +`has_trade` now conditions the draw; undrawn copies keep their twin's flag. +The stage evidence counts the rows each route flags. + ## The gas connection `lcfs_consumption` imposes each region's published gas-connected share (DESNZ diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py b/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py index 7e1b6e05f1..7c9b396f48 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/inventory_coverage.py @@ -364,8 +364,8 @@ # both again: the protocol attests microcosm.calibrate.solve. microcosm#1124 # moves both once more: solve gains the opt-in retain_best_objective, off # by default, so no US solve, RNG rule or QRF target changes. - "seed_map": "1efa1551b0711e69fd89e5fbfa00384a209a158989bcc830b594b93a1c5a71fc", - "seed_protocol": "73cd2b524a057e74620e48072edaf192d158e29b6358c6ff59af6eeac46a4269", + "seed_map": "158e0a7fb281ca879094bd3bfd226c790a92fb9bde45dab7343ad2cd62d28440", + "seed_protocol": "e1cf6b795f88a070ca43259857a77ecc7bfcda127fadc4bd45bea44315aef09b", "source_manifest": "f4f8bfeb79268a4043a843b47cec1d1c0e58e9f5dd6bc23417ada95446dd7b8e", "take_up": "9522ce40f7dea569312dd7a7beb474e5a5afadd2f1e10cb5876534c3ef623d35", "tail": "ac92829c88a1a4fb6460d61190918d5d99c6c377fc8dd8f62f02b332d09bf59c", diff --git a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json index 08b1a3ca82..c1a7541749 100644 --- a/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json +++ b/packages/microcosm-build/src/microcosm/build/spec_engine/schema/sources.schema.json @@ -7732,6 +7732,136 @@ "recipient_role_column": { "type": "string" }, + "bridge_predictors": { + "type": "object", + "minProperties": 1, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "tape", + "twin", + "validation" + ], + "properties": { + "tape": { + "type": "string" + }, + "twin": { + "type": "string" + }, + "validation": { + "type": "string" + } + } + } + }, + "recipient_income_rule": { + "type": "object", + "additionalProperties": false, + "required": [ + "drawn", + "undrawn", + "unearned_income_floor_gbp" + ], + "properties": { + "drawn": { + "type": "string" + }, + "undrawn": { + "type": "string" + }, + "unearned_income_floor_gbp": { + "type": "number" + } + } + }, + "draw": { + "type": "string" + }, + "reference_model": { + "type": "object", + "additionalProperties": false, + "required": [ + "population", + "predictors", + "targets", + "analogue_columns", + "weight", + "weight_mapping", + "fit_weight_kind", + "seed", + "method", + "receipt" + ], + "properties": { + "population": { + "type": "string" + }, + "predictors": { + "type": "string" + }, + "targets": { + "type": "string" + }, + "analogue_columns": { + "type": "object", + "additionalProperties": { + "type": [ + "string", + "null" + ] + } + }, + "weight": { + "type": "string" + }, + "weight_mapping": { + "type": "string" + }, + "fit_weight_kind": { + "type": "string" + }, + "seed": { + "type": "integer" + }, + "n_estimators": { + "type": "integer" + }, + "folds": { + "type": "integer" + }, + "fold_key": { + "type": "string" + }, + "method": { + "type": "string" + }, + "receipt": { + "type": "string" + } + } + }, + "identity_uniforms": { + "type": "object", + "additionalProperties": false, + "required": [ + "key", + "salt", + "seed" + ], + "properties": { + "key": { + "type": "string" + }, + "salt": { + "type": "string" + }, + "seed": { + "type": "integer" + } + } + }, "rebase_income_to_build_period": { "type": "boolean" }, diff --git a/packages/microcosm-build/src/microcosm/build/uk/gates.json b/packages/microcosm-build/src/microcosm/build/uk/gates.json index 93aa4c2da2..fe09bb0587 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/gates.json +++ b/packages/microcosm-build/src/microcosm/build/uk/gates.json @@ -1031,6 +1031,7 @@ "person.would_claim_marriage_allowance", "person.would_claim_scp", "person.person_is_spi_income_band_carrier", + "person.person_is_spi_income_recipient", "benunit.benunit_source_id", "benunit.benunit_support_channel", "benunit.benunit_support_clone_index", diff --git a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json index 721c923e1e..3b8b2ee243 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json +++ b/packages/microcosm-build/src/microcosm/build/uk/release_input_coverage_manifest.json @@ -470,7 +470,7 @@ "required_mass_change_reason": "Capital-gains incidence anchor moves the mass of non-liable clone households back to their paired originals until the sub-exempt and loss-making clone mass match the Advani-Summers reporter composition at the redrawn liable mass; every pair's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, the HMRC Table 3 redrawn gains on the spine and Advani-Summers capital-gains incidence" @@ -493,7 +493,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Advani and Summers (2020), Capital Gains and UK Inequality, CAGE Working Paper 465", "survey": "Family Resources Survey 2024-25, SPI synthetic support, and Advani-Summers capital-gains incidence" @@ -516,7 +516,7 @@ "required_mass_change_reason": "Capital-gains residential split divides every household carrying liable gainers into arms weighted by the solved residential probabilities, one arm per subset of residential gainers; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative) on the amounts the Table 3 redraw placed" @@ -538,7 +538,7 @@ "required_mass_change_reason": "Capital-gains support split divides the wealthiest households of each HMRC Table 3 income band into light copies at equal weight; every household's mass and the total household mass are conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "HMRC Capital Gains Tax statistics, July 2026 release, Table 3 for 2024-25, via the vendored conditioning facts", "survey": "Family Resources Survey 2024-25, SPI synthetic support and HMRC Capital Gains Tax statistics Table 3 (2024-25 individuals by size of gain and taxable income)" @@ -567,7 +567,7 @@ "required_mass_change_reason": "ETB public-services imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab, DfT rail fare index, and public NHS activity/cost table.", "survey": "Effects of Taxes and Benefits 1977-2024 and NHS age-gender public table" @@ -587,7 +587,7 @@ "required_mass_change_reason": "ETB VAT expenditure-rate imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "UK Data Service SN 8856 Effects of Taxes and Benefits household tab and cited VAT anchor resource.", "survey": "Effects of Taxes and Benefits 1977-2024" @@ -608,7 +608,7 @@ "required_mass_change_reason": "CGT asset-type assignment on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "https://www.gov.uk/government/statistics/capital-gains-tax-statistics", "survey": "HMRC Capital Gains Tax statistics 2026 release, Table 8 (UK residential property disposals, 2024-25, administrative), Table 4.1 (individuals claiming Business Asset Disposal Relief or Investors' Relief by band of qualifying gain, 2024-25, administrative) and Table 7 (disposals, proceeds and gains by asset type, 2023-24, sample-based), vendored from the pinned Chronicle feed" @@ -632,7 +632,7 @@ "capital_gains" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "conditioning_resource": "hmrc_cgt_conditioning_facts.json", "conditioning_resource_sha256": "417d662bb58a25db06dcd542a83553a6775bbc12a7c3a995f695b091483215ed", @@ -721,7 +721,7 @@ "full_frs_tei_band_unavailable" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "hmrc_surface": "2023-24", "mapped_build_period": "2024", @@ -763,7 +763,7 @@ "required_mass_change_reason": "LCFS consumption imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "UK Data Service SN 9603 Living Costs and Food Survey 2024-25 (2nd edition) household/person tabs and the vendored Chronicle facts for NEED 2024 mean kWh, DESNZ Energy Trends and QEP average prices paid for calendar 2024, road-fuel outturn (DESNZ, HMRC, ONS Consumer Trends) and road fuel by vehicle type (DESNZ), ONS Consumer Trends household spending by COICOP division, the DfT VEH1103 licensed-car stock, NTS bus use, and the DfT and devolved bus finance tables and fares indices.", "survey": "Living Costs and Food Survey 2024-25" @@ -789,7 +789,7 @@ "required_mass_change_reason": "NTS bus-travel imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Department for Transport National Travel Survey, UK Data Service SN 5340 (End User Licence, 19th edition, November 2025), DOI 10.5255/UKDA-SN-5340-19; local licensed tab files (household, individual, trip); England residents only from 2013.", "survey": "National Travel Survey 2002-2024" @@ -812,7 +812,7 @@ "property_finance_costs" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "https://www.gov.uk/government/statistics/property-rental-income-statistics", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Property Rental Income Statistics 2026 (tax year 2024-25)" @@ -836,7 +836,7 @@ "non_residential_property_value" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "MHCLG dwellings and ONS UK House Price Index December 2025 regional average prices.", "survey": "Public regional property reference" @@ -863,7 +863,7 @@ "employment_income" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "HMRC, Salary sacrifice reform for pension contributions effective from 6 April 2029", "survey": "Family Resources Survey 2024-25 salary-sacrifice respondents and HMRC salary-sacrifice reform analysis" @@ -896,7 +896,7 @@ "household_source_id" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Reserved SPI support households for the HMRC Table 2.5 total-income bands from GBP 200,000, stacked at the published band taxpayer count over the donors per band (PolicyEngine/chronicle#280 lane).", "survey": "Survey of Personal Incomes Public Use Tape 2022-23 and HMRC Income Tax liabilities statistics July 2026 Table 2.5" @@ -918,7 +918,7 @@ "student_loan_plan" ], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Explore Education Statistics Table 6a, Higher education total", "survey": "Family Resources Survey 2024-25 and Student Loans Company borrower forecasts for England" @@ -940,7 +940,7 @@ "required_mass_change_reason": "WAS Lifetime ISA imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed round-8 person and household tabs (interviews April 2020 to March 2022, Great Britain).", "survey": "Wealth and Assets Survey round 8" @@ -975,7 +975,7 @@ "required_mass_change_reason": "WAS wealth imputation on the source spine: household weights pass through unchanged and total household mass is conserved.", "rewrites": [], "source_manifest": "source_stages.json", - "source_manifest_sha256": "add54fa97a65173f48f652f111f7fc3ad41982e0a124fb9262406f275e3bc0c4", + "source_manifest_sha256": "cf48c60759e39bc322dc646360caf46eeb797b157cfd0a02066a95a34380b851", "source_vintages": { "source": "Office for National Statistics Wealth and Assets Survey, UK Data Service SN 7215, DOI 10.5255/UKDA-SN-7215-20; local licensed 2006-22 household tab.", "survey": "Wealth and Assets Survey round 8" diff --git a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json index 824ccd6731..f38d43f2c8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/source_stages.json +++ b/packages/microcosm-build/src/microcosm/build/uk/source_stages.json @@ -1675,7 +1675,10 @@ "TAX_CRED", "TEI", "TII", - "TI" + "TI", + "MAINSRCE", + "SEINC_NUM", + "SPA" ], "runtime_sha256_required": true, "fail_on_missing_file": true, @@ -1722,12 +1725,85 @@ "predictors": [ "age", "gender", - "region" + "region", + "main_source", + "has_pay", + "has_trade", + "at_or_over_spa" ], "categorical_predictors": [ "gender", - "region" + "region", + "main_source" ], + "bridge_predictors": { + "main_source": { + "tape": "largest of employment_income (PAY + EPB + TAXTERM), private_pension_income + hmrc_spi_state_pension_income (PENSION + SRP) and self_employment_income (max(0, PROFITS - CAPALL - LOSSBF)); other when none is positive", + "twin": "largest of employment_income, private_pension_income + state_pension_reported and self_employment_income; other when none is positive", + "validation": "weighted agreement with the published MAINSRCE code (1 pay; 2 occupational pension; 3 sole trader and 4 partnership, trade; 5 other and 6 claims case, other) at least 0.95 over the classified records, reported by code; composites (-1) carry no code" + }, + "has_pay": { + "tape": "employment_income > 0", + "twin": "employment_income > 0", + "validation": "PAY > 0 share among MAINSRCE 1" + }, + "has_trade": { + "tape": "SEINC_NUM = 1 (self-employment or partnership pages); composites self_employment_income > 0", + "twin": "self_employment_income > 0 or a self-employed main job (employment_status FT_SELF_EMPLOYED or PT_SELF_EMPLOYED)", + "validation": "SEINC_NUM 1 share among PROFITS > 0" + }, + "at_or_over_spa": { + "tape": "SPA = 1; composites SRP > 0", + "twin": "age at or over policyengine-uk gov.dwp.state_pension.age at the build instant", + "validation": "SRP > 0 share among SPA 1 and SPA 1 share among SRP > 0" + } + }, + "recipient_income_rule": { + "drawn": "the twin reports pay, a trade (self_employment_income > 0 or a self-employed main job) or a pension (private_pension_income + state_pension_reported > 0), or more than the floor of taxable interest (savings_interest_income less tax_free_savings_income), dividend_income, property_income and miscellaneous_income together; a reserved band carrier is always drawn; a twin whose only record is the State Pension is drawn, against a tape that mostly holds taxpayers, which can lift its pension leaves", + "undrawn": "the twin has no tax record for the tape to condition on; the copy keeps the twin's values at stage 1 and stage 2 (a declared modelling boundary like the under-16 one, microcosm#840)", + "unearned_income_floor_gbp": 1000 + }, + "draw": "twin_conditional_quantiles", + "reference_model": { + "population": "uk_frs_raw_spine_base_support_channel claimants and partners (is_uc_claimant) aged 16 and over with taxable income under recipient_income_rule", + "predictors": "the stage-1 predictors, encoded identically", + "targets": "the stage-1 outputs with an FRS analogue, in stage-1 chain order", + "analogue_columns": { + "self_employment_income": "self_employment_income", + "savings_interest_income": "taxable_savings_interest", + "dividend_income": "dividend_income", + "private_pension_income": "private_pension_income", + "property_income": "property_income", + "other_investment_income": null, + "gift_aid": null, + "charitable_investment_gifts": null, + "hmrc_spi_pay": "hmrc_spi_pay", + "hmrc_spi_employment_benefits": null, + "hmrc_spi_employment_expenses": null, + "hmrc_spi_incapacity_benefit_income": "hmrc_spi_incapacity_benefit_income", + "hmrc_spi_other_social_security_income": "ossben_identifiable_subset", + "hmrc_spi_taxable_termination_pay": null, + "hmrc_spi_unemployment_benefit_income": "hmrc_spi_unemployment_benefit_income", + "hmrc_spi_miscellaneous_employment_income": null, + "hmrc_spi_other_income": "miscellaneous_income", + "hmrc_spi_state_pension_income": "srp_regular_code5", + "property_finance_costs": null + }, + "weight": "household_weight", + "weight_mapping": "household_to_person", + "fit_weight_kind": "importance", + "seed": 45, + "n_estimators": 100, + "folds": 5, + "fold_key": "predictor cell (gender, region, whole-year age, main_source, has_pay, has_trade, at_or_over_spa), the fold being floor(uniform x folds) of the cell's stable_identity_uniforms draw at the stage seed and salt spi_stage1:reference_fold; each fold's recipients are located by a forest fitted on the other folds, so the forest that locates a copy never saw its twin, and every row of a cell is located by one forest", + "method": "Rosenblatt transport (microcosm#840): each drawn recipient's twin values are located on the reference forest, the sign uniform in the gate's cumulative class probabilities and the quantile on the sign's magnitude forest, each leaf chained on the twin's observed earlier leaves, and the stage-1 forest draws at those uniforms, so the recipient receives the SPI income of someone in the same position among SPI people like it as the twin holds among FRS people like it. taxable_savings_interest is savings_interest_income less tax_free_savings_income, floored at zero. A leaf without an analogue, or whose analogue is degenerate on the FRS rows, draws at identity-keyed uniforms, as do the placements inside a class or a flat stretch of a conditional; no model random stream is consumed. The reference locates a leaf given the twin's observed earlier analogue leaves, while the stage-1 forest draws it given every earlier output, the identity-uniform leaves included, so the located quantile is read off a conditional the identity draws also shape (microcosm#840 follow-up: the chain order). A full build refuses a reference the predictor cells cannot cross-fit (only a sampled rung or a synthetic fixture may locate in-sample, and its receipt says so), a recipient whose fold differs from its twin's, and a reference whose sign classes differ from the stage-1 forest's on any located target.", + "receipt": "per target the analogue, the FRS regime and sign classes, the uniform source and the Kolmogorov-Smirnov distance of the sign uniforms and of the quantiles over positive rows from U[0,1), overall and by main_source over at least 10 rows; a positive-row count under 10 is withheld; the counts in the stage evidence stay with the build and are not published" + }, + "identity_uniforms": { + "key": "person_source_id", + "salt": "spi_stage1::", + "seed": 42 + }, "source_sampling_weight": "FACT", "sample_size": 100000, "sample_with_replacement": true, @@ -1870,8 +1946,8 @@ "require_all_predictors": true, "require_all_outputs": true, "initialize_frs_channel_columns": { - "gift_aid": 0.0, - "charitable_investment_gifts": 0.0 + "gift_aid": 0, + "charitable_investment_gifts": 0 }, "n_estimators": 100, "seed": 42 @@ -2273,7 +2349,8 @@ "hmrc_spi_employed_income", "hmrc_spi_total_earned_income", "hmrc_spi_total_investment_income", - "hmrc_spi_assessable_income" + "hmrc_spi_assessable_income", + "person_is_spi_income_recipient" ], "nonnegative_outputs": [ "other_investment_income", @@ -2331,7 +2408,7 @@ "hmrc_spi_unemployment_benefit_income", "hmrc_spi_incapacity_benefit_income" ], - "notes": "Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path." + "notes": "Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, flags the rows it drew (person_is_spi_income_recipient) so later stages tell tape-concept rows from FRS-concept ones without re-deriving the recipient rule (microcosm#840), leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path." }, { "stage": "spi_housing_shell", diff --git a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml index 78b1c74cd0..3835c52700 100644 --- a/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml +++ b/packages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml @@ -1452,6 +1452,9 @@ stages: - TEI - TII - TI + - MAINSRCE + - SEINC_NUM + - SPA runtime_sha256_required: true fail_on_missing_file: true fail_on_missing_columns: true @@ -1493,9 +1496,73 @@ stages: - age - gender - region + - main_source + - has_pay + - has_trade + - at_or_over_spa categorical_predictors: - gender - region + - main_source + bridge_predictors: + main_source: + tape: largest of employment_income (PAY + EPB + TAXTERM), private_pension_income + hmrc_spi_state_pension_income (PENSION + SRP) and self_employment_income (max(0, PROFITS - CAPALL - LOSSBF)); other when none is positive + twin: largest of employment_income, private_pension_income + state_pension_reported and self_employment_income; other when none is positive + validation: weighted agreement with the published MAINSRCE code (1 pay; 2 occupational pension; 3 sole trader and 4 partnership, trade; 5 other and 6 claims case, other) at least 0.95 over the classified records, reported by code; composites (-1) carry no code + has_pay: + tape: employment_income > 0 + twin: employment_income > 0 + validation: PAY > 0 share among MAINSRCE 1 + has_trade: + tape: SEINC_NUM = 1 (self-employment or partnership pages); composites self_employment_income > 0 + twin: self_employment_income > 0 or a self-employed main job (employment_status FT_SELF_EMPLOYED or PT_SELF_EMPLOYED) + validation: SEINC_NUM 1 share among PROFITS > 0 + at_or_over_spa: + tape: SPA = 1; composites SRP > 0 + twin: age at or over policyengine-uk gov.dwp.state_pension.age at the build instant + validation: SRP > 0 share among SPA 1 and SPA 1 share among SRP > 0 + recipient_income_rule: + drawn: the twin reports pay, a trade (self_employment_income > 0 or a self-employed main job) or a pension (private_pension_income + state_pension_reported > 0), or more than the floor of taxable interest (savings_interest_income less tax_free_savings_income), dividend_income, property_income and miscellaneous_income together; a reserved band carrier is always drawn; a twin whose only record is the State Pension is drawn, against a tape that mostly holds taxpayers, which can lift its pension leaves + undrawn: the twin has no tax record for the tape to condition on; the copy keeps the twin's values at stage 1 and stage 2 (a declared modelling boundary like the under-16 one, microcosm#840) + unearned_income_floor_gbp: 1000 + draw: twin_conditional_quantiles + reference_model: + population: uk_frs_raw_spine_base_support_channel claimants and partners (is_uc_claimant) aged 16 and over with taxable income under recipient_income_rule + predictors: the stage-1 predictors, encoded identically + targets: the stage-1 outputs with an FRS analogue, in stage-1 chain order + analogue_columns: + self_employment_income: self_employment_income + savings_interest_income: taxable_savings_interest + dividend_income: dividend_income + private_pension_income: private_pension_income + property_income: property_income + other_investment_income: null + gift_aid: null + charitable_investment_gifts: null + hmrc_spi_pay: hmrc_spi_pay + hmrc_spi_employment_benefits: null + hmrc_spi_employment_expenses: null + hmrc_spi_incapacity_benefit_income: hmrc_spi_incapacity_benefit_income + hmrc_spi_other_social_security_income: ossben_identifiable_subset + hmrc_spi_taxable_termination_pay: null + hmrc_spi_unemployment_benefit_income: hmrc_spi_unemployment_benefit_income + hmrc_spi_miscellaneous_employment_income: null + hmrc_spi_other_income: miscellaneous_income + hmrc_spi_state_pension_income: srp_regular_code5 + property_finance_costs: null + weight: household_weight + weight_mapping: household_to_person + fit_weight_kind: importance + seed: 45 + n_estimators: 100 + folds: 5 + fold_key: 'predictor cell (gender, region, whole-year age, main_source, has_pay, has_trade, at_or_over_spa), the fold being floor(uniform x folds) of the cell''s stable_identity_uniforms draw at the stage seed and salt spi_stage1:reference_fold; each fold''s recipients are located by a forest fitted on the other folds, so the forest that locates a copy never saw its twin, and every row of a cell is located by one forest' + method: 'Rosenblatt transport (microcosm#840): each drawn recipient''s twin values are located on the reference forest, the sign uniform in the gate''s cumulative class probabilities and the quantile on the sign''s magnitude forest, each leaf chained on the twin''s observed earlier leaves, and the stage-1 forest draws at those uniforms, so the recipient receives the SPI income of someone in the same position among SPI people like it as the twin holds among FRS people like it. taxable_savings_interest is savings_interest_income less tax_free_savings_income, floored at zero. A leaf without an analogue, or whose analogue is degenerate on the FRS rows, draws at identity-keyed uniforms, as do the placements inside a class or a flat stretch of a conditional; no model random stream is consumed. The reference locates a leaf given the twin''s observed earlier analogue leaves, while the stage-1 forest draws it given every earlier output, the identity-uniform leaves included, so the located quantile is read off a conditional the identity draws also shape (microcosm#840 follow-up: the chain order). A full build refuses a reference the predictor cells cannot cross-fit (only a sampled rung or a synthetic fixture may locate in-sample, and its receipt says so), a recipient whose fold differs from its twin''s, and a reference whose sign classes differ from the stage-1 forest''s on any located target.' + receipt: per target the analogue, the FRS regime and sign classes, the uniform source and the Kolmogorov-Smirnov distance of the sign uniforms and of the quantiles over positive rows from U[0,1), overall and by main_source over at least 10 rows; a positive-row count under 10 is withheld; the counts in the stage evidence stay with the build and are not published + identity_uniforms: + key: person_source_id + salt: 'spi_stage1::' + seed: 42 source_sampling_weight: FACT sample_size: 100000 sample_with_replacement: true @@ -1938,6 +2005,7 @@ stages: - hmrc_spi_total_earned_income - hmrc_spi_total_investment_income - hmrc_spi_assessable_income + - person_is_spi_income_recipient nonnegative_outputs: - other_investment_income - gift_aid @@ -1992,7 +2060,7 @@ stages: - hmrc_spi_pay - hmrc_spi_unemployment_benefit_income - hmrc_spi_incapacity_benefit_income - notes: Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path. + notes: Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, flags the rows it drew (person_is_spi_income_recipient) so later stages tell tape-concept rows from FRS-concept ones without re-deriving the recipient rule (microcosm#840), leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path. - stage: spi_housing_shell survey: Family Resources Survey 2024-25 source: Family Resources Survey 2024-25 base households' housing (tenure, dwelling type, bedrooms, council tax, housing costs and the housing-linked benefit reports), imputed onto the SPI support households from their own region, composition and post-SPI incomes. 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 5b9432dd42..2a70c09752 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/graph.py @@ -255,14 +255,16 @@ } ), # Engine-free: the landlords' profit and finance costs, the inputs that - # split the two income concepts (the SPI recipient rule and the household - # reference person's sub-letting rent) and the rental property values the - # coherence receipt reads (microcosm#1106). + # split the two income concepts (the income stage's recipient flag, the + # channel and the household reference person's sub-letting rent), the + # landlords' ages the FRS-concept finance-cost draw conditions on, and the + # rental property values the coherence receipt reads (microcosm#1106, + # microcosm#840). "property_components": frozenset( { ("person", "age"), ("person", "is_household_head"), - ("person", "is_uc_claimant"), + ("person", "person_is_spi_income_recipient"), ("person", "person_support_channel"), ("person", "property_income"), ("person", "property_finance_costs"), @@ -1052,6 +1054,8 @@ def _cells( # A redrawn row drops its FRS twin's landlord carrier: its property income # is an SPI donor's (microcosm#1095). "reports_rent_from_other_property", + # The rows stage 1 drew, read by property_components (microcosm#840). + "person_is_spi_income_recipient", ) _STAGE_CELLS = { **_STAGE_CELLS, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py index e5f3a0542a..b1fa5f66d0 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/hmrc_source_contract.py @@ -49,6 +49,8 @@ SPI_SOURCE_TEI_FORMULA, SPI_SOURCE_TI_FORMULA, SPI_SOURCE_TII_FORMULA, + SPI_STAGE1_CATEGORICAL_PREDICTORS, + SPI_STAGE1_PREDICTOR_COLUMNS, SPI_STAGE2_REVIEWED_ABSENT_OUTPUTS, SPI_TI_IDENTITY_ABS_TOLERANCE_GBP, ) @@ -418,13 +420,13 @@ def assert_uk_hmrc_income_source_contract_current( failures, "stage1.predictors", tuple(stage1.get("predictors", ())), - ("age", "gender", "region"), + SPI_STAGE1_PREDICTOR_COLUMNS, ) _expect( failures, "stage1.categorical_predictors", tuple(stage1.get("categorical_predictors", ())), - ("gender", "region"), + SPI_STAGE1_CATEGORICAL_PREDICTORS, ) _expect( failures, diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py index 6f5a539114..5476eeca2b 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/property_components.py @@ -88,9 +88,8 @@ ) from microcosm.build.uk_runtime.spi_income import ( SPI_DONOR_INCOME_YEAR, + SPI_INCOME_RECIPIENT_COLUMN, SPI_INCOME_UPRATING_VARIABLES, - SPI_MINIMUM_RECIPIENT_AGE, - SPI_RECIPIENT_ROLE_COLUMN, SPIDonorAgeModel, load_spi_donor_age_model, prepare_spi_donor_table, @@ -311,22 +310,44 @@ def _person_weights(frame: Frame) -> np.ndarray: ) +#: Person columns the stage reads; the UK graph's declared reads for the +#: node must cover them, since a node receives its declared cells alone +#: (the recipient flag joined them with microcosm#840). +PROPERTY_COMPONENTS_PERSON_INPUTS: frozenset[str] = frozenset( + { + PROFIT_COLUMN, + FINANCE_COSTS_COLUMN, + HOUSEHOLD_HEAD_COLUMN, + SPI_INCOME_RECIPIENT_COLUMN, + support_channel_column("person"), + "age", + } +) + + def _tape_concept_rows(person: pd.DataFrame) -> np.ndarray: """Rows whose income leaves the income stage drew from the SPI tape. - The SPI support channel's claimants and partners aged 16 and over (the - income stage's recipient rule); every other row keeps FRS-reported - property income, including the channel's dependants on their twin values. + The income stage flags them (``SPI_INCOME_RECIPIENT_COLUMN``): the SPI + support channel's claimants and partners aged 16 and over with taxable + income under its recipient income rule, and the reserved band carriers. + Every other row keeps FRS-reported property income: the channel's + dependants and the copies of twins with no taxable income on their twin + values (microcosm#840), and the FRS rows. """ + flag = person[SPI_INCOME_RECIPIENT_COLUMN] + if not pd.api.types.is_bool_dtype(flag.dtype): + raise PropertyComponentsError( + f"the income stage's {SPI_INCOME_RECIPIENT_COLUMN!r} must be boolean." + ) channel = person[support_channel_column("person")].astype(str).to_numpy() - age = pd.to_numeric(person["age"], errors="coerce").to_numpy(dtype=float) - role = person[SPI_RECIPIENT_ROLE_COLUMN].to_numpy(dtype=bool) - return ( - (channel == SPI_SYNTHETIC_SUPPORT_CHANNEL) - & (age >= SPI_MINIMUM_RECIPIENT_AGE) - & role - ) + tape = flag.to_numpy(dtype=bool) + if (tape & (channel != SPI_SYNTHETIC_SUPPORT_CHANNEL)).any(): + raise PropertyComponentsError( + f"{SPI_INCOME_RECIPIENT_COLUMN!r} is set outside the SPI channel." + ) + return tape def frs_concept_rental_profit( @@ -930,17 +951,7 @@ def __call__(self, frame: Frame) -> Frame: person = frame.table("person").copy() household = frame.table("household") - missing = sorted( - { - PROFIT_COLUMN, - FINANCE_COSTS_COLUMN, - HOUSEHOLD_HEAD_COLUMN, - SPI_RECIPIENT_ROLE_COLUMN, - support_channel_column("person"), - "age", - } - - set(person.columns) - ) + missing = sorted(PROPERTY_COMPONENTS_PERSON_INPUTS - set(person.columns)) if missing: raise PropertyComponentsError(f"the spine's person table lacks {missing}.") weights = _person_weights(frame) diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py index 8f51da50c0..0f05c31234 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_income.py @@ -31,6 +31,18 @@ FRS_LANDLORD_CARRIER_COLUMN, uc_gainful_self_employment, ) +from microcosm.build.uk_runtime.spi_rank_transport import ( + SPI_STAGE1_ANALOGUE_COLUMNS, + SPI_TRANSPORT_FIT_NAME, + SPI_TRANSPORT_FOLDS, + SPI_TRANSPORT_KEY_COLUMN, + SPI_TRANSPORT_SEED_OFFSET, + analogue_targets, + assert_analogue_map_covers, + cell_fold_ids, + cross_fit_transport, + observed_analogues, +) from microcosm.build.uk_runtime.spi_support import ( BASE_FRS_SUPPORT_CHANNEL, FRS_ONLY_SPI_FILL_INCOME_PREDICTOR_COLUMNS, @@ -85,6 +97,78 @@ #: The column persists the FRS adult-file role from #: ``uc_relationships.frs_uc_claimant_mask``. SPI_RECIPIENT_ROLE_COLUMN = "is_uc_claimant" +#: Person flag the stage writes: True exactly for the rows stage 1 drew from +#: the tape (claimants and partners aged 16 and over with taxable income under +#: the recipient income rule, and the reserved band carriers), False for the +#: undrawn copies, the channel's dependants and every FRS row. A later stage +#: that tells tape-concept rows from FRS-concept ones reads it instead of +#: re-deriving the recipient rule (property_components; microcosm#840). +SPI_INCOME_RECIPIENT_COLUMN = "person_is_spi_income_recipient" +#: The tape's bridge codes (SPI 2022-23 Public Use Tape documentation, Annex +#: A): MAINSRCE "main source indicator", SEINC_NUM "indicator for +#: self-employed cases (those submitting pages in their tax return for income +#: from trades or partnerships)" and SPA "State Pension age indicator". +#: Composite records (-1) carry none and derive theirs from their leaves. +SPI_MAINSRCE_CODES: Mapping[int, str] = { + -1: "composite", + 1: "pay", + 2: "pension", + 3: "trade", + 4: "trade", + 5: "other", + 6: "other", +} +SPI_MAINSRCE_CODE_LABELS: Mapping[int, str] = { + -1: "not classified (composite record)", + 1: "main source pay", + 2: "main source occupational pension", + 3: "main source sole trader", + 4: "main source partnership", + 5: "main source other", + 6: "claims case", +} +SPI_INDICATOR_CODES = (-1, 0, 1) +#: The bridge predictors (microcosm#840): four facts about a record's income +#: that the tape and the FRS twin each carry, so a recipient draws from the +#: tape records that share them. main_source and has_pay come from the same +#: leaf formulas on both sides. has_trade and at_or_over_spa take the tape's +#: published indicator codes (SEINC_NUM, self-employment pages filed; SPA, at +#: State Pension age), the leaf formulas serving only a composite record +#: without codes, and on the twin its trade leaf or self-employed status and +#: its age against State Pension age. The published MAINSRCE code validates +#: the leaf-defined main source, and the receipt reports the indicator codes +#: against the leaves both ways. +SPI_MAIN_SOURCE_LEVELS = ("pay", "pension", "trade", "other") +SPI_BRIDGE_PREDICTOR_COLUMNS = ("main_source", "has_pay", "has_trade", "at_or_over_spa") +SPI_STAGE1_CATEGORICAL_PREDICTORS = ("gender", "region", "main_source") +SPI_STAGE1_PREDICTOR_COLUMNS = ( + "age", + "gender", + "region", + *SPI_BRIDGE_PREDICTOR_COLUMNS, +) +#: The leaf-defined main source must translate the published MAINSRCE code +#: on at least this weighted share of the classified tape records. The stage +#: evidence's bridge_validation measured 0.969 on the full 2022-23 tape with +#: this stage's preparation (pay 0.983, occupational pension 0.987, sole +#: trader 0.851, partnership 0.744, other 0.916; composites 0.002). +SPI_MAIN_SOURCE_MINIMUM_AGREEMENT = 0.95 +#: The no-record rule (microcosm#840): the tape holds people with an income +#: tax record, so a twin with no taxable income has no population on it to +#: condition on and its copy keeps the twin's values. Unearned income counts +#: only above this floor, the order of the savings, dividend and property +#: allowances: a declared modelling boundary like the under-16 one. +SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP = 1_000.0 +SPI_RECIPIENT_INCOME_RULE = ( + "drawn when the twin reports pay, a trade (self-employment income or a " + "self-employed main job) or a pension, or more than the floor of taxable " + "interest (savings interest less the tax-free part), dividends, property " + "and miscellaneous income together, and always for a reserved band " + "carrier; otherwise the twin has no tax record for the tape to condition " + "on and the copy keeps the twin's values at stage 1 and stage 2; a twin " + "whose only record is the State Pension is drawn, against a tape that " + "mostly holds taxpayers, which can lift its pension leaves" +) SPI_DONOR_INCOME_YEAR = 2022 #: The donor rebase moves each SPI component from the tape's year to the #: frame's survey year. Those years are history, so a component moves by the @@ -235,6 +319,9 @@ "TEI", "TII", "TI", + "MAINSRCE", + "SEINC_NUM", + "SPA", ) SPI_INCOME_SOURCE_COLUMNS = { # Keep the PolicyEngine input on the pinned enhanced-FRS precedent. The @@ -568,6 +655,11 @@ class UKSPIIncomeImputationResult: donor_property_finance_costs: Mapping[str, object] | None = None state_pension_age_guard: tuple[Mapping[str, object], ...] = () recipient_domain: Mapping[str, object] | None = None + stage1_transport: Mapping[str, object] | None = None + bridge_validation: Mapping[str, object] | None = None + reference_training_rows: int = 0 + state_pension_age: int | None = None + gainful_self_employment_refresh: Mapping[str, object] | None = None @dataclass(frozen=True) @@ -673,6 +765,8 @@ def impute_uk_spi_income_support( band_donor_resample: Mapping[str, object] | None = None, donor_age_model: SPIDonorAgeModel | None = None, state_pension_age_guard: UKSPIStatePensionAgeGuard | None = None, + state_pension_age: int | None = None, + allow_in_sample_reference: bool = False, ) -> UKSPIIncomeImputationResult: """Run strict SPI-income and FRS-only QRFs on rebuilt positive support. @@ -683,7 +777,9 @@ def impute_uk_spi_income_support( every synthetic adult on the forest draw. ``donor_age_model`` draws donor ages by ONS single-year shares, State Pension age aware, and ``state_pension_age_guard`` zeroes pension-age reports below State Pension - age with receipts (microcosm#1069). + age with receipts (microcosm#1069). ``state_pension_age`` is the boundary + the bridge predictor ``at_or_over_spa`` reads on the twin; it defaults to + the donor age model's and is required without one (microcosm#840). """ if support.household_weight_kind is not WeightKind.IMPORTANCE: @@ -776,19 +872,47 @@ def impute_uk_spi_income_support( # uk-data#504, so each recipient keeps the draw it has always had; the # rows of dependants aged 16 to 19 are then discarded. spi_age_domain = spi_channel_people & person.age.ge(SPI_MINIMUM_RECIPIENT_AGE) - spi_people = spi_age_domain & person[SPI_RECIPIENT_ROLE_COLUMN] - if not spi_people.any(): + role_domain = spi_age_domain & person[SPI_RECIPIENT_ROLE_COLUMN] + if not role_domain.any(): raise ValueError("SPI support has no recipients in the donor age domain.") + if state_pension_age is None and donor_age_model is not None: + state_pension_age = donor_age_model.state_pension_age + if state_pension_age is None: + raise ValueError( + "SPI stage-1 bridge predictors need State Pension age: pass " + "state_pension_age or a donor age model." + ) + person_weights = _person_household_weights(person, household) + # The no-record rule (microcosm#840): a twin with no taxable income has no + # tax record for the tape to condition on, so its copy keeps the twin's + # values; a reserved band carrier is always drawn, since its leaves come + # from the band pools after the forest draw. + taxable = _taxable_income_mask(person.loc[role_domain]) + carrier = ( + person.loc[role_domain, SPI_INCOME_BAND_CARRIER_COLUMN].astype(bool).to_numpy() + if SPI_INCOME_BAND_CARRIER_COLUMN in person.columns + else np.zeros(int(role_domain.sum()), dtype=bool) + ) + spi_people = role_domain.copy() + spi_people.loc[role_domain] = taxable | carrier + undrawn = role_domain & ~spi_people + if not spi_people.any(): + raise ValueError("SPI support has no recipients with taxable income.") recipient_domain = { "minimum_age": SPI_MINIMUM_RECIPIENT_AGE, "role_column": SPI_RECIPIENT_ROLE_COLUMN, "recipient_rows": int(spi_people.sum()), - "dependant_rows_kept_on_twin_values": int((spi_age_domain & ~spi_people).sum()), + "dependant_rows_kept_on_twin_values": int( + (spi_age_domain & ~role_domain).sum() + ), "dependant_weight_kept_on_twin_values": float( - _person_household_weights(person, household) - .loc[spi_age_domain & ~spi_people] - .sum() + person_weights.loc[spi_age_domain & ~role_domain].sum() ), + "income_rule": SPI_RECIPIENT_INCOME_RULE, + "unearned_income_floor_gbp": SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP, + "undrawn_no_taxable_income_rows": int(undrawn.sum()), + "undrawn_no_taxable_income_weight": float(person_weights.loc[undrawn].sum()), + "carriers_drawn_without_taxable_income": int((carrier & ~taxable).sum()), } base_people = person[person_channel] == BASE_FRS_SUPPORT_CHANNEL if not base_people.any(): @@ -801,13 +925,47 @@ def impute_uk_spi_income_support( ) person = _seed_frs_hmrc_auxiliary_leaves(person, spi_people=spi_people) + base_household = household[household_channel] == BASE_FRS_SUPPORT_CHANNEL + if "clone_index" in household: + base_household &= household["clone_index"] == 0 + training_household_ids = set(household.loc[base_household, "household_id"]) + training_people = base_people & person["person_household_id"].isin( + training_household_ids + ) + if not training_people.any(): + raise ValueError("FRS-only stage has no canonical base training rows.") + # The reference forest's population mirrors the draw's: FRS claimants and + # partners aged 16 and over with taxable income under the same rule. + reference_people = ( + training_people + & person.age.ge(SPI_MINIMUM_RECIPIENT_AGE) + & person[SPI_RECIPIENT_ROLE_COLUMN] + ) + reference_people.loc[reference_people] = _taxable_income_mask( + person.loc[reference_people] + ) + if not reference_people.any(): + raise ValueError( + "SPI reference forest has no FRS training rows with taxable income." + ) + recipient_predictors = _stage1_query_predictors( - person.loc[spi_channel_people], + person.loc[spi_people], household, + state_pension_age=state_pension_age, ) - donor_predictors, encoded_recipient = _encode_predictor_pair( - donor[["age", "gender", "region"]], - recipient_predictors, + reference_predictors = _stage1_query_predictors( + person.loc[reference_people], + household, + state_pension_age=state_pension_age, + ) + donor_predictors, encoded_reference, encoded_recipient = _encode_predictor_frames( + ( + donor[list(SPI_STAGE1_PREDICTOR_COLUMNS)], + reference_predictors, + recipient_predictors, + ), + categorical=SPI_STAGE1_CATEGORICAL_PREDICTORS, ) donor_frame = _person_fit_frame( predictors=donor_predictors, @@ -822,20 +980,83 @@ def impute_uk_spi_income_support( list(SPI_INCOME_QRF_OUTPUT_COLUMNS), weights="design", ) - stage1_draws = stage1.predict(encoded_recipient) + # The twin-conditional transport (microcosm#840): reference forests on + # the FRS rows, with the stage-1 predictors and chain order, locate each + # twin's observed leaves; the stage-1 forest draws at those uniforms. The + # forests are cross-fitted by predictor cell, so the forest that locates + # a copy never saw its twin (module docstring). The reference seed derives + # from the stage seed like stage 2's and the band resample's; changing the + # offset edits the derivation convention. + assert_analogue_map_covers(SPI_INCOME_QRF_OUTPUT_COLUMNS) + reference_weights = person_weights.loc[reference_people] + reference_targets = list(analogue_targets(SPI_INCOME_QRF_OUTPUT_COLUMNS)) + reference_weight_kind: dict[str, str] = {} + + def fit_reference(encoded: pd.DataFrame, observed: pd.DataFrame): + frame = _person_fit_frame( + predictors=encoded, + targets=observed, + weights=reference_weights.loc[encoded.index].to_numpy(dtype=np.float64), + weight_kind=WeightKind.IMPORTANCE, + ) + fitted = qrf_cls( + n_estimators=n_estimators, seed=seed + SPI_TRANSPORT_SEED_OFFSET + ).fit(frame, list(encoded.columns), reference_targets, weights="importance") + reference_weight_kind.setdefault("kind", fitted.weight_kind) + return fitted + + training_folds, used_folds = cell_fold_ids( + reference_predictors, folds=SPI_TRANSPORT_FOLDS, seed=seed + ) + if SPI_TRANSPORT_KEY_COLUMN not in person.columns: + raise ValueError( + f"SPI stage-1 identity uniforms need {SPI_TRANSPORT_KEY_COLUMN!r} on " + "the person table (the support lineage column the manifest declares)." + ) + identity_column = SPI_TRANSPORT_KEY_COLUMN + transport = cross_fit_transport( + fit_reference, + training_predictors=reference_predictors, + encoded_training=encoded_reference, + training_observed=observed_analogues(person.loc[reference_people]), + training_folds=training_folds, + training_identities=person.loc[reference_people, identity_column].to_numpy(), + used=used_folds, + recipient_predictors=recipient_predictors, + encoded_recipients=encoded_recipient, + observed=observed_analogues(person.loc[spi_people]), + identities=person.loc[spi_people, identity_column].to_numpy(), + groups=recipient_predictors["main_source"].to_numpy(), + seed=seed, + folds=SPI_TRANSPORT_FOLDS, + allow_in_sample=allow_in_sample_reference, + outputs=SPI_INCOME_QRF_OUTPUT_COLUMNS, + ) + # The tape forest reads a located sign uniform as the reference's gate + # wrote it only when both gates order the same classes (microcosm#840): a + # full build refuses a mismatch; a sampled rung or a synthetic fixture, + # whose tiny training support can drop a sign, records it in the receipt. + sign_class_mismatches = _sign_class_mismatches(transport.receipt, stage1) + if sign_class_mismatches and not allow_in_sample_reference: + raise ValueError( + "SPI stage-1 targets whose FRS reference sign classes differ from the " + f"tape forest's, so a located sign uniform would change meaning: " + f"{sign_class_mismatches}." + ) + transport.receipt["sign_class_mismatches"] = sign_class_mismatches + stage1_draws = stage1.predict_from_uniforms( + encoded_recipient, + quantiles=transport.quantiles, + sign_uniforms=transport.sign_uniforms, + ) _validate_predictions( stage1_draws, expected=SPI_INCOME_QRF_OUTPUT_COLUMNS, label="SPI stage-1", ) - # Hold the existing RNG stream fixed: query the legacy shape (every - # SPI-channel person), then discard the draws outside the recipient domain - # (children, and dependants aged 16 to 19: uk-data#504) before any - # assignment, so each recipient keeps the draw it has always had. # FRS-channel rows keep their own reported incomes, dividends included - # (uk-data#498, microcosm#1095). - recipient_positions = spi_people.loc[spi_channel_people].to_numpy(dtype=bool) - stage1_draws = stage1_draws.iloc[np.flatnonzero(recipient_positions)].copy() + # (uk-data#498, microcosm#1095); dependants aged 16 to 19 and undrawn + # copies keep their twin's values (uk-data#504, microcosm#840). income_uprating = None uprating_factors = dict.fromkeys(SPI_INCOME_QRF_OUTPUT_COLUMNS, 1.0) if rebase_income_to_build_period: @@ -894,15 +1115,6 @@ def impute_uk_spi_income_support( dtype=np.float64, copy=True ) stage2_outputs, reviewed_absent = _stage2_outputs(person) - base_household = household[household_channel] == BASE_FRS_SUPPORT_CHANNEL - if "clone_index" in household: - base_household &= household["clone_index"] == 0 - training_household_ids = set(household.loc[base_household, "household_id"]) - training_people = (person[person_channel] == BASE_FRS_SUPPORT_CHANNEL) & person[ - "person_household_id" - ].isin(training_household_ids) - if not training_people.any(): - raise ValueError("FRS-only stage has no canonical base training rows.") if ( state_pension_age_guard is not None and state_pension_age_guard.base_channel_columns @@ -1010,12 +1222,20 @@ def impute_uk_spi_income_support( person = _refresh_disability_derived_inputs(person, spi_people=spi_people) person = _refresh_carer_take_up_input(person, spi_people=spi_people) person = _refresh_uc_start_up_period(person, spi_people=spi_people) - person = _refresh_uc_gainful_self_employment(person, spi_people=spi_people) + person, gainful_self_employment = _refresh_uc_gainful_self_employment( + person, spi_people=spi_people + ) person = _refresh_landlord_carrier(person, spi_people=spi_people) + # The flag is the stage's last new column, where the graph's typed cells + # place it (the legacy oracle and the graph must agree on column order). + person[SPI_INCOME_RECIPIENT_COLUMN] = ( + spi_people.reindex(person.index).fillna(False).to_numpy(dtype=bool) + ) return UKSPIIncomeImputationResult( person=person, fit_weight_records=( FitWeightRecord(SPI_DONOR_FIT_NAME, stage1.weight_kind), + FitWeightRecord(SPI_TRANSPORT_FIT_NAME, reference_weight_kind["kind"]), FitWeightRecord(FRS_ONLY_FIT_NAME, stage2.weight_kind), ), donor_path=donor_path, @@ -1040,6 +1260,11 @@ def impute_uk_spi_income_support( donor_property_finance_costs=donor_full.attrs.get("property_finance_costs"), state_pension_age_guard=tuple(guard_receipts), recipient_domain=recipient_domain, + stage1_transport=transport.receipt, + bridge_validation=donor_full.attrs.get("bridge"), + reference_training_rows=int(reference_people.sum()), + state_pension_age=int(state_pension_age), + gainful_self_employment_refresh=gainful_self_employment, ) @@ -1511,6 +1736,30 @@ def _prepare_spi_donor( # The published age band travels with the record so band pools can match # a carrier's age band; composites (-1) have none and never age-match. donor["agerange"] = age_codes.to_numpy(dtype=np.int64) + # The bridge predictors (microcosm#840): main_source and has_pay from the + # leaves, as on the twin; has_trade and at_or_over_spa from the published + # indicator codes, the leaves serving a composite record without codes; + # the receipt validates the leaf-defined main source against MAINSRCE and + # reports the indicator codes against the leaves both ways. + _validate_spi_bridge_codes(numeric) + seinc = numeric["SEINC_NUM"].astype(int).to_numpy() + spa = numeric["SPA"].astype(int).to_numpy() + donor["main_source"] = _main_source( + donor["employment_income"].to_numpy(dtype=np.float64), + ( + donor["private_pension_income"] + + donor[SPI_HMRC_STATE_PENSION_INCOME_COLUMN] + ).to_numpy(dtype=np.float64), + donor["self_employment_income"].to_numpy(dtype=np.float64), + ) + donor["has_pay"] = donor["employment_income"].gt(0.0).to_numpy(dtype=np.float64) + donor["has_trade"] = np.where( + seinc == -1, donor["self_employment_income"].to_numpy() > 0.0, seinc == 1 + ).astype(np.float64) + donor["at_or_over_spa"] = np.where( + spa == -1, numeric["SRP"].to_numpy(dtype=np.float64) > 0.0, spa == 1 + ).astype(np.float64) + donor.attrs["bridge"] = _spi_bridge_receipt(numeric, donor) donor.attrs["age_draw"] = { "method": ( SPI_DONOR_AGE_DRAW_METHOD @@ -1842,35 +2091,258 @@ def _person_predictors( def _stage1_query_predictors( person: pd.DataFrame, household: pd.DataFrame, + *, + state_pension_age: int, ) -> pd.DataFrame: - """Stage-1 query predictors: age at the middle of the year of age.""" + """Stage-1 query predictors: age at the middle of the year of age, and the + bridge predictors derived from the row's own (the twin's) leaves.""" predictors = _person_predictors(person, household, income_predictors=()) predictors["age"] = np.floor(predictors["age"].to_numpy(dtype=np.float64)) + 0.5 - return predictors + bridge = _person_bridge(person, state_pension_age=state_pension_age) + for column in SPI_BRIDGE_PREDICTOR_COLUMNS: + predictors[column] = bridge[column].to_numpy() + return predictors[list(SPI_STAGE1_PREDICTOR_COLUMNS)] + + +def _main_source(pay: np.ndarray, pension: np.ndarray, trade: np.ndarray) -> np.ndarray: + """The largest of pay, pension and trade; ``other`` when none is positive.""" + + stacked = np.vstack([pay, pension, trade]) + labels = np.asarray(SPI_MAIN_SOURCE_LEVELS[:3], dtype=object)[ + stacked.argmax(axis=0) + ] + return np.where( + stacked.max(axis=0) > 0.0, labels, SPI_MAIN_SOURCE_LEVELS[3] + ).astype(object) + + +_BRIDGE_PERSON_COLUMNS = ( + "age", + "employment_income", + "self_employment_income", + "private_pension_income", + "state_pension_reported", + "employment_status", +) +_UNEARNED_INCOME_COLUMNS = ( + "savings_interest_income", + "tax_free_savings_income", + "dividend_income", + "property_income", + "miscellaneous_income", +) + + +def _person_bridge(person: pd.DataFrame, *, state_pension_age: int) -> pd.DataFrame: + """The bridge predictors of FRS persons, from their own leaves. + + The formulas mirror the tape's in :func:`_prepare_spi_donor`: the main + source is the largest of pay, pension (private plus State Pension) and + trade; ``has_pay`` is pay above zero; ``has_trade`` is self-employment + income above zero or a self-employed main job, the twin's analogue of the + tape's self-employment pages; ``at_or_over_spa`` reads the engine's State + Pension age at the build instant. + """ + + _require_columns(person, _BRIDGE_PERSON_COLUMNS, label="SPI bridge predictors") + numeric = person[list(_BRIDGE_PERSON_COLUMNS[:-1])] + _require_finite_numeric(numeric, label="SPI bridge predictors") + pay = numeric["employment_income"].to_numpy(dtype=np.float64) + pension = ( + numeric["private_pension_income"] + numeric["state_pension_reported"] + ).to_numpy(dtype=np.float64) + trade = numeric["self_employment_income"].to_numpy(dtype=np.float64) + status = person["employment_status"].astype(str) + bridge = pd.DataFrame(index=person.index) + bridge["main_source"] = _main_source(pay, pension, trade) + bridge["has_pay"] = (pay > 0.0).astype(np.float64) + bridge["has_trade"] = ( + (trade > 0.0) | status.isin(SELF_EMPLOYED_STATUSES).to_numpy() + ).astype(np.float64) + bridge["at_or_over_spa"] = ( + numeric["age"].to_numpy(dtype=np.float64) >= float(state_pension_age) + ).astype(np.float64) + return bridge + + +def _taxable_income_mask(person: pd.DataFrame) -> np.ndarray: + """Rows whose twin reports taxable income under the no-record rule.""" + + _require_columns( + person, + (*_BRIDGE_PERSON_COLUMNS, *_UNEARNED_INCOME_COLUMNS), + label="SPI recipient income rule", + ) + numeric = person[[*_BRIDGE_PERSON_COLUMNS[1:-1], *_UNEARNED_INCOME_COLUMNS]] + _require_finite_numeric(numeric, label="SPI recipient income rule") + values = {column: numeric[column].to_numpy(dtype=np.float64) for column in numeric} + status = person["employment_status"].astype(str) + earned = ( + (values["employment_income"] > 0.0) + | (values["self_employment_income"] > 0.0) + | status.isin(SELF_EMPLOYED_STATUSES).to_numpy() + | (values["private_pension_income"] + values["state_pension_reported"] > 0.0) + ) + unearned = ( + np.maximum( + values["savings_interest_income"] - values["tax_free_savings_income"], 0.0 + ) + + values["dividend_income"] + + values["property_income"] + + values["miscellaneous_income"] + ) + return earned | (unearned > SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP) + + +def _validate_spi_bridge_codes(numeric: pd.DataFrame) -> None: + """Refuse a tape whose bridge codes are not the documented ones, by code.""" + + for column, allowed in ( + ("MAINSRCE", set(SPI_MAINSRCE_CODES)), + ("SEINC_NUM", set(SPI_INDICATOR_CODES)), + ("SPA", set(SPI_INDICATOR_CODES)), + ): + values = numeric[column].to_numpy(dtype=np.float64) + if (values != np.round(values)).any(): + raise ValueError(f"SPI 2022-23 {column} must hold integer codes.") + unknown = sorted(set(values.astype(int).tolist()) - allowed) + if unknown: + raise ValueError( + f"SPI 2022-23 {column} has undocumented code(s): {unknown}." + ) + + +def _spi_bridge_receipt(numeric: pd.DataFrame, donor: pd.DataFrame) -> dict[str, Any]: + """Validate the leaf-defined bridge against the published codes. + + Weighted shares over the whole tape; the leaf-defined main source must + agree with the published MAINSRCE code on at least + :data:`SPI_MAIN_SOURCE_MINIMUM_AGREEMENT` of the classified weight. + """ + + fact = numeric["FACT"].to_numpy(dtype=np.float64) + codes = numeric["MAINSRCE"].astype(int).to_numpy() + published = np.asarray( + [SPI_MAINSRCE_CODES[int(code)] for code in codes], dtype=object + ) + classified = codes != -1 + derived = donor["main_source"].to_numpy() + agree = (derived == published) & classified + + def share(mask: np.ndarray, within: np.ndarray) -> float | None: + denominator = float(fact[within].sum()) + if denominator <= 0.0: + return None + return float(fact[mask & within].sum() / denominator) + + by_code = {} + for code in sorted(set(codes.tolist())): + rows = codes == code + by_code[SPI_MAINSRCE_CODE_LABELS[int(code)]] = { + "code": int(code), + "weighted_share": share(rows, np.ones(len(codes), dtype=bool)), + "agreement": share(agree, rows) if code != -1 else None, + } + overall = share(agree, classified) + pay = numeric["PAY"].to_numpy(dtype=np.float64) > 0.0 + profits = numeric["PROFITS"].to_numpy(dtype=np.float64) > 0.0 + seinc = numeric["SEINC_NUM"].astype(int).to_numpy() == 1 + srp = numeric["SRP"].to_numpy(dtype=np.float64) > 0.0 + spa = numeric["SPA"].astype(int).to_numpy() == 1 + receipt = { + "predictors": list(SPI_BRIDGE_PREDICTOR_COLUMNS), + "main_source": { + "definition": ( + "largest of employment_income, private_pension_income + " + "hmrc_spi_state_pension_income and self_employment_income; " + "other when none is positive" + ), + "validation_column": "MAINSRCE", + "minimum_agreement": SPI_MAIN_SOURCE_MINIMUM_AGREEMENT, + "weighted_agreement": overall, + "by_published_code": by_code, + }, + "has_pay": { + "definition": "employment_income > 0", + "pay_share_among_main_source_pay": share(pay, codes == 1), + }, + "has_trade": { + "definition": "SEINC_NUM = 1; composites self_employment_income > 0", + "seinc_num_share_among_positive_profits": share( + seinc, profits & classified + ), + "positive_profits_share_among_seinc_num": share( + profits, seinc & classified + ), + }, + "at_or_over_spa": { + "definition": "SPA = 1; composites SRP > 0", + "srp_share_among_spa": share(srp, spa), + "spa_share_among_srp": share(spa, srp & classified), + }, + "composite_weighted_share": share(~classified, np.ones(len(codes), dtype=bool)), + } + if overall is not None and overall < SPI_MAIN_SOURCE_MINIMUM_AGREEMENT: + raise ValueError( + "the leaf-defined main source no longer translates the published " + f"MAINSRCE code: weighted agreement {overall:.4f} is below " + f"{SPI_MAIN_SOURCE_MINIMUM_AGREEMENT}." + ) + return receipt + + +def _sign_class_mismatches( + receipt: Mapping[str, Any], tape: Any +) -> dict[str, dict[str, list[int]]]: + """Located targets whose reference sign classes differ from the tape's.""" + + mismatches: dict[str, dict[str, list[int]]] = {} + for target in analogue_targets(SPI_INCOME_QRF_OUTPUT_COLUMNS): + reference_classes = receipt["targets"][target].get("reference_classes") + if reference_classes is None: + continue + tape_classes = [int(value) for value in tape.sign_classes(target)] + if list(reference_classes) != tape_classes: + mismatches[target] = { + "reference": [int(value) for value in reference_classes], + "tape": tape_classes, + } + return mismatches + + +def _encode_predictor_frames( + frames: Sequence[pd.DataFrame], + *, + categorical: Sequence[str], +) -> tuple[pd.DataFrame, ...]: + """One-hot the categorical predictors identically across several frames.""" + + lengths = [len(frame) for frame in frames] + combined = pd.concat( + [frame.reset_index(drop=True) for frame in frames], ignore_index=True + ) + present = [column for column in categorical if column in combined.columns] + encoded = pd.get_dummies(combined, columns=present, drop_first=False, dtype=float) + encoded = encoded.reindex(sorted(encoded.columns), axis=1) + out = [] + start = 0 + for frame, length in zip(frames, lengths, strict=True): + part = encoded.iloc[start : start + length].copy() + part.index = frame.index + _require_finite_numeric(part, label="encoded QRF predictors") + out.append(part) + start += length + return tuple(out) def _encode_predictor_pair( train: pd.DataFrame, target: pd.DataFrame, ) -> tuple[pd.DataFrame, pd.DataFrame]: - combined = pd.concat( - [train.reset_index(drop=True), target.reset_index(drop=True)], - ignore_index=True, - ) - encoded = pd.get_dummies( - combined, - columns=["gender", "region"], - drop_first=False, - dtype=float, + train_encoded, target_encoded = _encode_predictor_frames( + (train, target), categorical=("gender", "region") ) - encoded = encoded.reindex(sorted(encoded.columns), axis=1) - train_encoded = encoded.iloc[: len(train)].copy() - train_encoded.index = train.index - target_encoded = encoded.iloc[len(train) :].copy() - target_encoded.index = target.index - _require_finite_numeric(train_encoded, label="encoded QRF training predictors") - _require_finite_numeric(target_encoded, label="encoded QRF target predictors") return train_encoded, target_encoded @@ -2140,32 +2612,49 @@ def _refresh_uc_start_up_period( def _refresh_uc_gainful_self_employment( person: pd.DataFrame, *, spi_people: pd.Series -) -> pd.DataFrame: - """Derive a redrawn row's UC gainful self-employment from its drawn incomes. - - A redrawn row keeps the donor's employment status but takes new imputed - pay and profit, and the draw does not read the status (uk-data#529, - microcosm#840): on such a row the status says nothing about the drawn - trade. So the row takes the earnings route of the root's rule alone, a - profit above zero and above its pay (uk-data#525, ADM H4034). The main-job - route returns when the SPI draw follows employment status. +) -> tuple[pd.DataFrame, dict[str, object] | None]: + """Derive a drawn row's UC gainful self-employment from the root's rule. + + A drawn row keeps its twin's employment status and takes pay and profit + drawn at the twin's rank given that status (``has_trade`` conditions the + draw; microcosm#840), so the root's rule applies whole: a self-employed + main job whatever its profit, or a side trade whose profit is above zero + and above the row's pay (uk-data#525, ADM H4034). An undrawn copy keeps + its twin's flag with its twin's incomes. The receipt counts the rows each + route flags. """ if "uc_is_in_gainful_self_employment" not in person.columns: - return person + return person, None rows = person.loc[spi_people] + main_job = rows["employment_status"].astype(str).isin(SELF_EMPLOYED_STATUSES) + main_job = main_job.to_numpy(dtype=bool) + profit = pd.to_numeric(rows["self_employment_income"], errors="coerce").fillna(0.0) + pay = pd.to_numeric(rows["employment_income"], errors="coerce").fillna(0.0) + earnings_route = uc_gainful_self_employment( + np.zeros(len(rows), dtype=bool), profit, pay + ) + flagged = uc_gainful_self_employment(main_job, profit, pay) _assign_spi_values( person, spi_people, "uc_is_in_gainful_self_employment", - uc_gainful_self_employment( - np.zeros(len(rows), dtype=bool), - pd.to_numeric(rows["self_employment_income"], errors="coerce").fillna(0.0), - pd.to_numeric(rows["employment_income"], errors="coerce").fillna(0.0), - ), + flagged, default=False, ) - return person + receipt = { + "rule": ( + "self-employed main job (FT_SELF_EMPLOYED or PT_SELF_EMPLOYED) whatever " + "its profit, or a profit above zero and above pay; undrawn copies keep " + "their twin's flag" + ), + "rows": int(len(rows)), + "flagged_rows": int(flagged.sum()), + "main_job_route_rows": int(main_job.sum()), + "earnings_route_rows": int(earnings_route.sum()), + "main_job_route_only_rows": int((flagged & ~earnings_route).sum()), + } + return person, receipt def _refresh_landlord_carrier( @@ -2222,6 +2711,7 @@ def _assign_spi_values( "SPI_DONOR_UKDS_STUDY", "SPI_DONOR_VINTAGE", "SPI_DONOR_REQUIRED_COLUMNS", + "SPI_INCOME_RECIPIENT_COLUMN", "SPI_INCOME_SOURCE_COLUMNS", "SPI_DERIVED_POLICYENGINE_SOURCE_COLUMNS", "SPI_DONOR_DOCUMENTATION_URL", @@ -2242,6 +2732,16 @@ def _assign_spi_values( "SPI_SOURCE_TI_FORMULA", "SPI_STAGE2_REVIEWED_ABSENT_OUTPUTS", "SPI_TI_IDENTITY_ABS_TOLERANCE_GBP", + "SPI_BRIDGE_PREDICTOR_COLUMNS", + "SPI_INDICATOR_CODES", + "SPI_MAINSRCE_CODES", + "SPI_MAIN_SOURCE_LEVELS", + "SPI_MAIN_SOURCE_MINIMUM_AGREEMENT", + "SPI_RECIPIENT_INCOME_RULE", + "SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP", + "SPI_STAGE1_ANALOGUE_COLUMNS", + "SPI_STAGE1_CATEGORICAL_PREDICTORS", + "SPI_STAGE1_PREDICTOR_COLUMNS", "UKSPIIncomeImputationResult", "VerifiedSPIDonorIdentity", "assert_frs_hmrc_auxiliary_crosswalk_available", diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_rank_transport.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_rank_transport.py new file mode 100644 index 0000000000..07125c7896 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_rank_transport.py @@ -0,0 +1,668 @@ +"""Twin-conditional uniforms for the SPI stage-1 draw (microcosm#840). + +The stage-1 forest of ``hmrc_spi_income_spine`` draws each SPI-channel +recipient's income leaves from the SPI tape conditioned on the stage-1 +predictors. Which quantile of that conditional a recipient received used to be +a model random number, so the recipient's own observed income, its FRS twin's, +carried nothing into the draw: a lone parent on a low wage drew the pay of a +random taxpayer of her age, gender and region. This module supplies the +quantiles instead. A reference forest fitted on the FRS base rows with the same +predictors and chain order locates each twin's observed leaves on the FRS +conditional (:meth:`microcosm.fit.FittedRegimeGatedQRF.conditional_uniforms`, +a Rosenblatt transform: the sign uniform is the twin's position in the gate's +cumulative class probabilities, the quantile its position on the sign's +magnitude forest, each leaf chained on the twin's observed earlier leaves), and +the stage-1 forest draws at those uniforms. The recipient then receives the SPI +income of someone in the same position among SPI people like it as the twin +holds among FRS people like it: the FRS relation between composition and +income rank is kept, the SPI levels and tail are imported. + +Leaves without an FRS analogue, or whose analogue is degenerate on the FRS +rows, draw at uniforms keyed on the recipient's identity +(:func:`microcosm.build.stochastic_assignment.stable_identity_uniforms`, the +key the band-donor resample uses), as do the placements inside a class or a +flat stretch of a conditional; no model random stream is consumed, so a +recipient's draw depends on its twin and its identity alone, whatever the row +order and whoever else is drawn. + +The reference forest is cross-fitted by predictor cell. A forest's conditional +at a row it was trained on holds that row's own value as an atom, and under +the weighted bootstrap a row's copies fill its own leaves: on the 2024-25 spine +a twin's own value took a median 0.23 (pay) to 0.74 (dividends) of its +conditional's mass, so its located quantile was mostly the random placement +inside that atom and the draw kept under half of the twin's rank within a +cell. The rows are therefore split into folds by a stable hash of their +predictor cell (gender, region, whole-year age and the four bridge +predictors), each fold's recipients are located by a forest fitted on the +other folds, and because a copy shares its twin's cell, the forest that +locates it never saw the twin. Keying the folds on the cell rather than the +row keeps every row of a cell on one forest, so the located quantiles stay +monotone in the twin's value within the cell. +""" + +from __future__ import annotations + +from collections.abc import Mapping, Sequence +from dataclasses import dataclass +from typing import Any + +import numpy as np +import pandas as pd + +from microcosm.build.stochastic_assignment import stable_identity_uniforms +from microcosm.build.uk_runtime.frs_hmrc_source import ( + FRS_HMRC_INCPBEN_COLUMN, + FRS_HMRC_OSSBEN_IDENTIFIABLE_SUBSET_COLUMN, + FRS_HMRC_PAY_COLUMN, + FRS_HMRC_SRP_REGULAR_CODE5_COLUMN, + FRS_HMRC_UBISJA_COLUMN, +) +from microcosm.build.uk_runtime.spi_support import ( + SPI_HMRC_EMPLOYMENT_BENEFITS_COLUMN, + SPI_HMRC_EMPLOYMENT_EXPENSES_COLUMN, + SPI_HMRC_INCAPACITY_BENEFIT_INCOME_COLUMN, + SPI_HMRC_MISCELLANEOUS_EMPLOYMENT_INCOME_COLUMN, + SPI_HMRC_OTHER_INCOME_COLUMN, + SPI_HMRC_OTHER_SOCIAL_SECURITY_INCOME_COLUMN, + SPI_HMRC_PAY_COLUMN, + SPI_HMRC_STATE_PENSION_INCOME_COLUMN, + SPI_HMRC_TAXABLE_TERMINATION_PAY_COLUMN, + SPI_HMRC_UNEMPLOYMENT_BENEFIT_INCOME_COLUMN, + SPI_INCOME_QRF_OUTPUT_COLUMNS, + SPI_PROPERTY_FINANCE_COSTS_COLUMN, +) + +#: The reference forest's fit-weight record name. +SPI_TRANSPORT_FIT_NAME = "uk_frs_reference_conditional" +#: The reference forest's seed is the stage seed plus this offset: stage 1 is +#: the seed, stage 2 the seed + 1 and the band-donor resample the seed + 2. +SPI_TRANSPORT_SEED_OFFSET = 3 +#: The manifest's name for this draw. +SPI_TRANSPORT_DRAW = "twin_conditional_quantiles" +#: Identity-keyed uniforms are salted ``::``. +SPI_TRANSPORT_SALT = "spi_stage1" +#: The identity a recipient's uniforms are keyed on: the FRS person it copies. +SPI_TRANSPORT_KEY_COLUMN = "person_source_id" +#: Taxable savings interest on the twin: the FRS gross interest less the +#: tax-free part, the concept the tape's INCBBS leaf holds. +TAXABLE_SAVINGS_INTEREST_ANALOGUE = "taxable_savings_interest" +#: Per-group uniformity is reported only over at least this many rows. +SPI_TRANSPORT_GROUP_MINIMUM_ROWS = 10 +#: The reference forest is cross-fitted in this many folds keyed on the +#: predictor cell; a frame with fewer distinct cells uses one fold per cell. +SPI_TRANSPORT_FOLDS = 5 +#: The fold draw's salt; the fold of a cell is ``floor(uniform * folds)``. +SPI_TRANSPORT_FOLD_SALT = "spi_stage1:reference_fold" +#: The columns whose values name a predictor cell, age at the whole year. +SPI_TRANSPORT_CELL_COLUMNS = ( + "gender", + "region", + "age", + "main_source", + "has_pay", + "has_trade", + "at_or_over_spa", +) + +#: The FRS twin's analogue of every stage-1 output (``None``: no analogue, the +#: leaf draws at identity-keyed uniforms). The analogue is the column on the +#: FRS rows that holds the same concept the tape leaf holds, or a retained +#: FRS leaf crosswalked to it by ``frs_hmrc_spine_leaves``. +SPI_STAGE1_ANALOGUE_COLUMNS: Mapping[str, str | None] = { + "self_employment_income": "self_employment_income", + "savings_interest_income": TAXABLE_SAVINGS_INTEREST_ANALOGUE, + "dividend_income": "dividend_income", + "private_pension_income": "private_pension_income", + "property_income": "property_income", + "other_investment_income": None, + "gift_aid": None, + "charitable_investment_gifts": None, + SPI_HMRC_PAY_COLUMN: FRS_HMRC_PAY_COLUMN, + SPI_HMRC_EMPLOYMENT_BENEFITS_COLUMN: None, + SPI_HMRC_EMPLOYMENT_EXPENSES_COLUMN: None, + SPI_HMRC_INCAPACITY_BENEFIT_INCOME_COLUMN: FRS_HMRC_INCPBEN_COLUMN, + SPI_HMRC_OTHER_SOCIAL_SECURITY_INCOME_COLUMN: ( + FRS_HMRC_OSSBEN_IDENTIFIABLE_SUBSET_COLUMN + ), + SPI_HMRC_TAXABLE_TERMINATION_PAY_COLUMN: None, + SPI_HMRC_UNEMPLOYMENT_BENEFIT_INCOME_COLUMN: FRS_HMRC_UBISJA_COLUMN, + SPI_HMRC_MISCELLANEOUS_EMPLOYMENT_INCOME_COLUMN: None, + SPI_HMRC_OTHER_INCOME_COLUMN: "miscellaneous_income", + SPI_HMRC_STATE_PENSION_INCOME_COLUMN: FRS_HMRC_SRP_REGULAR_CODE5_COLUMN, + # Restricted finance costs reach the FRS rows only at property_components, + # after this stage, so the twin has no analogue to locate (microcosm#1106). + SPI_PROPERTY_FINANCE_COSTS_COLUMN: None, +} + + +@dataclass(frozen=True) +class SPITransportResult: + """The stage-1 uniforms per target and the receipt that explains them.""" + + quantiles: dict[str, np.ndarray] + sign_uniforms: dict[str, np.ndarray] + receipt: dict[str, Any] + + +def assert_analogue_map_covers(outputs: Sequence[str]) -> None: + """Refuse a stage-1 output surface the analogue map does not name. + + A new stage-1 leaf must say whether the twin carries its concept; a leaf + drawn at identity uniforms by default would silently lose the twin's + standing on it. + """ + + declared = set(SPI_STAGE1_ANALOGUE_COLUMNS) + expected = set(outputs) + if declared != expected: + raise ValueError( + "SPI stage-1 analogue map does not cover the stage-1 outputs: " + f"unmapped {sorted(expected - declared)}, " + f"stale {sorted(declared - expected)}." + ) + + +def analogue_targets( + outputs: Sequence[str] = SPI_INCOME_QRF_OUTPUT_COLUMNS, +) -> tuple[str, ...]: + """The stage-1 outputs with an FRS analogue, in stage-1 chain order.""" + + return tuple( + target for target in outputs if SPI_STAGE1_ANALOGUE_COLUMNS.get(target) + ) + + +def analogue_source_columns() -> tuple[str, ...]: + """The FRS person columns the analogues read.""" + + columns = { + column + for column in SPI_STAGE1_ANALOGUE_COLUMNS.values() + if column and column != TAXABLE_SAVINGS_INTEREST_ANALOGUE + } + columns |= {"savings_interest_income", "tax_free_savings_income"} + return tuple(sorted(columns)) + + +def observed_analogues( + person: pd.DataFrame, + outputs: Sequence[str] = SPI_INCOME_QRF_OUTPUT_COLUMNS, +) -> pd.DataFrame: + """The twin's observed values of every analogue target, named by target. + + Rows are FRS persons (the twins, or the SPI copies before the draw, which + still carry the twin's values). Taxable savings interest is derived as the + gross FRS interest less the tax-free part, floored at zero. + """ + + missing = sorted(set(analogue_source_columns()) - set(person.columns)) + if missing: + raise ValueError(f"SPI transport analogues are missing column(s): {missing}.") + taxable_interest = np.maximum( + pd.to_numeric(person["savings_interest_income"], errors="coerce").to_numpy( + dtype=np.float64, na_value=np.nan + ) + - pd.to_numeric(person["tax_free_savings_income"], errors="coerce").to_numpy( + dtype=np.float64, na_value=np.nan + ), + 0.0, + ) + observed = pd.DataFrame(index=person.index) + for target in analogue_targets(outputs): + column = SPI_STAGE1_ANALOGUE_COLUMNS[target] + if column == TAXABLE_SAVINGS_INTEREST_ANALOGUE: + observed[target] = taxable_interest + else: + observed[target] = pd.to_numeric(person[column], errors="coerce").to_numpy( + dtype=np.float64, na_value=np.nan + ) + values = observed.to_numpy(dtype=np.float64) + if not np.isfinite(values).all(): + bad = [ + str(column) + for position, column in enumerate(observed.columns) + if not np.isfinite(values[:, position]).all() + ] + raise ValueError(f"SPI transport analogues are not finite: {bad}.") + return observed + + +def cell_fold_ids( + predictors: pd.DataFrame, *, folds: int, seed: int, used: int | None = None +) -> tuple[np.ndarray, int]: + """Assign every row to a fold by a stable hash of its predictor cell. + + ``predictors`` holds the raw (unencoded) stage-1 predictors; a cell is the + tuple of :data:`SPI_TRANSPORT_CELL_COLUMNS` with age at the whole year. + The fold is ``floor(uniform * used)`` of the cell's identity-keyed + uniform, so two frames whose rows share a cell share its fold. ``used`` + is ``folds`` capped at the number of distinct cells in ``predictors``, or + the caller's value (the training frame's) for a second frame. + """ + + if not isinstance(folds, int) or folds <= 0: + raise ValueError("folds must be a positive integer.") + missing = sorted(set(SPI_TRANSPORT_CELL_COLUMNS) - set(predictors.columns)) + if missing: + raise ValueError(f"fold cells need predictor column(s) {missing}.") + cells = predictors[list(SPI_TRANSPORT_CELL_COLUMNS)].copy() + cells["age"] = np.floor( + pd.to_numeric(cells["age"], errors="coerce").to_numpy(dtype=np.float64) + ) + keys = cells.astype(str).agg("|".join, axis=1).to_numpy() + if used is None: + used = min(folds, len(set(keys.tolist()))) + if not isinstance(used, int) or used <= 0: + raise ValueError("used must be a positive integer.") + uniforms = stable_identity_uniforms(keys, seed=seed, salt=SPI_TRANSPORT_FOLD_SALT) + return np.minimum((uniforms * used).astype(np.int64), used - 1), used + + +def cross_fit_transport( + fit_reference: Any, + *, + training_predictors: pd.DataFrame, + encoded_training: pd.DataFrame, + training_observed: pd.DataFrame, + training_folds: np.ndarray, + training_identities: np.ndarray, + used: int, + recipient_predictors: pd.DataFrame, + encoded_recipients: pd.DataFrame, + observed: pd.DataFrame, + identities: np.ndarray, + groups: np.ndarray | None, + seed: int, + folds: int, + allow_in_sample: bool = False, + outputs: Sequence[str] = SPI_INCOME_QRF_OUTPUT_COLUMNS, +) -> SPITransportResult: + """Locate every recipient on a reference forest that never saw its cell. + + ``fit_reference(encoded, observed)`` fits one reference forest on the given + training rows and returns it (its ``targets`` are :func:`analogue_targets`). + ``training_folds`` assigns the training rows to folds + (:func:`cell_fold_ids`); recipients take the fold of their own cell, so the + forest that locates a copy was fitted without its twin. Each fold's + recipients are located by :func:`transport_uniforms`; the receipt is + assembled over every recipient and names the folds. + """ + + assert_analogue_map_covers(outputs) + n = len(encoded_recipients) + identities = np.asarray(identities) + if identities.shape != (n,): + raise ValueError("SPI transport identities must have one entry per recipient.") + if len(observed) != n or not observed.index.equals(encoded_recipients.index): + raise ValueError("SPI transport observed analogues must align to recipients.") + if len(training_folds) != len(encoded_training): + raise ValueError("training folds must align to the training rows.") + training_identities = np.asarray(training_identities) + if training_identities.shape != (len(encoded_training),): + raise ValueError("training identities must align to the training rows.") + if not isinstance(used, int) or used <= 0: + raise ValueError("used must be a positive integer.") + if len(training_folds) and int(training_folds.max()) >= used: + raise ValueError("training folds must lie below the fold count used.") + # The training rows' folds and the recipients' come from the same draw + # over the same cells at the same fold count, so a recipient's fold is its + # twin's fold; the twins the training rows hold are checked, so a cell + # value that moved between twin and copy cannot put a twin's forest on + # its copy. + recipient_folds, _ = cell_fold_ids( + recipient_predictors, folds=folds, seed=seed, used=used + ) + twin_folds = pd.Series(training_folds, index=training_identities) + if not twin_folds.index.is_unique: + raise ValueError("training identities must be unique (one row per twin).") + twins = twin_folds.reindex(identities) + known = twins.notna().to_numpy() + if known.any() and not np.array_equal( + twins.to_numpy()[known].astype(np.int64), recipient_folds[known] + ): + raise ValueError( + "a recipient's fold differs from its twin's: the fold-key cell values " + "moved between the twin and the copy, so the hold-out would not hold." + ) + # With one fold (a frame of one predictor cell) there is nothing to hold + # out: only a sampled rung or a synthetic fixture may locate in-sample, + # and the receipt says so. + cross_fitted = used > 1 + if not cross_fitted and not allow_in_sample: + raise ValueError( + "the SPI reference forest cannot be cross-fitted: the training rows " + "fill one fold. In-sample location is allowed only on a sampled rung " + "or a synthetic fixture (allow_in_sample)." + ) + quantiles = {target: np.empty(n, dtype=np.float64) for target in outputs} + sign_uniforms = {target: np.empty(n, dtype=np.float64) for target in outputs} + fold_receipts: dict[str, dict[str, Any]] = {} + in_sample_folds: list[int] = [] + regimes_by_fold: dict[str, list[str | None]] = {target: [] for target in outputs} + classes_by_fold: dict[str, list[tuple[int, ...]]] = { + target: [] for target in outputs + } + degenerate_rows = dict.fromkeys(outputs, 0) + for fold in range(used): + score = np.flatnonzero(recipient_folds == fold) + if score.size == 0: + continue + train = ( + np.flatnonzero(training_folds != fold) + if cross_fitted + else np.arange(len(encoded_training)) + ) + if train.size == 0: + # A frame too small for the hash to fill every fold's complement + # (the synthetic fixtures): this fold's recipients are located + # in-sample, and the receipt names the fold. + if not allow_in_sample: + raise ValueError( + f"SPI reference fold {fold} leaves no training rows to fit " + "on; in-sample location is allowed only on a sampled rung " + "or a synthetic fixture (allow_in_sample)." + ) + train = np.arange(len(encoded_training)) + in_sample_folds.append(int(fold)) + reference = fit_reference( + encoded_training.iloc[train], training_observed.iloc[train] + ) + part = transport_uniforms( + reference, + encoded_recipients=encoded_recipients.iloc[score], + observed=observed.iloc[score], + identities=identities[score], + groups=None, + seed=seed, + outputs=outputs, + ) + for target in outputs: + quantiles[target][score] = part.quantiles[target] + sign_uniforms[target][score] = part.sign_uniforms[target] + regimes_by_fold[target].append( + part.receipt["targets"][target]["reference_regime"] + ) + fold_classes = part.receipt["targets"][target].get("reference_classes") + if fold_classes is not None: + classes_by_fold[target].append(tuple(fold_classes)) + if target in part.receipt["degenerate_targets"]: + degenerate_rows[target] += int(score.size) + fold_receipts[f"fold_{fold}"] = { + "training_rows": int(train.size), + "scored_recipients": int(score.size), + "in_sample": fold in in_sample_folds, + } + shared_identities = int(pd.Series(identities).duplicated().sum()) + targets = analogue_targets(outputs) + target_receipts: dict[str, dict[str, Any]] = {} + for target in outputs: + analogue = SPI_STAGE1_ANALOGUE_COLUMNS[target] + if analogue is None: + source, positive = "identity", None + elif degenerate_rows[target] == n: + source, positive = "identity_degenerate_analogue", None + elif degenerate_rows[target]: + source = "twin_conditional_with_degenerate_folds" + positive = observed[target].to_numpy(dtype=np.float64) > 0.0 + else: + source = "twin_conditional" + positive = observed[target].to_numpy(dtype=np.float64) > 0.0 + regimes = [regime for regime in regimes_by_fold[target] if regime is not None] + distinct_classes = sorted(set(classes_by_fold[target])) + if len(distinct_classes) > 1: + raise ValueError( + f"SPI reference folds disagree on the sign classes of {target!r}: " + f"{distinct_classes}." + ) + target_receipts[target] = { + "analogue": analogue, + "source": source, + "reference_regime": sorted(set(regimes)) if regimes else None, + "reference_classes": ( + list(distinct_classes[0]) if distinct_classes else None + ), + "identity_rows_from_degenerate_folds": int(degenerate_rows[target]), + "kolmogorov": _uniformity( + sign_uniforms[target], quantiles[target], positive + ), + "by_group": _uniformity_by_group( + sign_uniforms[target], quantiles[target], positive, groups + ), + } + receipt = { + "draw": SPI_TRANSPORT_DRAW, + "fit_name": SPI_TRANSPORT_FIT_NAME, + "seed_offset": SPI_TRANSPORT_SEED_OFFSET, + "identity_key": SPI_TRANSPORT_KEY_COLUMN, + "salt": f"{SPI_TRANSPORT_SALT}::", + "seed": int(seed), + "recipients": int(n), + "recipients_sharing_a_twin": shared_identities, + "folds": int(used), + "folds_declared": int(folds), + "cross_fitted": bool(cross_fitted) and not in_sample_folds, + "in_sample_folds": in_sample_folds, + "fold_key": "|".join(SPI_TRANSPORT_CELL_COLUMNS) + " (age at the whole year)", + "fold_salt": SPI_TRANSPORT_FOLD_SALT, + "fold_receipts": fold_receipts, + "analogue_targets": list(targets), + "identity_targets": [ + target for target in outputs if SPI_STAGE1_ANALOGUE_COLUMNS[target] is None + ], + "degenerate_targets": [ + target + for target in outputs + if degenerate_rows[target] == n and SPI_STAGE1_ANALOGUE_COLUMNS[target] + ], + "group_minimum_rows": SPI_TRANSPORT_GROUP_MINIMUM_ROWS, + "targets": target_receipts, + } + return SPITransportResult( + quantiles=quantiles, sign_uniforms=sign_uniforms, receipt=receipt + ) + + +def identity_uniforms( + identities: np.ndarray, *, target: str, part: str, seed: int +) -> np.ndarray: + """The identity-keyed uniform of every recipient for one target and part.""" + + if part not in ("sign", "quantile"): + raise ValueError("part must be 'sign' or 'quantile'.") + return stable_identity_uniforms( + identities, seed=seed, salt=f"{SPI_TRANSPORT_SALT}:{target}:{part}" + ) + + +def transport_uniforms( + reference: Any, + *, + encoded_recipients: pd.DataFrame, + observed: pd.DataFrame, + identities: np.ndarray, + groups: np.ndarray | None, + seed: int, + outputs: Sequence[str] = SPI_INCOME_QRF_OUTPUT_COLUMNS, +) -> SPITransportResult: + """Locate every drawn recipient's twin on the reference forest. + + ``reference`` is the fitted reference forest (predictors: the encoded + stage-1 predictors; targets: :func:`analogue_targets`). ``observed`` holds + the twin's analogue values named by target (:func:`observed_analogues`), + row-aligned with ``encoded_recipients``. ``identities`` keys the placement + and identity uniforms; ``groups`` labels each recipient for the per-group + uniformity receipt (the ``main_source`` bridge level). + """ + + assert_analogue_map_covers(outputs) + n = len(encoded_recipients) + identities = np.asarray(identities) + if identities.shape != (n,): + raise ValueError("SPI transport identities must have one entry per recipient.") + if len(observed) != n or not observed.index.equals(encoded_recipients.index): + raise ValueError("SPI transport observed analogues must align to recipients.") + # Two copies of one FRS person (the band-donor stage stacks further copies + # of base households) share a twin, so they share their uniforms and + # their draws, as they share their band-pool draw; the receipt counts them. + shared_identities = int(pd.Series(identities).duplicated().sum()) + sign_placement = { + target: identity_uniforms(identities, target=target, part="sign", seed=seed) + for target in outputs + } + quantile_placement = { + target: identity_uniforms(identities, target=target, part="quantile", seed=seed) + for target in outputs + } + targets = analogue_targets(outputs) + if tuple(reference.targets) != targets: + raise ValueError( + "SPI reference forest targets drifted from the analogue targets: " + f"{list(reference.targets)} != {list(targets)}." + ) + located = reference.conditional_uniforms( + pd.concat([encoded_recipients, observed[list(targets)]], axis=1), + sign_placement={target: sign_placement[target] for target in targets}, + quantile_placement={target: quantile_placement[target] for target in targets}, + ) + regimes = dict(reference.regimes()) + # The sign classes the reference's gate orders; None for a degenerate + # analogue, whose uniforms are placements rather than located positions. + classes = { + target: ( + None + if target in located.degenerate + else [int(value) for value in reference.sign_classes(target)] + ) + for target in targets + } + quantiles: dict[str, np.ndarray] = {} + sign_uniforms: dict[str, np.ndarray] = {} + target_receipts: dict[str, dict[str, Any]] = {} + for target in outputs: + analogue = SPI_STAGE1_ANALOGUE_COLUMNS[target] + if analogue is None: + quantiles[target] = quantile_placement[target] + sign_uniforms[target] = sign_placement[target] + source = "identity" + positive = None + else: + quantiles[target] = np.asarray(located.quantiles[target], dtype=np.float64) + sign_uniforms[target] = np.asarray( + located.sign_uniforms[target], dtype=np.float64 + ) + source = ( + "identity_degenerate_analogue" + if target in located.degenerate + else "twin_conditional" + ) + positive = observed[target].to_numpy(dtype=np.float64) > 0.0 + target_receipts[target] = { + "analogue": analogue, + "source": source, + "reference_regime": regimes.get(target), + "reference_classes": classes.get(target), + "kolmogorov": _uniformity( + sign_uniforms[target], quantiles[target], positive + ), + "by_group": _uniformity_by_group( + sign_uniforms[target], quantiles[target], positive, groups + ), + } + receipt = { + "draw": SPI_TRANSPORT_DRAW, + "fit_name": SPI_TRANSPORT_FIT_NAME, + "seed_offset": SPI_TRANSPORT_SEED_OFFSET, + "identity_key": SPI_TRANSPORT_KEY_COLUMN, + "salt": f"{SPI_TRANSPORT_SALT}::", + "seed": int(seed), + "recipients": int(n), + "recipients_sharing_a_twin": shared_identities, + "analogue_targets": list(targets), + "identity_targets": [ + target for target in outputs if SPI_STAGE1_ANALOGUE_COLUMNS[target] is None + ], + "degenerate_targets": list(located.degenerate), + "ungated_targets": list(located.ungated), + "group_minimum_rows": SPI_TRANSPORT_GROUP_MINIMUM_ROWS, + "targets": target_receipts, + } + return SPITransportResult( + quantiles=quantiles, sign_uniforms=sign_uniforms, receipt=receipt + ) + + +def _kolmogorov(values: np.ndarray) -> float | None: + """The Kolmogorov distance of ``values`` from U[0, 1).""" + + values = np.sort(np.asarray(values, dtype=np.float64)) + n = len(values) + if n == 0: + return None + steps = np.arange(1, n + 1, dtype=np.float64) / n + return float( + max(np.abs(steps - values).max(), np.abs(values - (steps - 1.0 / n)).max()) + ) + + +def _uniformity( + sign: np.ndarray, quantile: np.ndarray, positive: np.ndarray | None +) -> dict[str, Any]: + """Uniformity of the sign uniforms, and of the quantiles over positive rows.""" + + rows = np.ones(len(sign), dtype=bool) if positive is None else positive + positive_rows = int(rows.sum()) + return { + "rows": int(len(sign)), + "sign": _kolmogorov(sign), + # A count under the group floor is not reported (CD171 5.2.1), as the + # by-group receipt withholds a small group. + "positive_rows": ( + positive_rows if positive_rows >= SPI_TRANSPORT_GROUP_MINIMUM_ROWS else None + ), + "quantile": _kolmogorov(quantile[rows]) if rows.any() else None, + } + + +def _uniformity_by_group( + sign: np.ndarray, + quantile: np.ndarray, + positive: np.ndarray | None, + groups: np.ndarray | None, +) -> dict[str, Any] | None: + if groups is None: + return None + groups = np.asarray(groups) + out: dict[str, Any] = {} + for label in sorted({str(value) for value in groups.tolist()}): + mask = groups.astype(str) == label + if int(mask.sum()) < SPI_TRANSPORT_GROUP_MINIMUM_ROWS: + out[label] = None + continue + out[label] = _uniformity( + sign[mask], quantile[mask], None if positive is None else positive[mask] + ) + return out + + +__all__ = [ + "SPI_STAGE1_ANALOGUE_COLUMNS", + "SPI_TRANSPORT_CELL_COLUMNS", + "SPI_TRANSPORT_FOLDS", + "SPI_TRANSPORT_FOLD_SALT", + "cell_fold_ids", + "cross_fit_transport", + "SPI_TRANSPORT_DRAW", + "SPI_TRANSPORT_FIT_NAME", + "SPI_TRANSPORT_GROUP_MINIMUM_ROWS", + "SPI_TRANSPORT_KEY_COLUMN", + "SPI_TRANSPORT_SALT", + "SPI_TRANSPORT_SEED_OFFSET", + "SPITransportResult", + "TAXABLE_SAVINGS_INTEREST_ANALOGUE", + "analogue_source_columns", + "analogue_targets", + "assert_analogue_map_covers", + "identity_uniforms", + "observed_analogues", + "transport_uniforms", +] diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py index c1ac147f21..99640a6290 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/spi_spine.py @@ -61,10 +61,14 @@ SPI_DONOR_INCOME_YEAR, SPI_INCOME_BAND_CARRIER_KEY_COLUMN, SPI_INCOME_BAND_DONOR_LEAF_DRAW_SALT, + SPI_INCOME_RECIPIENT_COLUMN, SPI_INCOME_UPRATING_VARIABLES, SPI_MINIMUM_RECIPIENT_AGE, SPI_RECIPIENT_ROLE_COLUMN, + SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP, SPI_SOURCE_TI_FORMULA, + SPI_STAGE1_CATEGORICAL_PREDICTORS, + SPI_STAGE1_PREDICTOR_COLUMNS, SPI_STAGE2_REVIEWED_ABSENT_OUTPUTS, UKSPIIncomeImputationResult, UKSPIStatePensionAgeGuard, @@ -73,6 +77,14 @@ load_spi_donor_age_model, verify_spi_donor_identity, ) +from microcosm.build.uk_runtime.spi_rank_transport import ( + SPI_STAGE1_ANALOGUE_COLUMNS, + SPI_TRANSPORT_DRAW, + SPI_TRANSPORT_FOLDS, + SPI_TRANSPORT_KEY_COLUMN, + SPI_TRANSPORT_SALT, + SPI_TRANSPORT_SEED_OFFSET, +) from microcosm.build.uk_runtime.spi_support import ( DEFAULT_SPI_PRIOR_MASS_SHARE, DEFAULT_SPI_SUPPORT_HOUSEHOLDS, @@ -183,11 +195,18 @@ SPI_HMRC_OTHER_INCOME_COLUMN, SPI_HMRC_STATE_PENSION_INCOME_COLUMN, *SPI_HMRC_DERIVED_AUXILIARY_COLUMNS, + # The rows stage 1 drew, for the later stages that tell tape-concept rows + # from FRS-concept ones (microcosm#840). + SPI_INCOME_RECIPIENT_COLUMN, ) UK_SPI_INCOME_SPINE_NONNEGATIVE_OUTPUT_COLUMNS = tuple( column for column in UK_SPI_INCOME_SPINE_OUTPUT_COLUMNS - if column != SPI_HMRC_MISCELLANEOUS_EMPLOYMENT_INCOME_COLUMN + if column + not in ( + SPI_HMRC_MISCELLANEOUS_EMPLOYMENT_INCOME_COLUMN, + SPI_INCOME_RECIPIENT_COLUMN, + ) ) UK_SPI_INCOME_SPINE_REWRITE_COLUMNS = ( "employment_income", @@ -237,7 +256,18 @@ # applies to every declared parameter: it needs (1) a drift assert and (2) an # executed-effect receipt, or an explicit absence statement. Seeded draws use # twin-build determinism as their executed-effect receipt. -SPI_SPINE_STAGE1_PREDICTORS = ("age", "gender", "region") +#: Age, gender and region, then the four bridge predictors the tape and the +#: twin derive from their own leaves (microcosm#840). +SPI_SPINE_STAGE1_PREDICTORS = SPI_STAGE1_PREDICTOR_COLUMNS +SPI_SPINE_STAGE1_CATEGORICAL_PREDICTORS = SPI_STAGE1_CATEGORICAL_PREDICTORS +#: The stage-1 draw: each drawn recipient's twin is located on the FRS +#: reference forest and the tape forest draws at those uniforms. +SPI_SPINE_STAGE1_DRAW = SPI_TRANSPORT_DRAW +SPI_SPINE_REFERENCE_POPULATION = ( + "uk_frs_raw_spine_base_support_channel claimants and partners " + "(is_uc_claimant) aged 16 and over with taxable income under " + "recipient_income_rule" +) SPI_SPINE_STAGE2_PREDICTORS = ( "age", "gender", @@ -326,6 +356,10 @@ def evidence(self) -> dict[str, object]: "recipient_minimum_age": SPI_MINIMUM_RECIPIENT_AGE, "recipient_role_column": SPI_RECIPIENT_ROLE_COLUMN, "recipient_domain": self.imputation.recipient_domain, + "state_pension_age": self.imputation.state_pension_age, + "bridge_validation": self.imputation.bridge_validation, + "stage1_transport": self.imputation.stage1_transport, + "reference_training_rows": self.imputation.reference_training_rows, "pension_receipt_bridge": self.imputation.pension_receipt_bridge, "income_uprating": self.imputation.income_uprating, "band_donor_resample": self.imputation.band_donor_resample, @@ -333,6 +367,9 @@ def evidence(self) -> dict[str, object]: "donor_property_finance_costs": ( self.imputation.donor_property_finance_costs ), + "gainful_self_employment_refresh": ( + self.imputation.gainful_self_employment_refresh + ), "state_pension_age_guard": list(self.imputation.state_pension_age_guard), "targets": { "count": len(self.source_targets.targets), @@ -718,6 +755,9 @@ def __call__(self, frame: Frame) -> Frame: seed=self.seed, n_estimators=self.qrf_estimators, donor_sample_size=self.donor_sample_size, + # A sampled rung or a synthetic fixture may hold too few predictor + # cells to cross-fit the reference; a full build never does. + allow_in_sample_reference=self.sampled_rung, build_period=uk_time_period(frame), verified_donor=donor_identity, donor_table=self.donor_table, @@ -736,6 +776,9 @@ def __call__(self, frame: Frame) -> Frame: band_donor_resample=band_donor_resample, donor_age_model=donor_age_model if age_op is not None else None, state_pension_age_guard=state_pension_age_guard, + state_pension_age=( + None if donor_age_model is None else donor_age_model.state_pension_age + ), ) result_frame = uk_national_frame( person=imputation.person, @@ -962,8 +1005,14 @@ def _build_spine_replay_report( for record in imputation.fit_weight_records }, "donor_rows": imputation.donor_rows, + "reference_training_rows": imputation.reference_training_rows, "stage2_training_rows": imputation.stage2_training_rows, "spi_prediction_rows": imputation.spi_prediction_rows, + "stage1_draw": SPI_SPINE_STAGE1_DRAW, + "stage1_transport": imputation.stage1_transport, + "bridge_validation": imputation.bridge_validation, + "recipient_domain": imputation.recipient_domain, + "gainful_self_employment_refresh": imputation.gainful_self_employment_refresh, "post_draw_identity": { "formula": SPI_SOURCE_TI_FORMULA, "rows_checked": identity_rows, @@ -1111,6 +1160,59 @@ def _assert_income_stage_parameters( raise ValueError("SPI income donor bootstrap must refit at uniform weight.") if tuple(stage1.parameters.get("predictors", ())) != SPI_SPINE_STAGE1_PREDICTORS: raise ValueError("SPI income stage-1 predictors drifted.") + if ( + tuple(stage1.parameters.get("categorical_predictors", ())) + != SPI_SPINE_STAGE1_CATEGORICAL_PREDICTORS + ): + raise ValueError("SPI income stage-1 categorical predictors drifted.") + bridge = stage1.parameters.get("bridge_predictors") + if not isinstance(bridge, Mapping) or set(bridge) != set( + SPI_SPINE_STAGE1_PREDICTORS[3:] + ): + raise ValueError( + "SPI income stage-1 bridge predictors drifted from the reviewed set " + "(microcosm#840)." + ) + rule = stage1.parameters.get("recipient_income_rule") + if ( + not isinstance(rule, Mapping) + or rule.get("unearned_income_floor_gbp") + != SPI_RECIPIENT_UNEARNED_INCOME_FLOOR_GBP + ): + raise ValueError( + "SPI income recipient income rule drifted from the reviewed floor " + "(microcosm#840)." + ) + if stage1.parameters.get("draw") != SPI_SPINE_STAGE1_DRAW: + raise ValueError("SPI income stage-1 draw drifted from the reviewed method.") + reference = stage1.parameters.get("reference_model") + if not isinstance(reference, Mapping): + raise ValueError("SPI income stage-1 reference model is not declared.") + if reference.get("seed") != seed + SPI_TRANSPORT_SEED_OFFSET: + raise ValueError( + "SPI reference forest seed drifted from the reviewed seed + 3 " + "derivation convention." + ) + if reference.get("n_estimators") not in (None, qrf_estimators): + raise ValueError("SPI reference forest estimator count drifted.") + if reference.get("population") != SPI_SPINE_REFERENCE_POPULATION: + raise ValueError("SPI reference forest population drifted.") + if reference.get("folds") != SPI_TRANSPORT_FOLDS: + raise ValueError( + "SPI reference forest fold count drifted from the reviewed cross-fit." + ) + if dict(reference.get("analogue_columns", {})) != dict(SPI_STAGE1_ANALOGUE_COLUMNS): + raise ValueError( + "SPI reference forest analogue columns drifted from the reviewed map." + ) + identity = stage1.parameters.get("identity_uniforms") + if ( + not isinstance(identity, Mapping) + or identity.get("key") != SPI_TRANSPORT_KEY_COLUMN + or identity.get("seed") != seed + or identity.get("salt") != f"{SPI_TRANSPORT_SALT}::" + ): + raise ValueError("SPI income stage-1 identity uniforms drifted.") if stage1.parameters.get("recipient_minimum_age") != SPI_MINIMUM_RECIPIENT_AGE: raise ValueError("SPI income recipient age domain drifted.") if stage1.parameters.get("recipient_role_column") != SPI_RECIPIENT_ROLE_COLUMN: diff --git a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py index fd0f37fc1c..35a57a68d8 100644 --- a/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py +++ b/packages/microcosm-build/src/microcosm/build/uk_runtime/terminal_gates.py @@ -302,6 +302,7 @@ def __post_init__(self) -> None: "person.would_claim_marriage_allowance", "person.would_claim_scp", "person.person_is_spi_income_band_carrier", + "person.person_is_spi_income_recipient", # microcosm#1063 c9 (ruling 2026-10-02): every declared stage output the # enhanced-FRS incumbent never carried is allow-listed rather than # dropped, so the release candidate ships the spine's own surface. The diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py b/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py index 625035022d..7dcf7f2958 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_spi_income.py @@ -31,7 +31,13 @@ def test_spi_preserves_observed_children_outside_the_donor_age_domain( _bypass_reviewed_donor_identity(monkeypatch) result = impute_uk_spi_income_support( - support, donor_path, seed=9, n_estimators=3, donor_sample_size=None + support, + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) pd.testing.assert_series_equal( @@ -63,7 +69,13 @@ def test_spi_rebases_income_before_frs_fill_and_preserves_child_inputs( lambda year: (factors, {"from_period": 2022, "to_period": year}), raising=False, ) - options = dict(seed=9, n_estimators=3, donor_sample_size=None) + options = dict( + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) reference = impute_uk_spi_income_support(support, donor_path, **options) result = impute_uk_spi_income_support( support, @@ -95,29 +107,36 @@ def test_child_exclusion_keeps_the_other_recipients_draws( ) -> None: """Dropping a recipient leaves every other SPI row's stage-1 draw unchanged. - The forest is queried with the legacy shape (every SPI-channel person) and - the rows outside the recipient domain are discarded afterwards, so the - draw stream each recipient consumes does not depend on who else is in it. - FRS rows are never redrawn. + The forest is queried on the drawn recipients alone and every draw is + keyed on the recipient's identity (its twin's id), so the draw a recipient + receives does not depend on who else is drawn or in what order + (microcosm#840). FRS rows are never redrawn. """ support = _dead_support() donor_path = tmp_path / SPI_DONOR_FILENAME _write_donor(donor_path) - original_predict = _FakeFittedQRF.predict + original_draw = _FakeFittedQRF.predict_from_uniforms - def predict(self, predictors): - result = original_predict(self, predictors) + def predict_from_uniforms(self, predictors, *, quantiles, sign_uniforms): + result = original_draw( + self, predictors, quantiles=quantiles, sign_uniforms=sign_uniforms + ) if "dividend_income" in result: - consumed = getattr(self, "consumed", 0) - result["dividend_income"] = consumed + np.arange(len(result), dtype=float) - self.consumed = consumed + len(result) + # A draw that reads its uniform: the identity-keyed quantile. + result["dividend_income"] = 100.0 * quantiles["dividend_income"] return result - monkeypatch.setattr(_FakeFittedQRF, "predict", predict) + monkeypatch.setattr(_FakeFittedQRF, "predict_from_uniforms", predict_from_uniforms) monkeypatch.setattr(spi_income, "QRF", _FakeQRF) _bypass_reviewed_donor_identity(monkeypatch) - options = dict(seed=9, n_estimators=3, donor_sample_size=None) + options = dict( + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) reference = impute_uk_spi_income_support(support, donor_path, **options) person = support.person.copy() channel = support_channel_column("person") @@ -132,11 +151,19 @@ def predict(self, predictors): reference.person.loc[others, "dividend_income"], candidate.person.loc[others, "dividend_income"], ) + assert reference.person.loc[others, "dividend_income"].nunique() == len(others) base = person[channel].eq("frs") np.testing.assert_array_equal( candidate.person.loc[base, "dividend_income"], support.person.loc[base, "dividend_income"], ) + # Reversing the recipients' order changes no draw either. + reversed_support = replace(support, person=support.person.iloc[::-1].copy()) + reordered = impute_uk_spi_income_support(reversed_support, donor_path, **options) + pd.testing.assert_series_equal( + reordered.person.loc[spi_rows, "dividend_income"], + reference.person.loc[spi_rows, "dividend_income"], + ) def test_dependants_keep_their_twin_values_and_recipients_their_draws( @@ -144,8 +171,9 @@ def test_dependants_keep_their_twin_values_and_recipients_their_draws( ) -> None: """A dependant aged 16 to 19 is not a taxpayer the tape samples. - Neither forest draws for it, so it keeps every value of its FRS twin, and - both forests are still queried over the age domain, so every other + Neither forest draws for it, so it keeps every value of its FRS twin. The + stage-1 draw is keyed on each recipient's identity (microcosm#840) and the + stage-2 forest is still queried over the age domain, so every other recipient keeps the stage-1 and stage-2 draws it had (uk-data#504, microcosm#1095). """ @@ -154,20 +182,37 @@ def test_dependants_keep_their_twin_values_and_recipients_their_draws( donor_path = tmp_path / SPI_DONOR_FILENAME _write_donor(donor_path) original_predict = _FakeFittedQRF.predict + original_draw = _FakeFittedQRF.predict_from_uniforms def predict(self, predictors): result = original_predict(self, predictors) - for target in ("dividend_income", "universal_credit_reported"): - if target in result: - consumed = getattr(self, "consumed", 0) - result[target] = consumed + np.arange(len(result), dtype=float) - self.consumed = consumed + len(result) + if "universal_credit_reported" in result: + consumed = getattr(self, "consumed", 0) + result["universal_credit_reported"] = consumed + np.arange( + len(result), dtype=float + ) + self.consumed = consumed + len(result) + return result + + def predict_from_uniforms(self, predictors, *, quantiles, sign_uniforms): + result = original_draw( + self, predictors, quantiles=quantiles, sign_uniforms=sign_uniforms + ) + if "dividend_income" in result: + result["dividend_income"] = 100.0 * quantiles["dividend_income"] return result monkeypatch.setattr(_FakeFittedQRF, "predict", predict) + monkeypatch.setattr(_FakeFittedQRF, "predict_from_uniforms", predict_from_uniforms) monkeypatch.setattr(spi_income, "QRF", _FakeQRF) _bypass_reviewed_donor_identity(monkeypatch) - options = dict(seed=9, n_estimators=3, donor_sample_size=None) + options = dict( + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) reference = impute_uk_spi_income_support(support, donor_path, **options) person = support.person.copy() channel = support_channel_column("person") @@ -212,7 +257,13 @@ def test_spi_income_refuses_a_frame_without_the_claimant_role( _write_donor(donor_path) monkeypatch.setattr(spi_income, "QRF", _FakeQRF) _bypass_reviewed_donor_identity(monkeypatch) - options = dict(seed=9, n_estimators=3, donor_sample_size=None) + options = dict( + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) missing = replace(support, person=support.person.drop(columns="is_uc_claimant")) with pytest.raises(ValueError, match="is_uc_claimant"): impute_uk_spi_income_support(missing, donor_path, **options) @@ -255,7 +306,9 @@ def fit(self, frame, predictors, targets, *, weights): seed=9, n_estimators=3, donor_sample_size=None, + state_pension_age=66, condition_on_state_pension_receipt=True, + allow_in_sample_reference=True, ) np.testing.assert_array_equal( captured["recipient"], np.arange(result.spi_prediction_rows) % 2 @@ -286,13 +339,36 @@ def test_spi_qrf_stages_use_typed_weights_and_restore_gross_savings( seed=9, n_estimators=3, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) - assert _FakeQRF.fit_weight_kinds == ["design", "importance"] - assert [record.weight_kind for record in result.fit_weight_records] == [ - "design", - "importance", + assert _FakeQRF.fit_weight_kinds == ["design", "importance", "importance"] + assert [ + (record.fit_name, record.weight_kind) for record in result.fit_weight_records + ] == [ + ("uk_spi_2022_23_income", "design"), + ("uk_frs_reference_conditional", "importance"), + ("uk_frs_only_spi_fill", "importance"), + ] + # The reference forest trains on the clone-0 FRS claimants and partners + # with taxable income: two of the fixture's four households are clone 0. + clone_zero = support.household.loc[ + support.household["clone_index"] == 0, "household_id" ] + assert ( + result.reference_training_rows + == int( + ( + (support.person[support_channel_column("person")] == "frs") + & support.person["person_household_id"].isin(clone_zero) + ).sum() + ) + == 2 + ) + assert result.state_pension_age == 66 + assert result.stage1_transport["draw"] == "twin_conditional_quantiles" + assert result.bridge_validation["main_source"]["weighted_agreement"] == 1.0 assert result.reviewed_absent_stage2_outputs == (SPI_STAGE2_REVIEWED_ABSENT_OUTPUTS) assert result.donor_rows == 4 assert len(result.donor_sha256) == 64 @@ -434,6 +510,8 @@ def test_spi_stage2_does_not_require_frs_other_investment_income( seed=9, n_estimators=3, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) channel = support_channel_column("person") @@ -461,6 +539,8 @@ def test_spi_weighted_bootstrap_does_not_apply_fact_twice( support, donor_path, donor_sample_size=8, + state_pension_age=66, + allow_in_sample_reference=True, ) assert result.donor_rows == 8 @@ -497,6 +577,8 @@ def test_the_spi_channel_ships_no_structural_nan_on_the_frs_channel( seed=9, n_estimators=3, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) person = result.person @@ -520,7 +602,9 @@ def test_spi_donor_age_boundary_and_frs_rows_keep_their_reports( support = _dead_support() person = support.person.copy() recipient = person.index[person[support_channel_column("person")].eq(channel)][0] - person.loc[recipient, "age"] = age + # A copy shares its twin's age (the fold-key cell), so the twin moves too. + lineage = person["person_source_id"] == person.loc[recipient, "person_source_id"] + person.loc[lineage, "age"] = age person.loc[recipient, "dividend_income"] = 987.0 person.loc[recipient, "universal_credit_reported"] = 1234.0 support = replace(support, person=person) @@ -535,6 +619,8 @@ def test_spi_donor_age_boundary_and_frs_rows_keep_their_reports( seed=9, n_estimators=3, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) if age == 15 or channel == "frs": @@ -677,3 +763,170 @@ def test_spi_rebasing_index_is_the_projections_except_where_named() -> None: "gov.economic_assumptions.indices.ons.household_interest_income" ) assert savings["factor"] == pytest.approx(2.2692, abs=1e-4) + + +def _zero_taxable_income(person: pd.DataFrame, rows) -> None: + person.loc[ + rows, + [ + "employment_income", + "self_employment_income", + "private_pension_income", + "state_pension_reported", + "savings_interest_income", + "tax_free_savings_income", + "dividend_income", + "property_income", + "miscellaneous_income", + ], + ] = 0.0 + person.loc[rows, "employment_status"] = "UNEMPLOYED" + + +def test_undrawn_twins_keep_their_values_and_are_receipted( + monkeypatch, tmp_path +) -> None: + """A twin with no taxable income has no tape population: its copy is kept.""" + + support = _dead_support() + person = support.person.copy() + channel = support_channel_column("person") + twin = person.index[(person[channel] == "frs") & (person["person_id"] == 101)] + copy = person.index[ + (person[channel] == "spi") & (person["person_source_id"] == 101) + ] + assert len(twin) == 1 and len(copy) == 1 + _zero_taxable_income(person, twin.union(copy)) + support = replace(support, person=person) + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + options = dict( + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) + + result = impute_uk_spi_income_support(support, donor_path, **options) + + kept = [ + column + for column in ( + *SPI_INCOME_QRF_OUTPUT_COLUMNS, + *FRS_ONLY_SPI_FILL_PERSON_COLUMNS, + ) + if column in person.columns + ] + pd.testing.assert_series_equal( + result.person.loc[copy[0], kept], person.loc[copy[0], kept], check_names=False + ) + others = person.index[(person[channel] == "spi") & (person["age"] >= 16)].drop(copy) + assert result.person.loc[others, "gift_aid"].eq(10.0).all() + # The stage flags the rows it drew, and only those, for the later stages + # that tell tape-concept rows from FRS-concept ones. + flag = result.person["person_is_spi_income_recipient"] + assert flag.dtype == bool + assert flag.loc[others].all() + assert not flag.loc[copy[0]] + assert not flag.loc[person[channel] == "frs"].any() + refresh = result.gainful_self_employment_refresh + if "uc_is_in_gainful_self_employment" in person.columns: + assert refresh["rows"] == len(others) + assert refresh["flagged_rows"] >= refresh["main_job_route_only_rows"] + else: + assert refresh is None + domain = result.recipient_domain + assert domain["undrawn_no_taxable_income_rows"] == 1 + copy_household = person.loc[copy[0], "person_household_id"] + assert domain["undrawn_no_taxable_income_weight"] == float( + support.household.set_index("household_id").loc[ + copy_household, "household_weight" + ] + ) + assert domain["recipient_rows"] == len(others) == result.spi_prediction_rows + assert domain["unearned_income_floor_gbp"] == 1_000.0 + assert "no tax record" in domain["income_rule"] + # The reference forest trains on the clone-0 FRS rows with taxable income + # only: two of the fixture's households are clone 0, and one twin is kept. + clone_zero = support.household.loc[ + support.household["clone_index"] == 0, "household_id" + ] + reference_rows = ( + (person[channel] == "frs") + & person["person_household_id"].isin(clone_zero) + & ~person.index.isin(twin) + ) + assert result.reference_training_rows == int(reference_rows.sum()) == 1 + # A reserved band carrier is drawn whatever its twin reports. + carrier = person.copy() + carrier["person_is_spi_income_band_carrier"] = False + carrier.loc[copy, "person_is_spi_income_band_carrier"] = True + drawn = impute_uk_spi_income_support( + replace(support, person=carrier), donor_path, **options + ) + assert drawn.recipient_domain["undrawn_no_taxable_income_rows"] == 0 + assert drawn.recipient_domain["carriers_drawn_without_taxable_income"] == 1 + assert drawn.spi_prediction_rows == len(others) + 1 + + +def test_stage1_queries_only_drawn_recipients_with_the_bridge( + monkeypatch, tmp_path +) -> None: + support = _dead_support() + person = support.person.copy() + channel = support_channel_column("person") + copy = person.index[ + (person[channel] == "spi") & (person["person_source_id"] == 102) + ] + twin = person.index[(person[channel] == "frs") & (person["person_id"] == 102)] + _zero_taxable_income(person, twin.union(copy)) + support = replace(support, person=person) + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + captured: dict[str, object] = {} + original_draw = _FakeFittedQRF.predict_from_uniforms + + def predict_from_uniforms(self, predictors, *, quantiles, sign_uniforms): + captured["columns"] = list(predictors.columns) + captured["rows"] = len(predictors) + captured["sign"] = sign_uniforms["gift_aid"].copy() + return original_draw( + self, predictors, quantiles=quantiles, sign_uniforms=sign_uniforms + ) + + monkeypatch.setattr(_FakeFittedQRF, "predict_from_uniforms", predict_from_uniforms) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + result = impute_uk_spi_income_support( + support, + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) + assert captured["rows"] == result.spi_prediction_rows == 3 + assert {"has_pay", "has_trade", "at_or_over_spa", "main_source_pay", "age"} <= set( + captured["columns"] + ) + # The no-analogue leaf's sign uniform is the identity-keyed one for the + # drawn recipients, in their order. + drawn_ids = result.person.loc[ + (result.person[channel] == "spi") + & result.person["age"].ge(16) + & ~result.person.index.isin(copy), + "person_source_id", + ].to_numpy() + from microcosm.build.uk_runtime.spi_rank_transport import identity_uniforms + + np.testing.assert_array_equal( + captured["sign"], + identity_uniforms(drawn_ids, target="gift_aid", part="sign", seed=9), + ) + assert result.stage1_transport["identity_key"] == "person_source_id" + assert result.stage1_transport["recipients"] == 3 + assert result.fit_weight_records[1].fit_name == "uk_frs_reference_conditional" diff --git a/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py b/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py index e89159bcbc..7fc3720597 100644 --- a/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py +++ b/packages/microcosm-build/tests/engine/uk/test_uk_spi_state_pension_age.py @@ -46,7 +46,13 @@ def test_spi_imputation_leaves_no_pension_age_reports_below_the_engine_spa( ) unguarded = impute_uk_spi_income_support( - support, donor_path, seed=9, n_estimators=3, donor_sample_size=None + support, + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) guarded = impute_uk_spi_income_support( support, @@ -56,6 +62,7 @@ def test_spi_imputation_leaves_no_pension_age_reports_below_the_engine_spa( donor_sample_size=None, donor_age_model=model, state_pension_age_guard=guard, + allow_in_sample_reference=True, ) channel = support_channel_column("person") diff --git a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py index b8c2c7eb5e..17dceba08e 100644 --- a/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py +++ b/packages/microcosm-build/tests/engine_free/shared/test_spec_engine_loader.py @@ -14,7 +14,7 @@ def test_semantic_hash_has_golden_vector_and_surface_separation(tmp_path) -> Non # protocol inside it attests microcosm.calibrate.solve's bytes, so # microcosm#1124's opt-in retain_best_objective moves it. assert first.spec_sha256 == ( - "0beed241fbee407e76639d830853aa46aabbdb33c57df22a942dfee85ca1f404" + "43cac9831759a907bbf53205bed5cba6dea4f045aea674c4decae8aed014d0a5" ) second_root = _rich_minimal(tmp_path / "xy", note="second", store="local:b") diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py index ba00d82934..4162f7c18a 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_graph.py @@ -375,3 +375,19 @@ def test_zero_row_expand_still_refuses_a_shift_across_household_sizes() -> None: _zero_row_expand_node(), _zero_row_expand_result([0.5, 2.5], total=3.0), ) + + +def test_property_components_reads_cover_the_stage_inputs() -> None: + """A node receives its declared cells alone, so the declaration must name + every person column the landlord stage requires (the recipient flag joined + them with microcosm#840; the 13 October twin build failed at the node + before the declaration followed).""" + from microcosm.build.uk_runtime.graph import _STAGE_CONSUMES + from microcosm.build.uk_runtime.property_components import ( + PROPERTY_COMPONENTS_PERSON_INPUTS, + ) + + declared = _STAGE_CONSUMES["property_components"] + assert declared is not None + required = {("person", column) for column in PROPERTY_COMPONENTS_PERSON_INPUTS} + assert required <= declared, sorted(required - declared) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py index 01e3a12215..9903afbe2d 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_property_components.py @@ -486,6 +486,7 @@ def _frame(self): ) person["property_income"] = profit + sublet spi_rows = person["person_support_channel"].eq("spi") & person["is_uc_claimant"] + person["person_is_spi_income_recipient"] = spi_rows.to_numpy() person["property_finance_costs"] = np.where(spi_rows, 0.2 * profit, 0.0) benunit = pd.DataFrame({"benunit_id": np.arange(1, households + 1)}) return uk_national_frame( diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py index aa1dd1c2e4..5bbcb9e349 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_source_stages.py @@ -1091,6 +1091,11 @@ def test_stage2_outputs_are_backed_by_runtime_written_columns(self) -> None: # The narrow PAY+EPB+TAXTERM employment input is written on SPI rows # by the stage even though the QRF output surface excludes it. written.add("employment_income") + # The rows stage 1 drew, flagged for the stages that tell tape-concept + # rows from FRS-concept ones (microcosm#840). + from microcosm.build.uk_runtime.spi_income import SPI_INCOME_RECIPIENT_COLUMN + + written.add(SPI_INCOME_RECIPIENT_COLUMN) unbacked = [name for name in stage2.outputs if name not in written] assert unbacked == [], ( "Declared outputs with no named runtime written-column constant " diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_band_donors.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_band_donors.py index b9be22c586..1c911e7e66 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_band_donors.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_band_donors.py @@ -139,6 +139,11 @@ def _raw_tape(rows: int = 240, *, seed: int = 0) -> pd.DataFrame: "PAY": pay, "DIVIDENDS": pay * 0.05, "INCBBS": pay * 0.01, + # Annex A bridge codes: pay is every record's main source, no + # trade pages, below State Pension age; composites carry none. + "MAINSRCE": -1.0 if composite else 1.0, + "SEINC_NUM": -1.0 if composite else 0.0, + "SPA": -1.0 if composite else 0.0, } ) row["TEI"] = row["PAY"] diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py index bb3017225d..e2190ada74 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_income.py @@ -95,7 +95,7 @@ def test_spi_carer_take_up_refresh_follows_the_refilled_receipt() -> None: def test_spi_uc_gainful_self_employment_follows_the_rows_drawn_incomes() -> None: - """A redrawn row's gainful self-employment reads its drawn incomes alone.""" + """A drawn row's gainful self-employment takes the root's whole rule.""" person = pd.DataFrame( { @@ -108,10 +108,10 @@ def test_spi_uc_gainful_self_employment_follows_the_rows_drawn_incomes() -> None "FT_EMPLOYED", ], # Row 10's drawn profit no longer out-earns its pay. Rows 20 and 40 - # keep a self-employed status the draw did not read: no profit, and - # a profit below pay, so neither is flagged. Rows 30 and 50 draw a - # profit above their pay, whatever the status. Row 60 is a base row - # whose flag stays. + # keep a self-employed main job the draw conditioned on, so the + # main-job route flags them whatever their profit (microcosm#840). + # Rows 30 and 50 draw a profit above their pay, whatever the + # status. Row 60 is a base row whose flag stays. "self_employment_income": [500.0, 0.0, 9_000.0, 3_000.0, 8_000.0, 0.0], "employment_income": [20_000.0, 0.0, 4_000.0, 25_000.0, 1_000.0, 30_000.0], "uc_is_in_gainful_self_employment": [True, True, False, True, False, True], @@ -120,26 +120,34 @@ def test_spi_uc_gainful_self_employment_follows_the_rows_drawn_incomes() -> None ) spi_people = pd.Series([True, True, True, True, True, False], index=person.index) - result = spi_income._refresh_uc_gainful_self_employment( + result, receipt = spi_income._refresh_uc_gainful_self_employment( person, spi_people=spi_people ) assert result["uc_is_in_gainful_self_employment"].tolist() == [ - False, False, True, - False, + True, + True, True, True, ] assert result["uc_is_in_gainful_self_employment"].dtype == bool + assert receipt == { + "rule": receipt["rule"], + "rows": 5, + "flagged_rows": 4, + "main_job_route_rows": 3, + "earnings_route_rows": 2, + "main_job_route_only_rows": 2, + } + assert "main job" in receipt["rule"] and "twin's flag" in receipt["rule"] bare = pd.DataFrame({"employment_status": ["FT_EMPLOYED"]}, index=[1]) - assert ( - "uc_is_in_gainful_self_employment" - not in spi_income._refresh_uc_gainful_self_employment( - bare, spi_people=pd.Series([True], index=[1]) - ) + bare_result, bare_receipt = spi_income._refresh_uc_gainful_self_employment( + bare, spi_people=pd.Series([True], index=[1]) ) + assert "uc_is_in_gainful_self_employment" not in bare_result + assert bare_receipt is None def test_a_redrawn_row_drops_its_frs_twins_landlord_carrier() -> None: @@ -228,6 +236,8 @@ def test_spi_qrf_fails_closed_on_missing_donor_component(monkeypatch, tmp_path) support, donor_path, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) @@ -390,6 +400,8 @@ def test_spi_qrf_fails_closed_on_unreviewed_stage2_gap(monkeypatch, tmp_path) -> support, donor_path, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) @@ -409,6 +421,8 @@ def test_spi_qrf_fails_closed_on_missing_retained_frs_hmrc_leaf( support, donor_path, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) @@ -435,6 +449,8 @@ def test_spi_qrf_forbids_source_absent_full_concepts_on_frs( support, donor_path, donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) @@ -444,7 +460,9 @@ def test_spi_qrf_requires_current_donor_filename(tmp_path) -> None: _write_donor(donor_path) with pytest.raises(ValueError, match=SPI_DONOR_FILENAME): - impute_uk_spi_income_support(support, donor_path) + impute_uk_spi_income_support( + support, donor_path, allow_in_sample_reference=True + ) @pytest.mark.parametrize( @@ -498,3 +516,264 @@ def parameters(period): # changed or incomplete installed-engine contract. with pytest.raises(ValueError, match=message): spi_income._spi_income_uprating_factors.__wrapped__(2024) + + +def test_person_bridge_matches_the_tape_formulas() -> None: + person = pd.DataFrame( + { + "age": [30.0, 70.0, 45.0, 50.0], + "employment_income": [20_000.0, 0.0, 0.0, 3_000.0], + "self_employment_income": [0.0, 0.0, 0.0, 9_000.0], + "private_pension_income": [0.0, 4_000.0, 0.0, 0.0], + "state_pension_reported": [0.0, 9_000.0, 0.0, 0.0], + "employment_status": [ + "FT_EMPLOYED", + "RETIRED", + "PT_SELF_EMPLOYED", + "FT_SELF_EMPLOYED", + ], + } + ) + bridge = spi_income._person_bridge(person, state_pension_age=66) + assert bridge["main_source"].tolist() == ["pay", "pension", "other", "trade"] + assert bridge["has_pay"].tolist() == [1.0, 0.0, 0.0, 1.0] + # A self-employed main job at a loss still files trade pages. + assert bridge["has_trade"].tolist() == [0.0, 0.0, 1.0, 1.0] + assert bridge["at_or_over_spa"].tolist() == [0.0, 1.0, 0.0, 0.0] + with pytest.raises(ValueError, match="missing column"): + spi_income._person_bridge( + person.drop(columns=["employment_status"]), state_pension_age=66 + ) + + +def test_taxable_income_mask_applies_the_no_record_rule() -> None: + columns = { + "age": 40.0, + "employment_income": 0.0, + "self_employment_income": 0.0, + "private_pension_income": 0.0, + "state_pension_reported": 0.0, + "employment_status": "UNEMPLOYED", + "savings_interest_income": 0.0, + "tax_free_savings_income": 0.0, + "dividend_income": 0.0, + "property_income": 0.0, + "miscellaneous_income": 0.0, + } + rows = [ + dict(columns), # nothing at all + { + **columns, + "savings_interest_income": 1_500.0, + "tax_free_savings_income": 600.0, + }, + {**columns, "dividend_income": 1_200.0}, + {**columns, "employment_status": "FT_SELF_EMPLOYED"}, + {**columns, "state_pension_reported": 10.0}, + {**columns, "property_income": 600.0, "miscellaneous_income": 500.0}, + ] + mask = spi_income._taxable_income_mask(pd.DataFrame(rows)) + assert mask.tolist() == [False, False, True, True, True, True] + + +def test_stage_refuses_in_sample_reference_unless_allowed( + monkeypatch, tmp_path +) -> None: + """A full build never holds too few predictor cells to cross-fit the + reference; when the fold draw yields one fold, the stage refuses unless a + sampled rung or a synthetic fixture says it may locate in-sample.""" + + support = _dead_support() + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + monkeypatch.setattr( + spi_income, + "cell_fold_ids", + lambda predictors, *, folds, seed, used=None: ( + np.zeros(len(predictors), dtype=np.int64), + 1, + ), + ) + with pytest.raises(ValueError, match="allowed only on a sampled rung"): + impute_uk_spi_income_support( + support, + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + ) + + +def test_stage_requires_the_identity_key(monkeypatch, tmp_path) -> None: + support = _dead_support() + person = support.person.drop(columns=["person_source_id"]) + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + with pytest.raises(ValueError, match="person_source_id"): + impute_uk_spi_income_support( + replace(support, person=person), + donor_path, + seed=9, + n_estimators=3, + donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, + ) + + +def test_spi_donor_refuses_undocumented_bridge_codes(tmp_path) -> None: + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + raw = pd.read_csv(donor_path, sep="\t") + for column, bad in (("MAINSRCE", 7), ("SEINC_NUM", 2), ("SPA", 3)): + drifted = raw.copy() + drifted.loc[0, column] = bad + with pytest.raises(ValueError, match=f"{column} has undocumented code"): + spi_income.prepare_spi_donor_table(drifted, seed=1) + fractional = raw.copy() + fractional["SPA"] = fractional["SPA"].astype(float) + fractional.loc[0, "SPA"] = 0.5 + with pytest.raises(ValueError, match="integer codes"): + spi_income.prepare_spi_donor_table(fractional, seed=1) + + +def test_spi_donor_bridge_is_validated_against_the_published_codes(tmp_path) -> None: + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + raw = pd.read_csv(donor_path, sep="\t") + donor = spi_income.prepare_spi_donor_table(raw, seed=1) + assert donor["main_source"].tolist() == ["pay"] * 4 + assert donor["has_pay"].tolist() == [1.0] * 4 + assert donor["has_trade"].tolist() == [1.0] * 4 + assert donor["at_or_over_spa"].tolist() == [0.0, 0.0, 1.0, 1.0] + receipt = donor.attrs["bridge"] + assert receipt["main_source"]["weighted_agreement"] == 1.0 + assert ( + receipt["main_source"]["by_published_code"]["main source pay"]["agreement"] + == 1.0 + ) + assert receipt["has_pay"]["pay_share_among_main_source_pay"] == 1.0 + assert receipt["has_trade"]["seinc_num_share_among_positive_profits"] == 1.0 + assert receipt["has_trade"]["positive_profits_share_among_seinc_num"] == 1.0 + assert receipt["at_or_over_spa"]["srp_share_among_spa"] == 1.0 + assert receipt["at_or_over_spa"]["spa_share_among_srp"] == 1.0 + assert receipt["composite_weighted_share"] == 0.0 + # The indicator codes, not the leaves, set has_trade and at_or_over_spa on + # a coded record: a record that files no trade pages with a profit, and a + # State Pension recipient under State Pension age, follow their codes, + # and the receipt reports both directions of each code against its leaf. + coded = raw.copy() + coded.loc[0, "SEINC_NUM"] = 0 + # Record 1's trade (PROFITS 2,000 less CAPALL 100) leaves its totals too. + coded.loc[1, ["PROFITS", "CAPALL", "LOSSBF"]] = [0.0, 0.0, 0.0] + coded.loc[1, ["TEI", "TI"]] = coded.loc[1, ["TEI", "TI"]] - 1_900.0 + coded.loc[2, "SPA"] = 0 + prepared = spi_income.prepare_spi_donor_table(coded, seed=1) + # Record 0 has a profit but no pages: not a trade. Record 1 files the + # pages with no profit: a trade, and the reverse share drops below one. + assert prepared.loc[0, "has_trade"] == 0.0 and prepared.loc[1, "has_trade"] == 1.0 + assert prepared.loc[2, "at_or_over_spa"] == 0.0 + assert prepared.loc[3, "at_or_over_spa"] == 1.0 + bridge = prepared.attrs["bridge"] + assert bridge["has_trade"]["seinc_num_share_among_positive_profits"] < 1.0 + assert 0.0 < bridge["has_trade"]["positive_profits_share_among_seinc_num"] < 1.0 + assert bridge["at_or_over_spa"]["spa_share_among_srp"] < 1.0 + assert bridge["at_or_over_spa"]["srp_share_among_spa"] == 1.0 + # Composites carry no code and follow their leaves. + composite = raw.copy() + composite.loc[3, ["AGERANGE", "MAINSRCE", "SEINC_NUM", "SPA"]] = [-1, -1, -1, -1] + prepared = spi_income.prepare_spi_donor_table(composite, seed=1) + assert prepared.loc[3, ["has_trade", "at_or_over_spa"]].tolist() == [1.0, 1.0] + assert prepared.attrs["bridge"]["composite_weighted_share"] == 0.4 + # A tape whose published code the leaves no longer translate is refused. + disagreeing = raw.copy() + disagreeing["MAINSRCE"] = 2 + with pytest.raises(ValueError, match="no longer translates"): + spi_income.prepare_spi_donor_table(disagreeing, seed=1) + + +class _Tape: + def __init__(self, classes: dict[str, tuple[int, ...]]) -> None: + self._classes = classes + + def sign_classes(self, target: str) -> tuple[int, ...]: + return self._classes.get(target, (0, 1)) + + +def test_sign_class_mismatches_name_the_located_targets_only() -> None: + """A reference whose gate orders other classes than the tape's is a + mismatch on a located target; an identity or degenerate target (no + reference classes) is not.""" + receipt = { + "targets": { + target: {"reference_classes": [0, 1]} + for target in spi_income.SPI_INCOME_QRF_OUTPUT_COLUMNS + } + } + receipt["targets"]["private_pension_income"]["reference_classes"] = [1] + receipt["targets"]["hmrc_spi_incapacity_benefit_income"]["reference_classes"] = None + tape = _Tape({"hmrc_spi_incapacity_benefit_income": (0,)}) + assert spi_income._sign_class_mismatches(receipt, tape) == { + "private_pension_income": {"reference": [1], "tape": [0, 1]} + } + receipt["targets"]["private_pension_income"]["reference_classes"] = [0, 1] + assert spi_income._sign_class_mismatches(receipt, tape) == {} + + +def test_stage_refuses_a_sign_class_mismatch_unless_sampled( + monkeypatch, tmp_path +) -> None: + """A full build refuses a located target whose reference sign classes + differ from the tape forest's; a sampled rung or a synthetic fixture + records the mismatch in the transport receipt instead.""" + + support = _dead_support() + donor_path = tmp_path / SPI_DONOR_FILENAME + _write_donor(donor_path) + monkeypatch.setattr(spi_income, "QRF", _FakeQRF) + _bypass_reviewed_donor_identity(monkeypatch) + mismatch = {"private_pension_income": {"reference": [1], "tape": [0, 1]}} + monkeypatch.setattr( + spi_income, "_sign_class_mismatches", lambda receipt, tape: mismatch + ) + # The synthetic support cannot cross-fit (too few cells); let the transport + # locate in-sample either way so the sign-class check is what decides. + real_cross_fit = spi_income.cross_fit_transport + monkeypatch.setattr( + spi_income, + "cross_fit_transport", + lambda *args, **kwargs: real_cross_fit( + *args, **{**kwargs, "allow_in_sample": True} + ), + ) + options = dict(seed=9, n_estimators=3, donor_sample_size=None, state_pension_age=66) + with pytest.raises(ValueError, match="sign classes differ from the tape forest's"): + impute_uk_spi_income_support( + support, donor_path, allow_in_sample_reference=False, **options + ) + # The sampled path reaches the stage-1 draw (the disability refresh then + # needs the engine on this synthetic frame), with the mismatch receipted. + seen: dict[str, object] = {} + original = _FakeFittedQRF.predict_from_uniforms + + def predict_from_uniforms(self, predictors, *, quantiles, sign_uniforms): + seen["reached"] = True + return original( + self, predictors, quantiles=quantiles, sign_uniforms=sign_uniforms + ) + + monkeypatch.setattr(_FakeFittedQRF, "predict_from_uniforms", predict_from_uniforms) + try: + result = impute_uk_spi_income_support( + support, donor_path, allow_in_sample_reference=True, **options + ) + except ImportError: + result = None + assert seen.get("reached") is True + if result is not None: + assert result.stage1_transport["sign_class_mismatches"] == mismatch diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py index d2952d3d8d..cc16e1631c 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_pension_age.py @@ -277,14 +277,25 @@ def test_stage1_queries_sit_at_the_middle_of_the_year_of_age() -> None: "person_household_id": [1, 1, 2], "age": [65, 66, 74], "gender": ["MALE", "FEMALE", "MALE"], + # The bridge predictors read the row's own leaves (microcosm#840). + "employment_income": [20_000.0, 0.0, 0.0], + "self_employment_income": [0.0, 0.0, 0.0], + "private_pension_income": [0.0, 3_000.0, 0.0], + "state_pension_reported": [0.0, 9_000.0, 9_000.0], + "employment_status": ["FT_EMPLOYED", "RETIRED", "RETIRED"], } ) household = pd.DataFrame({"household_id": [1, 2], "region": ["LONDON", "WALES"]}) - predictors = spi_income._stage1_query_predictors(person, household) + predictors = spi_income._stage1_query_predictors( + person, household, state_pension_age=66 + ) assert predictors["age"].tolist() == [65.5, 66.5, 74.5] assert predictors["region"].tolist() == ["LONDON", "LONDON", "WALES"] + assert list(predictors.columns) == list(spi_income.SPI_STAGE1_PREDICTOR_COLUMNS) + assert predictors["main_source"].tolist() == ["pay", "pension", "pension"] + assert predictors["at_or_over_spa"].tolist() == [0.0, 1.0, 1.0] def test_whole_year_frame_ages_draw_state_pension_from_their_own_year() -> None: @@ -321,9 +332,11 @@ def test_whole_year_frame_ages_draw_state_pension_from_their_own_year() -> None: } ) household = pd.DataFrame({"household_id": [1], "region": ["LONDON"]}) - encoded_donor, encoded_query = spi_income._encode_predictor_pair( - donor, spi_income._stage1_query_predictors(person, household) - ) + # The age rule alone is under test, so the query carries the donor's three + # predictors at the middle of the year of age, without the bridge. + query = spi_income._person_predictors(person, household, income_predictors=()) + query["age"] = np.floor(query["age"].to_numpy(dtype=float)) + 0.5 + encoded_donor, encoded_query = spi_income._encode_predictor_pair(donor, query) frame = spi_income._person_fit_frame( predictors=encoded_donor, targets=targets, diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_rank_transport.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_rank_transport.py new file mode 100644 index 0000000000..cdb7253c36 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_rank_transport.py @@ -0,0 +1,544 @@ +"""The twin-conditional transport of the SPI stage-1 draw (microcosm#840).""" + +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.uk_runtime import spi_rank_transport as transport +from microcosm.build.uk_runtime.spi_rank_transport import ( + SPI_STAGE1_ANALOGUE_COLUMNS, + analogue_source_columns, + analogue_targets, + assert_analogue_map_covers, + identity_uniforms, + observed_analogues, + transport_uniforms, +) +from microcosm.build.uk_runtime.spi_support import SPI_INCOME_QRF_OUTPUT_COLUMNS +from microcosm.fit import fit + + +def test_analogue_map_names_every_stage1_output_and_refuses_drift() -> None: + assert_analogue_map_covers(SPI_INCOME_QRF_OUTPUT_COLUMNS) + assert set(SPI_STAGE1_ANALOGUE_COLUMNS) == set(SPI_INCOME_QRF_OUTPUT_COLUMNS) + assert analogue_targets() == tuple( + target + for target in SPI_INCOME_QRF_OUTPUT_COLUMNS + if SPI_STAGE1_ANALOGUE_COLUMNS[target] is not None + ) + with pytest.raises(ValueError, match=r"unmapped \['hmrc_spi_new_leaf'\]"): + assert_analogue_map_covers( + (*SPI_INCOME_QRF_OUTPUT_COLUMNS, "hmrc_spi_new_leaf") + ) + with pytest.raises(ValueError, match="stale"): + assert_analogue_map_covers(SPI_INCOME_QRF_OUTPUT_COLUMNS[1:]) + + +def test_observed_analogues_read_the_twin_and_derive_taxable_interest() -> None: + person = pd.DataFrame( + {column: [0.0, 5.0] for column in analogue_source_columns()}, + index=[10, 11], + ) + person["savings_interest_income"] = [100.0, 20.0] + person["tax_free_savings_income"] = [30.0, 50.0] + person["dividend_income"] = [7.0, 0.0] + observed = observed_analogues(person) + assert list(observed.columns) == list(analogue_targets()) + assert observed.index.tolist() == [10, 11] + assert observed["savings_interest_income"].tolist() == [70.0, 0.0] + assert observed["dividend_income"].tolist() == [7.0, 0.0] + with pytest.raises(ValueError, match="missing column"): + observed_analogues(person.drop(columns=["miscellaneous_income"])) + person.loc[10, "property_income"] = np.nan + with pytest.raises(ValueError, match="not finite"): + observed_analogues(person) + + +def _synthetic_frs(n: int, seed: int) -> tuple[pd.DataFrame, pd.DataFrame]: + """Encoded predictors and observed analogues of ``n`` FRS-like adults.""" + + rng = np.random.default_rng(seed) + age = rng.integers(20, 80, n).astype(float) + has_pay = (rng.random(n) < 0.6).astype(float) + predictors = pd.DataFrame({"age": age, "has_pay": has_pay}) + observed = pd.DataFrame(index=predictors.index) + for target in analogue_targets(): + observed[target] = 0.0 + observed["hmrc_spi_pay"] = np.where(has_pay > 0, 15_000.0 + 400.0 * age, 0.0) + observed["hmrc_spi_pay"] += np.where(has_pay > 0, rng.normal(0, 2_000, n), 0.0) + observed["self_employment_income"] = np.where( + rng.random(n) < 0.2, rng.gamma(2.0, 4_000.0, n), 0.0 + ) + observed["savings_interest_income"] = np.where( + rng.random(n) < 0.5, rng.gamma(1.5, 300.0, n), 0.0 + ) + observed["dividend_income"] = np.where( + rng.random(n) < 0.15, rng.gamma(2.0, 1_000.0, n), 0.0 + ) + observed["private_pension_income"] = np.where( + age >= 60, rng.gamma(3.0, 3_000.0, n), 0.0 + ) + observed["property_income"] = np.where( + rng.random(n) < 0.1, rng.gamma(2.0, 2_500.0, n), 0.0 + ) + observed["hmrc_spi_state_pension_income"] = np.where(age >= 66, 10_000.0, 0.0) + observed["hmrc_spi_unemployment_benefit_income"] = np.where( + rng.random(n) < 0.05, 2_000.0, 0.0 + ) + observed["hmrc_spi_other_social_security_income"] = np.where( + rng.random(n) < 0.05, 1_500.0, 0.0 + ) + observed["hmrc_spi_other_income"] = np.where(rng.random(n) < 0.05, 800.0, 0.0) + # Incapacity benefit is all zero on the FRS rows: a degenerate analogue. + return predictors, observed + + +@pytest.fixture(scope="module") +def reference(): + predictors, observed = _synthetic_frs(400, seed=3) + donor = pd.concat([predictors, observed], axis=1) + return fit( + donor, + list(predictors.columns), + list(analogue_targets()), + weights="none", + n_estimators=4, + seed=5, + ) + + +def test_transport_locates_twins_and_keys_the_rest_on_identity(reference) -> None: + predictors, observed = _synthetic_frs(120, seed=4) + predictors.index = observed.index = pd.RangeIndex(500, 620) + identities = np.arange(9_000, 9_120) + groups = np.where(predictors["has_pay"].to_numpy() > 0, "pay", "other") + groups[:5] = "trade" # a group too small to report + result = transport_uniforms( + reference, + encoded_recipients=predictors, + observed=observed, + identities=identities, + groups=groups, + seed=42, + ) + outputs = set(SPI_INCOME_QRF_OUTPUT_COLUMNS) + assert set(result.quantiles) == outputs == set(result.sign_uniforms) + for mapping in (result.quantiles, result.sign_uniforms): + for values in mapping.values(): + assert values.shape == (120,) + assert ((values >= 0.0) & (values < 1.0)).all() + # Leaves without an FRS analogue draw at the identity-keyed uniforms. + for target in result.receipt["identity_targets"]: + assert SPI_STAGE1_ANALOGUE_COLUMNS[target] is None + np.testing.assert_array_equal( + result.quantiles[target], + identity_uniforms(identities, target=target, part="quantile", seed=42), + ) + np.testing.assert_array_equal( + result.sign_uniforms[target], + identity_uniforms(identities, target=target, part="sign", seed=42), + ) + assert "gift_aid" in result.receipt["identity_targets"] + # The all-zero FRS analogue is degenerate and falls back to identity. + incapacity = "hmrc_spi_incapacity_benefit_income" + assert incapacity in result.receipt["degenerate_targets"] + assert result.receipt["targets"][incapacity]["source"] == ( + "identity_degenerate_analogue" + ) + assert result.receipt["targets"]["hmrc_spi_pay"]["source"] == "twin_conditional" + assert result.receipt["targets"]["hmrc_spi_pay"]["reference_regime"] == ( + "zero_inflated_positive" + ) + # Drawing the reference at the located uniforms gives the twins back: the + # transport carries each twin's own standing, not a random one. + located = {target: result.quantiles[target] for target in reference.targets} + signs = {target: result.sign_uniforms[target] for target in reference.targets} + drawn = reference.predict_from_uniforms( + predictors, quantiles=located, sign_uniforms=signs + ) + # In-sample atoms are exact; held-out values sit between atoms, so the + # draw at the located quantile is the twin's value where the conditional + # is strictly increasing and the nearest atom where it is flat. + pay = observed["hmrc_spi_pay"].to_numpy() + assert ((drawn["hmrc_spi_pay"].to_numpy() > 0) == (pay > 0)).all() + assert np.corrcoef(drawn["hmrc_spi_pay"][pay > 0], pay[pay > 0])[0, 1] > 0.95 + # The receipt reports uniformity overall and by group, never on a group + # under ten rows. + kolmogorov = result.receipt["targets"]["hmrc_spi_pay"]["kolmogorov"] + assert 0.0 <= kolmogorov["sign"] <= 1.0 and 0.0 <= kolmogorov["quantile"] <= 1.0 + assert kolmogorov["positive_rows"] == int((pay > 0).sum()) + by_group = result.receipt["targets"]["hmrc_spi_pay"]["by_group"] + assert by_group["trade"] is None + assert by_group["pay"]["rows"] == int((groups == "pay").sum()) + assert result.receipt["draw"] == "twin_conditional_quantiles" + assert result.receipt["recipients_sharing_a_twin"] == 0 + + +def test_transport_is_row_order_invariant_and_shares_twins(reference) -> None: + predictors, observed = _synthetic_frs(40, seed=6) + identities = np.arange(100, 140) + first = transport_uniforms( + reference, + encoded_recipients=predictors, + observed=observed, + identities=identities, + groups=None, + seed=1, + ) + order = np.random.default_rng(2).permutation(40) + shuffled = transport_uniforms( + reference, + encoded_recipients=predictors.iloc[order], + observed=observed.iloc[order], + identities=identities[order], + groups=None, + seed=1, + ) + for target in SPI_INCOME_QRF_OUTPUT_COLUMNS: + np.testing.assert_array_equal( + first.quantiles[target][order], shuffled.quantiles[target] + ) + np.testing.assert_array_equal( + first.sign_uniforms[target][order], shuffled.sign_uniforms[target] + ) + assert first.receipt["targets"]["hmrc_spi_pay"]["by_group"] is None + # Two copies of one twin share their uniforms, and the receipt says so. + doubled = transport_uniforms( + reference, + encoded_recipients=pd.concat([predictors, predictors], ignore_index=True), + observed=pd.concat([observed, observed], ignore_index=True), + identities=np.r_[identities, identities], + groups=None, + seed=1, + ) + assert doubled.receipt["recipients_sharing_a_twin"] == 40 + np.testing.assert_array_equal( + doubled.quantiles["hmrc_spi_pay"][:40], doubled.quantiles["hmrc_spi_pay"][40:] + ) + + +def test_transport_refuses_misaligned_inputs(reference) -> None: + predictors, observed = _synthetic_frs(12, seed=7) + identities = np.arange(12) + with pytest.raises(ValueError, match="one entry per recipient"): + transport_uniforms( + reference, + encoded_recipients=predictors, + observed=observed, + identities=identities[:-1], + groups=None, + seed=1, + ) + with pytest.raises(ValueError, match="align to recipients"): + transport_uniforms( + reference, + encoded_recipients=predictors, + observed=observed.iloc[::-1], + identities=identities, + groups=None, + seed=1, + ) + + class Drifted: + targets = ("hmrc_spi_pay",) + + with pytest.raises(ValueError, match="targets drifted"): + transport_uniforms( + Drifted(), + encoded_recipients=predictors, + observed=observed, + identities=identities, + groups=None, + seed=1, + ) + with pytest.raises(ValueError, match="part must be"): + identity_uniforms(identities, target="hmrc_spi_pay", part="sign_", seed=1) + assert transport.SPI_TRANSPORT_SEED_OFFSET == 3 + + +def test_cell_folds_share_a_cell_between_twins_and_copies() -> None: + from microcosm.build.uk_runtime.spi_rank_transport import cell_fold_ids + + predictors = pd.DataFrame( + { + "gender": ["MALE", "MALE", "FEMALE", "FEMALE", "MALE"], + "region": ["LONDON"] * 5, + "age": [30.5, 30.5, 40.5, 40.5, 50.5], + "main_source": ["pay", "pay", "pension", "pension", "trade"], + "has_pay": [1.0, 1.0, 0.0, 0.0, 0.0], + "has_trade": [0.0, 0.0, 0.0, 0.0, 1.0], + "at_or_over_spa": [0.0] * 5, + } + ) + folds, used = cell_fold_ids(predictors, folds=5, seed=42) + assert used == 3 # three distinct cells + assert folds[0] == folds[1] and folds[2] == folds[3] + assert ((folds >= 0) & (folds < used)).all() + # A copy with the twin's predictors lands in the twin's fold, whatever + # frame it sits in and however many cells that frame has. + copies, _ = cell_fold_ids(predictors.iloc[[4, 0]], folds=5, seed=42, used=used) + assert copies.tolist() == [folds[4], folds[0]] + with pytest.raises(ValueError, match="fold cells need"): + cell_fold_ids(predictors.drop(columns=["main_source"]), folds=5, seed=42) + with pytest.raises(ValueError, match="positive integer"): + cell_fold_ids(predictors, folds=0, seed=42) + + +def test_cross_fit_locates_a_copy_on_a_forest_that_never_saw_its_twin() -> None: + """Cross-fitting by cell: the twin is held out, and ranks survive within a cell. + + Rows of one predictor cell share a fold, so a copy is located by a forest + fitted without its twin; the forest never holds the twin's own value as an + atom, and within a cell the located quantiles are monotone in the twin's + value. The fit callable records which rows each forest saw. + """ + from microcosm.build.uk_runtime.spi_rank_transport import ( + cell_fold_ids, + cross_fit_transport, + ) + + rng = np.random.default_rng(21) + n = 600 + ages = rng.integers(25, 60, n).astype(float) + 0.5 + raw = pd.DataFrame( + { + "gender": np.where(rng.random(n) < 0.5, "MALE", "FEMALE"), + "region": "LONDON", + "age": ages, + "main_source": "pay", + "has_pay": 1.0, + "has_trade": 0.0, + "at_or_over_spa": 0.0, + } + ) + encoded = pd.DataFrame( + { + "age": ages, + "gender_MALE": (raw.gender == "MALE").astype(float), + "gender_FEMALE": (raw.gender == "FEMALE").astype(float), + } + ) + observed = pd.DataFrame(index=encoded.index) + for target in analogue_targets(): + observed[target] = 0.0 + observed["hmrc_spi_pay"] = 12_000.0 + 500.0 * (ages - 25) + rng.normal(0, 4_000, n) + observed["hmrc_spi_pay"] = observed["hmrc_spi_pay"].clip(lower=1_000.0) + # Pay is chained on the earlier leaves, so they stay at zero here: the + # monotonicity below is within a cell *and* the same earlier leaves. + seen: list[set[int]] = [] + + def fit_reference(encoded_train, observed_train): + seen.append(set(encoded_train.index.tolist())) + donor = pd.concat([encoded_train, observed_train], axis=1) + return fit( + donor, + list(encoded_train.columns), + list(analogue_targets()), + weights="none", + n_estimators=30, + seed=3, + ) + + folds, used = cell_fold_ids(raw, folds=5, seed=42) + assert used == 5 + # The recipients are copies of the first 200 rows: same cells, same values. + copies = np.arange(200) + training_identities = np.arange(10_000, 10_000 + len(raw)) + result = cross_fit_transport( + fit_reference, + training_predictors=raw, + encoded_training=encoded, + training_observed=observed, + training_folds=folds, + training_identities=training_identities, + used=used, + recipient_predictors=raw.iloc[copies].reset_index(drop=True), + encoded_recipients=encoded.iloc[copies].reset_index(drop=True), + observed=observed.iloc[copies].reset_index(drop=True), + identities=np.arange(10_000, 10_200), + groups=None, + seed=42, + folds=5, + ) + receipt = result.receipt + assert receipt["folds"] == 5 and receipt["cross_fitted"] is True + assert receipt["in_sample_folds"] == [] + assert sum(r["scored_recipients"] for r in receipt["fold_receipts"].values()) == 200 + # Every forest was fitted without the rows it located. + for fold, rows_seen in enumerate(seen): + located = copies[folds[copies] == fold] + assert not (set(located.tolist()) & rows_seen) + assert len(rows_seen) == int((folds != fold).sum()) + # Within a cell (same whole-year age and gender, and here the same + # earlier leaves) the located pay quantiles are monotone in the twin's + # pay: one forest locates the whole cell and holds no twin's own value. + pay = observed["hmrc_spi_pay"].to_numpy()[copies] + located = result.quantiles["hmrc_spi_pay"] + cells = pd.DataFrame( + { + "cell": ( + np.floor(ages[copies]).astype(int).astype(str) + + raw.gender.to_numpy()[copies] + ), + "pay": pay, + "u": located, + } + ) + # A value beyond the ends of its conditional is placed inside the end + # interval by the placement uniform, a tie-break rather than a rank, so + # the check runs over the rows the conditional covers. + interior = (cells.u > 1e-4) & (cells.u < 1 - 1e-4) + assert interior.mean() > 0.8 + checked = 0 + for _, group in cells[interior].groupby("cell"): + if len(group) >= 3: + order = np.argsort(group.pay.to_numpy()) + assert (np.diff(group.u.to_numpy()[order]) >= 0).all() + checked += 1 + assert checked > 0 + assert receipt["targets"]["hmrc_spi_pay"]["source"] == "twin_conditional" + assert receipt["targets"]["hmrc_spi_pay"]["reference_regime"] == ["positive_only"] + # The folds agree on the sign classes, which the receipt reports for the + # tape-side check. + assert receipt["targets"]["hmrc_spi_pay"]["reference_classes"] == [1] + assert receipt["targets"]["gift_aid"]["reference_classes"] is None + # A copy whose fold-key cell moved away from its twin's is refused: the + # forest that located it could have seen the twin. + moved = raw.iloc[copies].reset_index(drop=True) + moved["age"] = moved["age"] + 7.0 + with pytest.raises(ValueError, match="differs from its twin's"): + cross_fit_transport( + fit_reference, + training_predictors=raw, + encoded_training=encoded, + training_observed=observed, + training_folds=folds, + training_identities=training_identities, + used=used, + recipient_predictors=moved, + encoded_recipients=encoded.iloc[copies].reset_index(drop=True), + observed=observed.iloc[copies].reset_index(drop=True), + identities=np.arange(10_000, 10_200), + groups=None, + seed=42, + folds=5, + ) + # A frame of one cell cannot hold anything out: refused unless the caller + # is a sampled rung or a synthetic fixture, and then the receipt says so. + one_cell = raw.iloc[:10].assign(age=30.5, gender="MALE") + one_encoded = encoded.iloc[:10].assign(age=30.5, gender_MALE=1.0, gender_FEMALE=0.0) + folds_one, used_one = cell_fold_ids(one_cell, folds=5, seed=42) + assert used_one == 1 + one_cell_call = dict( + training_predictors=one_cell, + encoded_training=one_encoded, + training_observed=observed.iloc[:10], + training_folds=folds_one, + training_identities=training_identities[:10], + used=used_one, + recipient_predictors=one_cell.reset_index(drop=True), + encoded_recipients=one_encoded.reset_index(drop=True), + observed=observed.iloc[:10].reset_index(drop=True), + identities=np.arange(10_000, 10_010), + groups=None, + seed=42, + folds=5, + ) + with pytest.raises(ValueError, match="cannot be cross-fitted"): + cross_fit_transport(fit_reference, **one_cell_call) + single = cross_fit_transport(fit_reference, allow_in_sample=True, **one_cell_call) + assert single.receipt["folds"] == 1 and single.receipt["cross_fitted"] is False + # A positive-row count under the group floor is withheld. + assert single.receipt["targets"]["dividend_income"]["kolmogorov"][ + "positive_rows" + ] in ( + None, + *range(10, 11), + ) + + +class _ClassReference: + """A fitted reference whose sign classes depend on the fold it was fitted on.""" + + def __init__(self, classes_by_call: list[tuple[int, ...]], targets) -> None: + self.targets = tuple(targets) + self._classes = classes_by_call + self._fits = 0 + + def regimes(self) -> dict[str, str]: + return dict.fromkeys(self.targets, "zero_inflated_positive") + + def sign_classes(self, target: str) -> tuple[int, ...]: + return self._classes[min(self._fits - 1, len(self._classes) - 1)] + + def conditional_uniforms(self, frame, *, sign_placement, quantile_placement): + from microcosm.fit import ConditionalUniforms + + return ConditionalUniforms( + quantiles={t: np.asarray(quantile_placement[t]) for t in self.targets}, + sign_uniforms={t: np.asarray(sign_placement[t]) for t in self.targets}, + degenerate=frozenset(), + ungated=frozenset(), + ) + + +def test_cross_fit_refuses_folds_that_disagree_on_sign_classes() -> None: + """One forest per fold locates a cell; folds whose gates order different + sign classes would read the same uniform two ways, so they are refused.""" + from microcosm.build.uk_runtime.spi_rank_transport import ( + cell_fold_ids, + cross_fit_transport, + ) + + rng = np.random.default_rng(5) + n = 400 + ages = rng.integers(25, 60, n).astype(float) + 0.5 + raw = pd.DataFrame( + { + "gender": np.where(rng.random(n) < 0.5, "MALE", "FEMALE"), + "region": "LONDON", + "age": ages, + "main_source": "pay", + "has_pay": 1.0, + "has_trade": 0.0, + "at_or_over_spa": 0.0, + } + ) + encoded = pd.DataFrame( + { + "age": ages, + "gender_MALE": (raw.gender == "MALE").astype(float), + "gender_FEMALE": (raw.gender == "FEMALE").astype(float), + } + ) + observed = pd.DataFrame(index=encoded.index) + for target in analogue_targets(): + observed[target] = 1_000.0 + folds, used = cell_fold_ids(raw, folds=5, seed=42) + assert used == 5 + reference = _ClassReference([(0, 1), (1,)], analogue_targets()) + + def fit_reference(encoded_train, observed_train): + reference._fits += 1 + return reference + + copies = np.arange(100) + with pytest.raises(ValueError, match="disagree on the sign classes"): + cross_fit_transport( + fit_reference, + training_predictors=raw, + encoded_training=encoded, + training_observed=observed, + training_folds=folds, + training_identities=np.arange(1, n + 1), + used=used, + recipient_predictors=raw.iloc[copies].reset_index(drop=True), + encoded_recipients=encoded.iloc[copies].reset_index(drop=True), + observed=observed.iloc[copies].reset_index(drop=True), + identities=np.arange(1, 101), + groups=None, + seed=42, + folds=5, + ) diff --git a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py index 4738624af3..8cb81aa828 100644 --- a/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py +++ b/packages/microcosm-build/tests/engine_free/uk/test_uk_spi_spine.py @@ -68,6 +68,8 @@ def _base_frame(*, time_period: str = "2023") -> object: "hmrc_spi_incapacity_benefit_income": [0.0, 0.0], "ossben_identifiable_subset": [0.0, 0.0], "srp_regular_code5": [0.0, 0.0], + "employment_status": ["FT_EMPLOYED", "FT_EMPLOYED"], + "miscellaneous_income": [0.0, 0.0], **{ column: [0.0, 0.0] for column in FRS_ONLY_SPI_FILL_PERSON_COLUMNS @@ -325,7 +327,13 @@ def __init__(self, n_estimators: int, seed: int) -> None: def fit(self, frame, predictors, targets, weights): self.targets = tuple(targets) self.weight_kind = weights - label = "stage1" if "hmrc_spi_pay" in self.targets else "stage2" + label = ( + "stage1" + if "gift_aid" in self.targets + else "reference" + if "hmrc_spi_pay" in self.targets + else "stage2" + ) dividend = ( frame.table("person")["dividend_income"].tolist() if "dividend_income" in frame.table("person") @@ -334,6 +342,25 @@ def fit(self, frame, predictors, targets, weights): self.events.append((label, tuple(targets), dividend)) return self + def regimes(self): + return dict.fromkeys(self.targets, "zero_inflated_positive") + + def sign_classes(self, target): + return (0, 1) + + def conditional_uniforms(self, frame, *, sign_placement, quantile_placement): + from microcosm.fit import ConditionalUniforms + + return ConditionalUniforms( + quantiles={t: np.asarray(quantile_placement[t]) for t in self.targets}, + sign_uniforms={t: np.asarray(sign_placement[t]) for t in self.targets}, + degenerate=(), + ungated=(), + ) + + def predict_from_uniforms(self, predictors, *, quantiles, sign_uniforms): + return self.predict(predictors) + def predict(self, predictors): rows = len(predictors) values: dict[str, np.ndarray] = {} @@ -363,6 +390,11 @@ def _donor_file(tmp_path: Path) -> Path: "PAY": 10.0, "TEI": 10.0, "TI": 10.0, + # Annex A bridge codes consistent with the leaves: pay is the main + # source, no trade pages, below State Pension age. + "MAINSRCE": 1, + "SEINC_NUM": 0, + "SPA": 0, } ) pd.DataFrame([row]).to_csv(path, sep="\t", index=False) @@ -449,10 +481,12 @@ def test_spi_income_zero_initializes_frs_charity_and_keeps_frs_dividends( support, _donor_file(tmp_path), donor_sample_size=None, + state_pension_age=66, initialize_frs_channel_columns={ "gift_aid": 0.0, "charitable_investment_gifts": 0.0, }, + allow_in_sample_reference=True, ) person = result.person base = person[support_channel_column("person")] != SPI_SYNTHETIC_SUPPORT_CHANNEL @@ -473,8 +507,16 @@ def test_spi_income_zero_initializes_frs_charity_and_keeps_frs_dividends( == support.person.loc[reported, "dividend_income"].tolist() ) assert person.loc[spi, "dividend_income"].tolist() == [100.0, 101.0] - assert _FakeQRF.events[1][0] == "stage2" - assert _FakeQRF.events[1][2] == [20.0, 10.0] + # The tape forest, then one FRS reference forest per cross-fit fold + # (microcosm#840), then the FRS-only fill; every FRS fit sees reported + # dividends only. + labels = [event[0] for event in _FakeQRF.events] + assert labels[0] == "stage1" and labels[-1] == "stage2" + assert labels[1:-1] and set(labels[1:-1]) == {"reference"} + assert len(labels) - 2 == len(result.stage1_transport["fold_receipts"]) + for event in _FakeQRF.events[1:-1]: + assert set(event[2]) <= {20.0, 10.0} and event[2] + assert _FakeQRF.events[-1][2] == [20.0, 10.0] assert set(SPI_INCOME_QRF_OUTPUT_COLUMNS) <= set(person.columns) @@ -521,6 +563,8 @@ def test_reviewed_absent_incapacity_signal_raises(tmp_path: Path) -> None: support, _donor_file(tmp_path), donor_sample_size=None, + state_pension_age=66, + allow_in_sample_reference=True, ) finally: monkeypatch.undo() diff --git a/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py b/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py index 47e910c59b..3d0fe7a056 100644 --- a/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py +++ b/packages/microcosm-build/tests/engine_workflow/us/test_us_multispine_pool_tool.py @@ -341,7 +341,7 @@ def capture_equality(expected: object, actual: object) -> None: # The US bundle's semantic hash covers microcosm.calibrate.solve's # bytes (its seed protocol); microcosm#1124's opt-in # retain_best_objective moves it. - "spec_sha256": "4d08ff77d2118ec4f7d63fcf17983f774b9d1142b0b8308bfdc30767ece76f1f", + "spec_sha256": "6338821db4619b1443f8790469d289cf3aa292ab10b66932b70786aabb2308d3", }, } diff --git a/packages/microcosm-data/src/microcosm/data/contract.py b/packages/microcosm-data/src/microcosm/data/contract.py index 7b3e3fabf5..f9d576f8cd 100644 --- a/packages/microcosm-data/src/microcosm/data/contract.py +++ b/packages/microcosm-data/src/microcosm/data/contract.py @@ -442,13 +442,13 @@ def compatibility_claim_declarer_error(declared_by: object) -> str | None: # fingerprint derives from the manifest digest. Editing the spec moves all # three here in the same reviewed change. _UK_GATE_BATTERY_POLICY_SHA256 = ( - "60f9a05a74023604684478038516477b5eb4cd2674fe76fddfc1848edc402850" + "382d3d5e16bda29b5cc3d6fa1109aa2ebf210513046723e4ff7eed38b4037fec" ) _UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "e3c3b0a0dd1fe87964f0c45a894e56bb6a1ce6def56c061ab5ae9074d64c44ba" + "59a94f17b2cd725ec76ab511bb433435a6ce5d7a22801f72f28a7085162bd8b7" ) _UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4560684d4f936f86766cf921f745a6971b2ec2bed2aaf4e7ab73a2081349c771" + "7fc56fcdea81b8ddf08e18c4a3d483a76ff1533139d4f5fd1256f5e9c7fbcb13" ) #: Spec entry id -> the legacy gate name whose observable detail checks #: apply unchanged (the battery re-keys the report by entry id; the gate @@ -902,10 +902,10 @@ def _uk_line_cut_tag_re(release_id: str) -> re.Pattern[str] | None: }, "release_cut": { "gates_manifest_sha256": ( - "e2424457d6e4654ef1151c2e8c189af95c379930a990572950d1c4768a5e06d9" + "d6adeb2e203e3abd41a8037ea42c3cda14a1a2dd97d9aa973cbd23cb72b40990" ), "policy_sha256": ( - "5377ce013d9ffd1ecb66f378b34b83c7947d053bf9ebc7c084fb9d81109bbc8f" + "af0beb1143b1e6a4d778472d5c1f568a840536bb72ff57570b73eea443df208e" ), }, } diff --git a/packages/microcosm-data/tests/engine_free/shared/test_contract.py b/packages/microcosm-data/tests/engine_free/shared/test_contract.py index f4d901c31c..07a6b867c5 100644 --- a/packages/microcosm-data/tests/engine_free/shared/test_contract.py +++ b/packages/microcosm-data/tests/engine_free/shared/test_contract.py @@ -214,13 +214,13 @@ def _trusted_terminal_gate_signing_key(monkeypatch) -> None: UK_GATE_BATTERY_PRODUCER = "microcosm.build.gate_battery" UK_GATE_BATTERY_SIGNING_KEY_ENV = "MICROCOSM_UK_TERMINAL_GATE_SIGNING_KEY" UK_GATE_BATTERY_POLICY_SHA256 = ( - "60f9a05a74023604684478038516477b5eb4cd2674fe76fddfc1848edc402850" + "382d3d5e16bda29b5cc3d6fa1109aa2ebf210513046723e4ff7eed38b4037fec" ) UK_GATE_BATTERY_GATES_MANIFEST_SHA256 = ( - "e3c3b0a0dd1fe87964f0c45a894e56bb6a1ce6def56c061ab5ae9074d64c44ba" + "59a94f17b2cd725ec76ab511bb433435a6ce5d7a22801f72f28a7085162bd8b7" ) UK_GATE_BATTERY_SPEC_FINGERPRINT = ( - "4560684d4f936f86766cf921f745a6971b2ec2bed2aaf4e7ab73a2081349c771" + "7fc56fcdea81b8ddf08e18c4a3d483a76ff1533139d4f5fd1256f5e9c7fbcb13" ) UK_GATE_BATTERY_DEGENERATE_EVIDENCE_SHA256 = ( "6a179222c6b6058ad9caacfd347f7bdb8cb98a62237b50d1fc1136df09337251" diff --git a/packages/microcosm-fit/src/microcosm/fit/__init__.py b/packages/microcosm-fit/src/microcosm/fit/__init__.py index 7b987f8f6a..63521225da 100644 --- a/packages/microcosm-fit/src/microcosm/fit/__init__.py +++ b/packages/microcosm-fit/src/microcosm/fit/__init__.py @@ -85,6 +85,7 @@ def _assert_frame_compatible(version: str, required: tuple[int, int]) -> None: from microcosm.fit.qrf import ( # noqa: E402 - after the compatibility gate DEFAULT_N_ESTIMATORS, DEFAULT_ZERO_ATOL, + ConditionalUniforms, FittedRegimeGatedQRF, QRFChainState, QRFChainStepResult, @@ -144,6 +145,7 @@ def fit( "QRF", "RegimeGatedQRF", "FittedRegimeGatedQRF", + "ConditionalUniforms", "QRFChainState", "QRFChainStepResult", "Regime", diff --git a/packages/microcosm-fit/src/microcosm/fit/qrf.py b/packages/microcosm-fit/src/microcosm/fit/qrf.py index 04d0410bf9..f49d866ccd 100644 --- a/packages/microcosm-fit/src/microcosm/fit/qrf.py +++ b/packages/microcosm-fit/src/microcosm/fit/qrf.py @@ -51,7 +51,7 @@ import hashlib import json import os -from collections.abc import Mapping +from collections.abc import Callable, Mapping, Sequence from concurrent.futures import ThreadPoolExecutor from dataclasses import dataclass, replace @@ -265,6 +265,77 @@ def _interp_rows( return values_lo + weight * (values_hi - values_lo) +def _locate_rows( + values: np.ndarray, + placement: np.ndarray, + grid: np.ndarray, + predictions: np.ndarray, +) -> np.ndarray: + """Per-row inverse of :func:`_interp_rows`: the quantile each value sits at. + + ``_interp_rows`` reads a row's draw off the piecewise-linear curve through + its grid predictions; this locates a value on that same curve and returns + the quantile there. A value strictly between two knots is located by the + inverse of the linear blend, so ``_interp_rows`` at the result gives the + value back exactly. Where the curve is flat the conditional holds an atom: + every quantile across the stretch draws the same value, so the position is + placed inside the stretch by ``placement`` (one uniform per row) and a + value equal to an atom spreads uniformly over the atom's probability mass. + A value below the first knot is placed in ``[0, grid[0])`` and one above + the last knot in ``[grid[-1], 1)``, again by ``placement``; the result + always lies in ``[0, 1)``. + + Args: + values: One observed value per row, shape ``(m,)``. + placement: One uniform in ``[0, 1)`` per row, shape ``(m,)``. + grid: Ascending quantile knots the forest was queried at, shape + ``(g,)``. + predictions: Predicted values, shape ``(m, g)``, non-decreasing along + each row (quantiles of one conditional), row-aligned with + ``values`` and column-aligned with ``grid``. + + Returns: + One quantile per row, shape ``(m,)``. + + Raises: + ValueError: If a prediction row decreases along the grid, which no + quantile curve does; locating a value on it would be ambiguous. + """ + values = np.asarray(values, dtype=np.float64) + placement = np.asarray(placement, dtype=np.float64) + m, g = predictions.shape + if (np.diff(predictions, axis=1) < 0.0).any(): + raise ValueError("grid predictions must be non-decreasing along each row.") + out = np.empty(m, dtype=np.float64) + if m == 0: + return out + below = (predictions < values[:, None]).sum(axis=1) + at_or_below = (predictions <= values[:, None]).sum(axis=1) + # Knots equal to the value form a flat stretch from ``below`` to + # ``at_or_below - 1``; place the row inside it. + flat = at_or_below > below + if flat.any(): + low = np.clip(below[flat], 0, g - 1) + high = np.clip(at_or_below[flat] - 1, 0, g - 1) + out[flat] = grid[low] + placement[flat] * (grid[high] - grid[low]) + strict = ~flat + interior = strict & (below > 0) & (below < g) + if interior.any(): + rows = np.flatnonzero(interior) + upper = below[interior] + lower_knot = predictions[rows, upper - 1] + upper_knot = predictions[rows, upper] + weight = (values[interior] - lower_knot) / (upper_knot - lower_knot) + out[interior] = grid[upper - 1] + weight * (grid[upper] - grid[upper - 1]) + under = strict & (below == 0) + if under.any(): + out[under] = placement[under] * grid[0] + over = strict & (below == g) + if over.any(): + out[over] = grid[-1] + placement[over] * (1.0 - grid[-1]) + return np.clip(out, 0.0, np.nextafter(1.0, 0.0)) + + _SERIALIZED_FOREST_N_JOBS = 1 @@ -340,12 +411,84 @@ def draw(self, frame: pd.DataFrame, quantiles: np.ndarray) -> np.ndarray: """ features = frame.loc[:, list(self.columns)].to_numpy(dtype=np.float64) quantiles = np.asarray(quantiles, dtype=np.float64) - grid = _QUANTILE_GRID n = len(features) out = np.empty(n, dtype=np.float64) if n == 0: return out + def _read(start: int, stop: int, predictions: np.ndarray) -> None: + # Disjoint output slices: each row is written by exactly one worker, + # so the shared ``out`` needs no lock. + out[start:stop] = _interp_rows( + quantiles[start:stop], _QUANTILE_GRID, predictions + ) + + self._grid_predictions(features, _read) + return out + + def quantile_positions( + self, + frame: pd.DataFrame, + values: np.ndarray, + placement: np.ndarray, + ) -> np.ndarray: + """The quantile at which each row's value sits on its conditional. + + The inverse of :meth:`draw`: the forest is queried on the same grid, + and each row's value is located on the piecewise-linear curve + :meth:`draw` reads (:func:`_locate_rows`). ``placement`` gives one + uniform per row that places the value inside a flat stretch of the + curve (a conditional atom) or beyond its ends, so a value shared by + many leaf samples covers the atom's probability mass uniformly rather + than collapsing onto one quantile. :meth:`draw` at the returned + quantile reproduces the value exactly where the curve is strictly + increasing, and the atom's value across a flat stretch. + + Args: + frame: Feature rows (must carry the fitted columns). + values: One observed value per row, positionally aligned. + placement: One uniform in ``[0, 1)`` per row, positionally aligned. + + Returns: + One quantile in ``[0, 1)`` per row, positionally aligned with + ``frame``. + """ + features = frame.loc[:, list(self.columns)].to_numpy(dtype=np.float64) + values = np.asarray(values, dtype=np.float64) + placement = np.asarray(placement, dtype=np.float64) + n = len(features) + if values.shape != (n,) or placement.shape != (n,): + raise ValueError("values and placement must have one entry per row.") + out = np.empty(n, dtype=np.float64) + if n == 0: + return out + + def _locate(start: int, stop: int, predictions: np.ndarray) -> None: + out[start:stop] = _locate_rows( + values[start:stop], placement[start:stop], _QUANTILE_GRID, predictions + ) + + self._grid_predictions(features, _locate) + return out + + def _grid_predictions( + self, + features: np.ndarray, + consume: Callable[[int, int, np.ndarray], None], + ) -> None: + """Predict the quantile grid per row in bounded, parallel chunks. + + ``consume(start, stop, predictions)`` receives each chunk's + ``(stop - start) x len(grid)`` prediction matrix; the chunks are + disjoint row ranges, so a consumer writing its own slice of an output + needs no lock. Chunk boundaries never change a row's predictions (the + forest predict is pure per row), so the parallel pass is bit-identical + to a serial one; the tests pin that exact equality. + """ + grid = _QUANTILE_GRID + n = len(features) + if n == 0: + return workers = _predict_workers() # Bound the (rows x grid) matrix per chunk (memory) while cutting enough # chunks to balance across workers. Boundaries are draw-invariant, so @@ -353,33 +496,30 @@ def draw(self, frame: pd.DataFrame, quantiles: np.ndarray) -> np.ndarray: chunk = max(1, min(_PREDICT_CHUNK_ROWS, -(-n // (4 * workers)))) bounds = [(start, min(start + chunk, n)) for start in range(0, n, chunk)] - def _draw_chunk(bound: tuple[int, int]) -> None: + def _predict_chunk(bound: tuple[int, int]) -> None: start, stop = bound predictions = np.asarray( self.model.predict(features[start:stop], quantiles=list(grid)) ).reshape(stop - start, len(grid)) - # Disjoint output slices: each row is written by exactly one worker, - # so the shared ``out`` needs no lock. - out[start:stop] = _interp_rows(quantiles[start:stop], grid, predictions) + consume(start, stop, predictions) if workers <= 1 or len(bounds) <= 1: for bound in bounds: - _draw_chunk(bound) - return out + _predict_chunk(bound) + return # Force the forest's own ``apply`` to run serially inside each worker: # the outer pool already saturates the cores, so leaving it at the fit's # ``n_jobs=-1`` would fan a thread pool under every worker and thrash. - # This synchronous draw owns the model, so the swap-and-restore is safe. + # This synchronous pass owns the model, so the swap-and-restore is safe. saved_n_jobs = self.model.n_jobs self.model.n_jobs = 1 try: with ThreadPoolExecutor(max_workers=workers) as pool: - for _ in pool.map(_draw_chunk, bounds): + for _ in pool.map(_predict_chunk, bounds): pass finally: self.model.n_jobs = saved_n_jobs - return out #: Fine symmetric quantile grid used to read per-row draws. The interior is an @@ -985,6 +1125,31 @@ def _max_samples_leaf_kind(value: int | float | None) -> str: return "invalid" +def _validate_uniform_mapping( + name: str, + supplied: object, + targets: Sequence[str], + n: int, +) -> dict[str, np.ndarray]: + """Check one per-target uniform mapping: exact targets, shape, ``[0, 1)``.""" + if not isinstance(supplied, Mapping) or set(supplied) != set(targets): + raise ValueError(f"{name} must contain exactly the fitted targets.") + arrays: dict[str, np.ndarray] = {} + for target in targets: + raw = np.asarray(supplied[target]) + if raw.dtype.kind not in "iuf": + raise ValueError( + f"{name}[{target!r}] uniforms must be real numeric arrays." + ) + values = np.asarray(raw, dtype=np.float64) + if values.shape != (n,): + raise ValueError(f"{name}[{target!r}] must have shape ({n},).") + if not np.isfinite(values).all() or ((values < 0) | (values >= 1)).any(): + raise ValueError(f"{name}[{target!r}] uniforms must be in [0, 1).") + arrays[target] = values + return arrays + + def _gate_draw_with_rng( gate: HistGradientBoostingClassifier, features: pd.DataFrame, @@ -1559,6 +1724,25 @@ def _fit_gate( return gate +@dataclass(frozen=True) +class ConditionalUniforms: + """The uniforms at which a fitted model's draw reproduces observed targets. + + ``quantiles`` and ``sign_uniforms`` have the shape + :meth:`FittedRegimeGatedQRF.predict_from_uniforms` takes, one array per + target aligned to the scored rows. ``degenerate`` names the targets whose + training support was all zero, so no conditional exists and both arrays + are the caller's placement uniforms; ``ungated`` names the targets fitted + without a sign gate (one sign in training), whose sign uniform is the + placement uniform while the quantile is located on the single forest. + """ + + quantiles: dict[str, np.ndarray] + sign_uniforms: dict[str, np.ndarray] + degenerate: tuple[str, ...] + ungated: tuple[str, ...] + + class FittedRegimeGatedQRF: """A fitted :class:`RegimeGatedQRF`, ready to draw. @@ -1613,6 +1797,27 @@ def regimes(self) -> dict[str, str]: """The detected :class:`Regime` label per target.""" return {name: model.regime for name, model in self._target_models.items()} + def sign_classes(self, target: str) -> tuple[int, ...]: + """The sign classes of ``target``, ascending. + + The gate's classes for a gated regime, the single sign for an ungated + one and ``(0,)`` for a degenerate-zero target. Two fitted models read a + sign uniform the same way only when their class tuples match, so a + caller that draws one model at uniforms located on another checks them. + """ + if target not in self._target_models: + raise ValueError(f"unknown target {target!r}.") + model = self._target_models[target] + if model is _RELEASED: + raise ValueError(f"target {target!r} has been released.") + if model.gate is not None: + return tuple(int(value) for value in np.asarray(model.gate.classes_)) + return { + Regime.POSITIVE_ONLY: (1,), + Regime.NEGATIVE_ONLY: (-1,), + Regime.DEGENERATE_ZERO: (0,), + }[model.regime] + def predict( self, frame_or_df: Frame | pd.DataFrame, @@ -1670,31 +1875,13 @@ def predict_from_uniforms( legacy :meth:`predict` stream and its consumption order are unchanged. """ features = self._predictor_frame(frame_or_df) - arrays = {} - for name, supplied in ( - ("quantiles", quantiles), - ("sign_uniforms", sign_uniforms), - ): - if not isinstance(supplied, Mapping) or set(supplied) != set(self.targets): - raise ValueError(f"{name} must contain exactly the fitted targets.") - arrays[name] = {} - for target in self.targets: - raw = np.asarray(supplied[target]) - if raw.dtype.kind not in "iuf": - raise ValueError( - f"{name}[{target!r}] uniforms must be real numeric arrays." - ) - values = np.asarray(raw, dtype=np.float64) - if values.shape != (len(features),): - raise ValueError( - f"{name}[{target!r}] must have shape ({len(features)},)." - ) - if ( - not np.isfinite(values).all() - or ((values < 0) | (values >= 1)).any() - ): - raise ValueError(f"{name}[{target!r}] uniforms must be in [0, 1).") - arrays[name][target] = values + arrays = { + name: _validate_uniform_mapping(name, supplied, self.targets, len(features)) + for name, supplied in ( + ("quantiles", quantiles), + ("sign_uniforms", sign_uniforms), + ) + } out = pd.DataFrame(index=features.index) if features.empty: return out.reindex(columns=self.targets).astype(np.float64) @@ -1710,6 +1897,140 @@ def predict_from_uniforms( augmented[target] = drawn return out + def conditional_uniforms( + self, + frame_or_df: Frame | pd.DataFrame, + *, + sign_placement: Mapping[str, np.ndarray], + quantile_placement: Mapping[str, np.ndarray], + ) -> ConditionalUniforms: + """Locate observed targets on this model's conditional, as uniforms. + + The Rosenblatt transform of each row's observed target vector under + the fitted conditional: for every target in chain order, with the + row's predictors and its *observed* earlier targets as features, the + observed value is placed on the gate's cumulative class probabilities + (the sign uniform) and, within its sign, on that sign's magnitude + forest (the quantile; :meth:`_Forest.quantile_positions`). Feeding the + result to :meth:`predict_from_uniforms` on this model draws each row's + observed vector back; feeding it to another model fitted with the same + predictors and targets draws each row at the same standing among its + peers under that model's conditional, which transports the row from + one population to another while keeping its relative position. + + Where the observed value gives no position, a class with the gate's + probability mass or a flat stretch of a forest's conditional, the + placement inside it is the caller's uniform per row and target + (``sign_placement`` for the class, ``quantile_placement`` for the + magnitude), so the result is reproducible and row-order invariant; + pairing them with stable identities keeps a row's uniforms fixed + whoever else is scored. Both mappings have the shape + :meth:`predict_from_uniforms` requires. No model RNG is consumed and + the fitted forests remain reusable. + + Raises: + ValueError: If the input lacks a predictor or observed target + column, carries non-finite targets, or places a row in a sign + class the fitted gate never saw (the input disagrees with the + training regime: a nonzero value on a degenerate-zero target, + a negative value on a target fitted positive-only, and so on). + RuntimeError: If a target's forests were released. + """ + features = self._predictor_frame(frame_or_df) + table = ( + frame_or_df.table(self.entity) + if isinstance(frame_or_df, Frame) + else frame_or_df + ) + missing = [target for target in self.targets if target not in table.columns] + if missing: + raise ValueError( + "conditional_uniforms input is missing observed target column(s) " + f"{missing}." + ) + observed = table.loc[:, self.targets].to_numpy(dtype=np.float64) + if not np.isfinite(observed).all(): + raise ValueError("conditional_uniforms observed targets must be finite.") + n = len(features) + signs = _validate_uniform_mapping( + "sign_placement", sign_placement, self.targets, n + ) + quants = _validate_uniform_mapping( + "quantile_placement", quantile_placement, self.targets, n + ) + quantiles: dict[str, np.ndarray] = {} + sign_uniforms: dict[str, np.ndarray] = {} + degenerate: list[str] = [] + ungated: list[str] = [] + top = np.nextafter(1.0, 0.0) + augmented = features.copy() + for position, target in enumerate(self.targets): + model = self._target_models[target] + if model is _RELEASED: + raise RuntimeError( + "This target's fitted forests were released; refit to locate " + "observed values." + ) + y = observed[:, position] + labels = np.zeros(n, dtype=int) + labels[y > self._zero_atol] = 1 + labels[y < -self._zero_atol] = -1 + sign = signs[target] + quantile = quants[target].copy() + if model.regime == Regime.DEGENERATE_ZERO: + if (labels != 0).any(): + raise ValueError( + f"Target {target!r} is degenerate zero in training but the " + "input carries nonzero values." + ) + degenerate.append(target) + elif model.regime in (Regime.POSITIVE_ONLY, Regime.NEGATIVE_ONLY): + expected = 1 if model.regime == Regime.POSITIVE_ONLY else -1 + if (labels != expected).any(): + raise ValueError( + f"Target {target!r} has regime {model.regime!r} in training " + "but the input carries values of another sign." + ) + forest = model.positive if expected == 1 else model.negative + quantile = forest.quantile_positions(augmented, y, quantile) + ungated.append(target) + else: + classes = np.asarray(model.gate.classes_) + index = np.searchsorted(classes, labels) + index = np.clip(index, 0, len(classes) - 1) + unknown = sorted(set(labels[classes[index] != labels].tolist())) + if unknown: + raise ValueError( + f"Target {target!r}: observed sign class(es) {unknown} are " + f"absent from the fitted gate's classes {classes.tolist()}." + ) + x = augmented.loc[:, list(model.columns)].to_numpy(dtype=np.float64) + proba = np.asarray(model.gate.predict_proba(x)) + rows = np.arange(n) + mass = proba[rows, index] + before = np.cumsum(proba, axis=1)[rows, index] - mass + sign = np.minimum(before + sign * mass, top) + for code, forest in ((1, model.positive), (-1, model.negative)): + mask = labels == code + if not mask.any(): + continue + if forest is None: + raise ValueError( + f"Target {target!r} fitted no forest for sign {code}." + ) + quantile[mask] = forest.quantile_positions( + augmented.loc[mask], y[mask], quantile[mask] + ) + quantiles[target] = np.asarray(quantile, dtype=np.float64) + sign_uniforms[target] = np.asarray(sign, dtype=np.float64) + augmented[target] = y + return ConditionalUniforms( + quantiles=quantiles, + sign_uniforms=sign_uniforms, + degenerate=tuple(degenerate), + ungated=tuple(ungated), + ) + def predict_positive_from_uniforms( self, frame_or_df: Frame | pd.DataFrame, diff --git a/packages/microcosm-fit/tests/engine_free/shared/test_qrf_stateless.py b/packages/microcosm-fit/tests/engine_free/shared/test_qrf_stateless.py index 01bdce5c6a..c436a67496 100644 --- a/packages/microcosm-fit/tests/engine_free/shared/test_qrf_stateless.py +++ b/packages/microcosm-fit/tests/engine_free/shared/test_qrf_stateless.py @@ -301,3 +301,263 @@ def test_chain_step_exposes_a_fitted_one_target_view(): ) pd.testing.assert_frame_equal(first, step_two_again.fitted.predict(augmented)) np.testing.assert_array_equal(step_two.raw_draw, step_two_again.raw_draw) + + +def _placements(model, n, seed): + rng = np.random.default_rng(seed) + return { + "sign_placement": {t: rng.random(n) for t in model.targets}, + "quantile_placement": {t: rng.random(n) for t in model.targets}, + } + + +def test_conditional_uniforms_round_trip_reproduces_observed_targets(model): + """Locating the training rows and drawing at those uniforms gives them back. + + Every fixture target is an atom of its conditional at each ``x`` (the + donor repeats each value), so the located quantile sits on a flat stretch + and the draw returns the atom exactly; the sign uniform lands in the + observed class because it is placed inside that class's gate mass. + """ + x = np.tile(np.arange(30, dtype=float), 6) + observed = pd.DataFrame( + { + "x": x, + "positive": x + 1, + "negative": -x - 1, + "zero": np.zeros(len(x)), + "mixed": np.tile([-2.0, 0.0, 3.0], len(x) // 3), + "inflated": np.tile([0.0, 4.0], len(x) // 2), + "negative_inflated": np.tile([0.0, -4.0], len(x) // 2), + "two_sign": np.tile([-3.0, 4.0], len(x) // 2), + } + ) + before = copy.deepcopy(model._rng.bit_generator.state) + located = model.conditional_uniforms(observed, **_placements(model, len(x), 1)) + assert model._rng.bit_generator.state == before + assert located.degenerate == ("zero",) + assert located.ungated == ("positive", "negative") + for mapping in (located.quantiles, located.sign_uniforms): + assert set(mapping) == set(model.targets) + for values in mapping.values(): + assert values.shape == (len(x),) + assert ((values >= 0) & (values < 1)).all() + drawn = model.predict_from_uniforms( + observed[["x"]], + quantiles=located.quantiles, + sign_uniforms=located.sign_uniforms, + ) + pd.testing.assert_frame_equal( + drawn, observed[model.targets].astype(float), check_exact=False, rtol=1e-9 + ) + + +def test_conditional_uniforms_are_row_order_invariant(model): + x = np.tile(np.arange(30, dtype=float), 2) + observed = pd.DataFrame( + { + "x": x, + "positive": x + 1, + "negative": -x - 1, + "zero": np.zeros(len(x)), + "mixed": np.tile([-2.0, 0.0, 3.0], len(x) // 3), + "inflated": np.tile([0.0, 4.0], len(x) // 2), + "negative_inflated": np.tile([0.0, -4.0], len(x) // 2), + "two_sign": np.tile([-3.0, 4.0], len(x) // 2), + } + ) + placements = _placements(model, len(x), 2) + expected = model.conditional_uniforms(observed, **placements) + order = np.random.default_rng(5).permutation(len(x)) + reordered = model.conditional_uniforms( + observed.iloc[order], + **{k: {t: v[order] for t, v in d.items()} for k, d in placements.items()}, + ) + for target in model.targets: + np.testing.assert_array_equal( + expected.quantiles[target][order], reordered.quantiles[target] + ) + np.testing.assert_array_equal( + expected.sign_uniforms[target][order], reordered.sign_uniforms[target] + ) + + +def test_conditional_uniforms_are_uniform_off_sample_and_transport_standing(): + """Held-out rows locate uniformly, and the uniforms carry a row's standing. + + Population A is ``y = x + 5 + noise``; population B is ``y = 2x + 10 + noise``. + Locating A's held-out rows under A's forest gives magnitude quantiles close + to U[0, 1) (the probability integral transform), and drawing B's forest at + those uniforms ranks the rows within each ``x`` as A ranked them. + """ + rng = np.random.default_rng(11) + x = np.repeat(np.arange(10, dtype=float), 300) + donor_a = pd.DataFrame({"x": x, "y": x + 5 + rng.normal(size=len(x))}) + donor_b = pd.DataFrame({"x": x, "y": 2 * x + 10 + rng.normal(size=len(x))}) + model_a = fit(donor_a, ["x"], ["y"], weights="none", n_estimators=20, seed=3) + model_b = fit(donor_b, ["x"], ["y"], weights="none", n_estimators=20, seed=4) + held = pd.DataFrame({"x": x, "y": x + 5 + rng.normal(size=len(x))}) + placements = { + "sign_placement": {"y": rng.random(len(x))}, + "quantile_placement": {"y": rng.random(len(x))}, + } + located = model_a.conditional_uniforms(held, **placements) + quantiles = np.sort(located.quantiles["y"]) + empirical = np.arange(1, len(quantiles) + 1) / len(quantiles) + kolmogorov = np.abs(empirical - quantiles).max() + assert kolmogorov < 0.08, kolmogorov + transported = model_b.predict_from_uniforms( + held[["x"]], + quantiles=located.quantiles, + sign_uniforms=located.sign_uniforms, + )["y"].to_numpy() + for value in np.unique(x): + rows = x == value + rank_a = pd.Series(held.y.to_numpy()[rows]).rank().to_numpy() + rank_b = pd.Series(transported[rows]).rank().to_numpy() + assert np.corrcoef(rank_a, rank_b)[0, 1] > 0.95 + # B's level is imported: the transported draws sit on B's scale, not A's. + assert transported.mean() > 2 * x.mean() + 5 + + +def test_quantile_positions_match_chunked_and_serial_passes(model, monkeypatch): + from microcosm.fit import qrf as qrf_module + + x = np.tile(np.arange(30, dtype=float), 2) + frame = pd.DataFrame({"x": x}) + forest = model._target_models["positive"].positive + placement = np.random.default_rng(6).random(len(x)) + serial = forest.quantile_positions(frame, x + 1, placement) + monkeypatch.setattr(qrf_module, "_PREDICT_CHUNK_ROWS", 7) + chunked = forest.quantile_positions(frame, x + 1, placement) + np.testing.assert_array_equal(serial, chunked) + drawn = forest.draw(frame, serial) + np.testing.assert_allclose(drawn, x + 1) + + +def test_locate_rows_inverts_interp_rows(): + from microcosm.fit.qrf import _interp_rows, _locate_rows + + grid = np.array([0.1, 0.3, 0.5, 0.7, 0.9]) + predictions = np.array( + [ + [1.0, 2.0, 3.0, 4.0, 5.0], # strictly increasing + [1.0, 2.0, 2.0, 2.0, 5.0], # a flat stretch at 2.0 + [1.0, 2.0, 3.0, 4.0, 5.0], # below the first knot + [1.0, 2.0, 3.0, 4.0, 5.0], # above the last knot + [2.0, 2.0, 2.0, 2.0, 2.0], # one atom + ] + ) + values = np.array([2.5, 2.0, 0.5, 7.0, 2.0]) + placement = np.array([0.5, 0.25, 0.5, 0.5, 0.75]) + located = _locate_rows(values, placement, grid, predictions) + np.testing.assert_allclose(located[0], 0.4) + np.testing.assert_allclose(located[1], 0.3 + 0.25 * (0.7 - 0.3)) + np.testing.assert_allclose(located[2], 0.05) + np.testing.assert_allclose(located[3], 0.95) + np.testing.assert_allclose(located[4], 0.1 + 0.75 * 0.8) + assert ((located >= 0) & (located < 1)).all() + read_back = _interp_rows(located, grid, predictions) + np.testing.assert_allclose(read_back[[0, 1, 4]], values[[0, 1, 4]]) + np.testing.assert_allclose(read_back[2], 1.0) # clamped to the curve's ends + np.testing.assert_allclose(read_back[3], 5.0) + with pytest.raises(ValueError, match="non-decreasing"): + _locate_rows( + values[:1], placement[:1], grid, np.array([[3.0, 2.0, 2.0, 2.0, 2.0]]) + ) + + +def test_conditional_uniforms_refuse_inconsistent_inputs(model): + x = np.arange(6, dtype=float) + observed = pd.DataFrame( + { + "x": x, + "positive": x + 1, + "negative": -x - 1, + "zero": np.zeros(6), + "mixed": np.tile([-2.0, 0.0, 3.0], 2), + "inflated": np.tile([0.0, 4.0], 3), + "negative_inflated": np.tile([0.0, -4.0], 3), + "two_sign": np.tile([-3.0, 4.0], 3), + } + ) + placements = _placements(model, 6, 8) + with pytest.raises(ValueError, match="missing observed target"): + model.conditional_uniforms(observed.drop(columns=["mixed"]), **placements) + degenerate = observed.copy() + degenerate.loc[0, "zero"] = 1.0 + with pytest.raises(ValueError, match="degenerate zero"): + model.conditional_uniforms(degenerate, **placements) + wrong_sign = observed.copy() + wrong_sign.loc[0, "positive"] = -1.0 + with pytest.raises(ValueError, match="another sign"): + model.conditional_uniforms(wrong_sign, **placements) + unseen_class = observed.copy() + unseen_class.loc[0, "inflated"] = -4.0 + with pytest.raises(ValueError, match="absent from the fitted gate"): + model.conditional_uniforms(unseen_class, **placements) + short = {k: {t: v[:5] for t, v in d.items()} for k, d in placements.items()} + with pytest.raises(ValueError, match="must have shape"): + model.conditional_uniforms(observed, **short) + released = copy.deepcopy(model) + released.predict(observed[["x"]], release_models=True) + with pytest.raises(RuntimeError, match="released"): + released.conditional_uniforms(observed, **placements) + + +def test_conditional_uniforms_carry_the_zero_class_between_gated_models(): + """A zero-inflated row's sign uniform lands by its class under another gate. + + Under A half the rows are zero; under B a fifth are. A row that is positive + under A sits above A's zero mass, so B, whose zero mass is smaller, draws it + positive every time; a row that is zero under A is spread over A's zero + mass, so B keeps about two fifths of them at zero and the rest draw + positive. This is the mechanism that carries "has pay" across populations. + """ + rng = np.random.default_rng(12) + x = np.repeat(np.arange(10, dtype=float), 300) + positive_a = rng.random(len(x)) < 0.5 + donor_a = pd.DataFrame( + {"x": x, "y": np.where(positive_a, x + 5 + rng.normal(size=len(x)), 0.0)} + ) + positive_b = rng.random(len(x)) < 0.8 + donor_b = pd.DataFrame( + {"x": x, "y": np.where(positive_b, 2 * x + 10 + rng.normal(size=len(x)), 0.0)} + ) + model_a = fit(donor_a, ["x"], ["y"], weights="none", n_estimators=20, seed=5) + model_b = fit(donor_b, ["x"], ["y"], weights="none", n_estimators=20, seed=6) + assert model_a.regimes() == {"y": Regime.ZERO_INFLATED_POSITIVE} + located = model_a.conditional_uniforms( + donor_a, + sign_placement={"y": rng.random(len(x))}, + quantile_placement={"y": rng.random(len(x))}, + ) + transported = model_b.predict_from_uniforms( + donor_a[["x"]], + quantiles=located.quantiles, + sign_uniforms=located.sign_uniforms, + )["y"].to_numpy() + assert (transported[positive_a] > 0).all() + kept_zero = (transported[~positive_a] == 0).mean() + assert 0.3 < kept_zero < 0.5, kept_zero + + +def test_sign_classes_follow_the_regime(model): + """The classes a target's gate orders, or the single sign of an ungated + regime, so a caller drawing one model at uniforms located on another can + check the two read a sign uniform the same way.""" + expected = { + "positive": (1,), + "negative": (-1,), + "zero": (0,), + "mixed": (-1, 0, 1), + "inflated": (0, 1), + "negative_inflated": (-1, 0), + "two_sign": (-1, 1), + } + for target, classes in expected.items(): + assert model.sign_classes(target) == classes, target + assert list(classes) == sorted(classes) + assert model.regimes()["positive"] == Regime.POSITIVE_ONLY + with pytest.raises(ValueError, match="unknown target"): + model.sign_classes("missing") diff --git a/packages/microcosm-graph/tests/fixtures/parity/kernels/fit.qrf/pins.json b/packages/microcosm-graph/tests/fixtures/parity/kernels/fit.qrf/pins.json index 60d075eb93..043e8f4660 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/kernels/fit.qrf/pins.json +++ b/packages/microcosm-graph/tests/fixtures/parity/kernels/fit.qrf/pins.json @@ -1 +1 @@ -{"dependencies":{"numpy":"2.4.6","pandas":"3.0.3","quantile-forest":"1.4.2","scikit-learn":"1.8.0"},"implementation_hash":"8f14366656a35101e5931eb02e62a3bd65886c02fe2db987bc73a6f4c6eecd74","kernel":"fit.qrf@1","node":"fit_qrf","node_key":"635cb6a330725157293c9296e546c369042e2de2d11d5ede2f78878889094349","numeric":"platform_bitwise","platform":"arm64/darwin/py3.14","platforms":{"arm64/darwin/py3.14":{"direct":"direct.csv","node_key":"635cb6a330725157293c9296e546c369042e2de2d11d5ede2f78878889094349"},"x86_64/linux/py3.13":{"direct":"platforms/x86_64-linux-py3_13/direct.csv","node_key":"0da5454ed9ac8846c57c7575e03ab043d53f8cb2a6c0f4a3522c1ab6d1bf0755"},"x86_64/linux/py3.14":{"direct":"platforms/x86_64-linux-py3_14/direct.csv","node_key":"4dc0ded1ad865fff67a50a1088d09a001f0891af1f243b4ae9207a0d1ccdf1c0"}},"seed":947} +{"dependencies":{"numpy":"2.4.6","pandas":"3.0.3","quantile-forest":"1.4.2","scikit-learn":"1.8.0"},"implementation_hash":"fc75df4cc7b44f9277714661ffbc79728a30fb89957da52cfd6d82b1dcd0d3fa","kernel":"fit.qrf@1","node":"fit_qrf","node_key":"d76005a7a0767f62cd55f2d9a941d8ace68fa53448650e0f4ee97040960a6b22","numeric":"platform_bitwise","platform":"arm64/darwin/py3.14","platforms":{"arm64/darwin/py3.14":{"direct":"direct.csv","node_key":"d76005a7a0767f62cd55f2d9a941d8ace68fa53448650e0f4ee97040960a6b22"},"x86_64/linux/py3.13":{"direct":"platforms/x86_64-linux-py3_13/direct.csv","node_key":"eea71eb4437c9a1db975f22b7fa878c06746c5746c8497f2217ed5132a52646c"},"x86_64/linux/py3.14":{"direct":"platforms/x86_64-linux-py3_14/direct.csv","node_key":"2be10b1d3ed415552985c1581eb673070bccffc340778119bef70f9192039516"}},"seed":947} diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json index cbd4855cfb..6d492a73db 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/cgt_asset_type_facts.json @@ -2,70 +2,70 @@ "resource": "synthetic-cgt-asset-type.json", "resource_sha256": "synthetic", "source_commit": "synthetic", - "table4_all_gains": 6983113.129676064, + "table4_all_gains": 6514166.302732463, "table4_all_tax": 0.0, - "table4_all_taxpayers": 16.094983343942488, + "table4_all_taxpayers": 16.148473673276698, "table4_bands": [ { - "gains": 8222.831155197551, + "gains": 7783.990538546768, "lower_bound": 0, "tax": null, - "taxpayers": 1.9510482248880026, + "taxpayers": 2.0026411075377792, "upper_bound": 10000 }, { - "gains": 21895.611760407053, + "gains": 26119.446564634374, "lower_bound": 10000, "tax": null, - "taxpayers": 1.418470453276858, + "taxpayers": 1.487867248593902, "upper_bound": 25000 }, { - "gains": 34067.93073230906, + "gains": 49781.01752911345, "lower_bound": 25000, "tax": null, - "taxpayers": 0.9749275341889313, + "taxpayers": 1.3455777298227016, "upper_bound": 50000 }, { - "gains": 101619.46463824037, + "gains": 106977.1033635592, "lower_bound": 50000, "tax": null, - "taxpayers": 1.3667147296498983, + "taxpayers": 1.4303755939511549, "upper_bound": 100000 }, { - "gains": 375781.63324098045, + "gains": 388325.05202461896, "lower_bound": 100000, "tax": null, - "taxpayers": 2.4059169352144028, + "taxpayers": 2.4814642253794714, "upper_bound": 250000 }, { - "gains": 719863.4499270874, + "gains": 497308.1835164052, "lower_bound": 250000, "tax": null, - "taxpayers": 1.8848977837476633, + "taxpayers": 1.3559425316699736, "upper_bound": 500000 }, { - "gains": 1133982.6950390092, + "gains": 1385347.683474949, "lower_bound": 500000, "tax": null, - "taxpayers": 1.5053281697938976, + "taxpayers": 1.9920814106010807, "upper_bound": 1000000 }, { - "gains": 4587679.513182833, + "gains": 4052523.8257206357, "lower_bound": 1000000, "tax": null, - "taxpayers": 4.587679513182833, + "taxpayers": 4.052523825720636, "upper_bound": null } ], - "table4_individuals_gains": 6983113.129676064, + "table4_individuals_gains": 6514166.302732463, "table4_individuals_tax": 0.0, - "table4_individuals_taxpayers": 16.094983343942488, + "table4_individuals_taxpayers": 16.148473673276698, "table4_trusts_gains": 0.0, "table4_trusts_tax": 0.0, "table7_total_disposals": 2743095.2380952383, @@ -114,12 +114,12 @@ "proceeds": 9000000000.0 } ], - "table8a_disposals_total": 30.35054002000583, - "table8a_gains_total": 39659585.85517995, - "table8a_tax_total": 7931917.17103599, - "table8a_taxpayers_total": 27.591400018187116, - "table8b_all_gains": 39659585.85517995, - "table8b_all_taxpayers": 27.591400018187116, - "table8b_individuals_gains": 39659585.85517995, - "table8b_individuals_taxpayers": 27.591400018187116 + "table8a_disposals_total": 30.451407498178924, + "table8a_gains_total": 46295466.727019295, + "table8a_tax_total": 9259093.34540386, + "table8a_taxpayers_total": 27.683097725617202, + "table8b_all_gains": 46295466.727019295, + "table8b_all_taxpayers": 27.683097725617202, + "table8b_individuals_gains": 46295466.727019295, + "table8b_individuals_taxpayers": 27.683097725617202 } diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json index 37683ca06b..e342b596dc 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/fixture.json @@ -2732,7 +2732,7 @@ "hmrc_spi_total_investment_income", "hmrc_spi_assessable_income" ], - "notes": "Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path.", + "notes": "Runs the SPI-trained income QRFs on the raw-spine support channel, drawing for its claimants and partners aged 16 and over so dependants aged 16 to 19 keep their FRS twin's values (uk-data#504, microcosm#1095), initializes FRS charity columns to zero, trains FRS-only stage 2 on the FRS rows' reported values, flags the rows it drew (person_is_spi_income_recipient) so later stages tell tape-concept rows from FRS-concept ones without re-deriving the recipient rule (microcosm#840), leaves every FRS-channel income as reported (no base-channel redraw of dividends; uk-data#498, microcosm#1095), and emits a sidecar-only 208-fact replay report for the spine path.", "operations": [ { "artifact_roles": [ @@ -2781,7 +2781,10 @@ "TAX_CRED", "TEI", "TII", - "TI" + "TI", + "MAINSRCE", + "SEINC_NUM", + "SPA" ], "runtime_sha256_required": true, "seed": 42, @@ -2797,9 +2800,32 @@ }, { "assessable_income_source_semantics": "QRF draws leaves only; TEI, TII, and TI are deterministic post-draw accounting aggregates and TI equals TEI + TII exactly", + "bridge_predictors": { + "at_or_over_spa": { + "tape": "SPA = 1; composites SRP > 0", + "twin": "age at or over policyengine-uk gov.dwp.state_pension.age at the build instant", + "validation": "SRP > 0 share among SPA 1 and SPA 1 share among SRP > 0" + }, + "has_pay": { + "tape": "employment_income > 0", + "twin": "employment_income > 0", + "validation": "PAY > 0 share among MAINSRCE 1" + }, + "has_trade": { + "tape": "SEINC_NUM = 1 (self-employment or partnership pages); composites self_employment_income > 0", + "twin": "self_employment_income > 0 or a self-employed main job (employment_status FT_SELF_EMPLOYED or PT_SELF_EMPLOYED)", + "validation": "SEINC_NUM 1 share among PROFITS > 0" + }, + "main_source": { + "tape": "largest of employment_income (PAY + EPB + TAXTERM), private_pension_income + hmrc_spi_state_pension_income (PENSION + SRP) and self_employment_income (max(0, PROFITS - CAPALL - LOSSBF)); other when none is positive", + "twin": "largest of employment_income, private_pension_income + state_pension_reported and self_employment_income; other when none is positive", + "validation": "weighted agreement with the published MAINSRCE code (1 pay; 2 occupational pension; 3 sole trader and 4 partnership, trade; 5 other and 6 claims case, other) at least 0.95 over the classified records, reported by code; composites (-1) carry no code" + } + }, "categorical_predictors": [ "gender", - "region" + "region", + "main_source" ], "derived_policyengine_outputs": { "employment_income": { @@ -2814,9 +2840,15 @@ }, "donor_income_period": 2022, "double_apply_source_weight": false, + "draw": "twin_conditional_quantiles", "employment_income_source_semantics": "PolicyEngine input = PAY + EPB + TAXTERM, matching the pinned enhanced-FRS pipeline; it is not the Table 3.6 measure", "fit_weight_kind": "design", "hmrc_employed_income_source_semantics": "Derived after each draw as max(0, PAY + EPB - EXPS) + INCPBEN + OSSBEN + TAXTERM + UBISJA + MOTHINC, using normalized leaves identically on FRS and SPI channels", + "identity_uniforms": { + "key": "person_source_id", + "salt": "spi_stage1::", + "seed": 42 + }, "income_uprating_variables": { "charitable_investment_gifts": null, "dividend_income": "dividend_income", @@ -2870,11 +2902,55 @@ "predictors": [ "age", "gender", - "region" + "region", + "main_source", + "has_pay", + "has_trade", + "at_or_over_spa" ], "rebase_income_to_build_period": true, + "recipient_income_rule": { + "drawn": "the twin reports pay, a trade (self_employment_income > 0 or a self-employed main job) or a pension (private_pension_income + state_pension_reported > 0), or more than the floor of taxable interest (savings_interest_income less tax_free_savings_income), dividend_income, property_income and miscellaneous_income together; a reserved band carrier is always drawn; a twin whose only record is the State Pension is drawn, against a tape that mostly holds taxpayers, which can lift its pension leaves", + "undrawn": "the twin has no tax record for the tape to condition on; the copy keeps the twin's values at stage 1 and stage 2 (a declared modelling boundary like the under-16 one, microcosm#840)", + "unearned_income_floor_gbp": 1000 + }, "recipient_minimum_age": 16, "recipient_role_column": "is_uc_claimant", + "reference_model": { + "analogue_columns": { + "charitable_investment_gifts": null, + "dividend_income": "dividend_income", + "gift_aid": null, + "hmrc_spi_employment_benefits": null, + "hmrc_spi_employment_expenses": null, + "hmrc_spi_incapacity_benefit_income": "hmrc_spi_incapacity_benefit_income", + "hmrc_spi_miscellaneous_employment_income": null, + "hmrc_spi_other_income": "miscellaneous_income", + "hmrc_spi_other_social_security_income": "ossben_identifiable_subset", + "hmrc_spi_pay": "hmrc_spi_pay", + "hmrc_spi_state_pension_income": "srp_regular_code5", + "hmrc_spi_taxable_termination_pay": null, + "hmrc_spi_unemployment_benefit_income": "hmrc_spi_unemployment_benefit_income", + "other_investment_income": null, + "private_pension_income": "private_pension_income", + "property_finance_costs": null, + "property_income": "property_income", + "savings_interest_income": "taxable_savings_interest", + "self_employment_income": "self_employment_income" + }, + "fit_weight_kind": "importance", + "fold_key": "predictor cell (gender, region, whole-year age, main_source, has_pay, has_trade, at_or_over_spa), the fold being floor(uniform x folds) of the cell's stable_identity_uniforms draw at the stage seed and salt spi_stage1:reference_fold; each fold's recipients are located by a forest fitted on the other folds, so the forest that locates a copy never saw its twin, and every row of a cell is located by one forest", + "folds": 5, + "method": "Rosenblatt transport (microcosm#840): each drawn recipient's twin values are located on the reference forest, the sign uniform in the gate's cumulative class probabilities and the quantile on the sign's magnitude forest, each leaf chained on the twin's observed earlier leaves, and the stage-1 forest draws at those uniforms, so the recipient receives the SPI income of someone in the same position among SPI people like it as the twin holds among FRS people like it. taxable_savings_interest is savings_interest_income less tax_free_savings_income, floored at zero. A leaf without an analogue, or whose analogue is degenerate on the FRS rows, draws at identity-keyed uniforms, as do the placements inside a class or a flat stretch of a conditional; no model random stream is consumed. The reference locates a leaf given the twin's observed earlier analogue leaves, while the stage-1 forest draws it given every earlier output, the identity-uniform leaves included, so the located quantile is read off a conditional the identity draws also shape (microcosm#840 follow-up: the chain order). A full build refuses a reference the predictor cells cannot cross-fit (only a sampled rung or a synthetic fixture may locate in-sample, and its receipt says so), a recipient whose fold differs from its twin's, and a reference whose sign classes differ from the stage-1 forest's on any located target.", + "n_estimators": 4, + "population": "uk_frs_raw_spine_base_support_channel claimants and partners (is_uc_claimant) aged 16 and over with taxable income under recipient_income_rule", + "predictors": "the stage-1 predictors, encoded identically", + "receipt": "per target the analogue, the FRS regime and sign classes, the uniform source and the Kolmogorov-Smirnov distance of the sign uniforms and of the quantiles over positive rows from U[0,1), overall and by main_source over at least 10 rows; a positive-row count under 10 is withheld; the counts in the stage evidence stay with the build and are not published", + "seed": 45, + "targets": "the stage-1 outputs with an FRS analogue, in stage-1 chain order", + "weight": "household_weight", + "weight_mapping": "household_to_person" + }, "require_all_outputs": true, "require_all_predictors": true, "sample_size": 64, @@ -3377,7 +3453,8 @@ "hmrc_spi_employed_income", "hmrc_spi_total_earned_income", "hmrc_spi_total_investment_income", - "hmrc_spi_assessable_income" + "hmrc_spi_assessable_income", + "person_is_spi_income_recipient" ], "rewrites": [ "employment_income", diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json index 4df71eadf2..6001c7be14 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/property_rental_facts.json @@ -1,90 +1,90 @@ { "expense_landlords_by_type": { - "legal_management_and_professional_fees": 68.90865863986222, - "non_residential_finance_costs": 68.90865863986222, - "other_allowable_expenses": 68.90865863986222, - "rent_rates_and_insurance": 68.90865863986222, - "repairs_and_maintenance": 68.90865863986222, - "residential_finance_costs": 68.90865863986222, - "services_including_wages": 68.90865863986222 + "legal_management_and_professional_fees": 68.27759643273897, + "non_residential_finance_costs": 68.27759643273897, + "other_allowable_expenses": 68.27759643273897, + "rent_rates_and_insurance": 68.27759643273897, + "repairs_and_maintenance": 68.27759643273897, + "residential_finance_costs": 68.27759643273897, + "services_including_wages": 68.27759643273897 }, "expenses": { - "all": 34989.53168822626, - "individual": 34639.636371344, - "partnership": 349.8953168822627 + "all": 32700.517794384552, + "individual": 32373.512616440705, + "partnership": 327.00517794384723 }, "expenses_by_type": { - "legal_management_and_professional_fees": 4188.674872604928, - "non_residential_finance_costs": 1339.16768763571, - "other_allowable_expenses": 4611.56993185831, - "rent_rates_and_insurance": 3836.26232322711, - "repairs_and_maintenance": 6454.18411860519, - "residential_finance_costs": 12908.36823721038, - "services_including_wages": 1651.304517084635 + "legal_management_and_professional_fees": 3914.6519143781215, + "non_residential_finance_costs": 1251.559386087236, + "other_allowable_expenses": 4309.8811941951435, + "rent_rates_and_insurance": 3585.29418119727, + "repairs_and_maintenance": 6031.951627683597, + "residential_finance_costs": 12063.903255367193, + "services_including_wages": 1543.2762354759905 }, "landlords": { - "all": 137.81731727972445, - "individual": 136.43914410692722, - "partnership": 1.3781731727972328 + "all": 136.55519286547795, + "individual": 135.18964093682317, + "partnership": 1.3655519286547815 }, "receipts": { - "all": 55983.250701162026, - "individual": 55423.41819415041, - "partnership": 559.8325070116189 + "all": 52320.82847101529, + "individual": 51797.62018630513, + "partnership": 523.2082847101556 }, "receipts_bands": [ { - "landlords": 62.209205716542286, + "landlords": 61.63949677955601, "lower_bound": 0, "upper_bound": 10000 }, { - "landlords": 41.15378224325105, + "landlords": 40.77689786955244, "lower_bound": 10000, "upper_bound": 20000 }, { - "landlords": 15.791567604968426, + "landlords": 15.64694918250268, "lower_bound": 20000, "upper_bound": 30000 }, { - "landlords": 7.177985274985648, + "landlords": 7.11224962841031, "lower_bound": 30000, "upper_bound": 40000 }, { - "landlords": 3.828258813325679, + "landlords": 3.7931998018188318, "lower_bound": 40000, "upper_bound": 50000 }, { - "landlords": 2.3926617583285497, + "landlords": 2.37074987613677, "lower_bound": 50000, "upper_bound": 60000 }, { - "landlords": 1.4355970549971295, + "landlords": 1.4224499256820617, "lower_bound": 60000, "upper_bound": 70000 }, { - "landlords": 0.9570647033314198, + "landlords": 0.9482999504547079, "lower_bound": 70000, "upper_bound": 80000 }, { - "landlords": 0.4785323516657099, + "landlords": 0.47414997522735397, "lower_bound": 80000, "upper_bound": 90000 }, { - "landlords": 0.4785323516657099, + "landlords": 0.47414997522735397, "lower_bound": 90000, "upper_bound": 100000 }, { - "landlords": 1.9141294066628396, + "landlords": 1.8965999009094159, "lower_bound": 100000, "upper_bound": null } diff --git a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv index 1afe7a5987..18346576bf 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/sources/spi_donor.csv @@ -1,743 +1,743 @@ -SEX,FACT,GORCODE,AGERANGE,PAY,EPB,EXPS,TAXTERM,INCPBEN,OSSBEN,UBISJA,MOTHINC,OTHERINC,PROFITS,CAPALL,LOSSBF,SRP,INCBBS,DIVIDENDS,PENSION,INCPROP,OTHERINV,GIFTAID,GIFTINV,LLIR_RESTRICT_AMT_TOT,TAX_CRED,TEI,TII,TI -1,1,7,1,10000,0,0,0,0,0,0,0,0,0,0,0,0,100,10,0,0,5,1,1,0,0,10000,115,10115 -2,1.1000000000000001,10,2,11000,100,50,20,0,0,0,0,0,500,25,10,100,105,11,100,150,5.5,2,2,0,0,11735,271.5,12006.5 -1,1.2,11,3,12000,200,100,40,0,0,0,0,0,1000,50,20,200,110,12,200,300,6,3,3,0,0,13470,428,13898 -2,1.3,1,4,13000,300,0,60,0,0,0,0,0,1500,0,30,300,115,13,300,450,6.5,4,1,180,36,15430,584.5,16014.5 -1,1.3999999999999999,7,5,14000,0,50,80,0,0,0,0,0,2000,25,0,400,120,14,400,600,7,5,2,0,0,16805,741,17546 -2,1,10,6,15000,100,100,0,0,0,0,0,0,2500,50,10,500,125,15,500,0,7.5,1,3,0,0,18440,147.5,18587.5 -1,1.1000000000000001,11,7,16000,200,0,20,0,0,0,0,0,3000,0,20,0,130,16,600,150,8,2,1,60,12,19800,304,20104 -2,1.2,1,1,17000,300,50,40,0,0,0,0,0,0,25,30,100,135,17,700,300,8.5,3,2,0,0,18090,460.5,18550.5 -1,1.3,7,2,18000,0,100,60,0,0,0,0,0,500,50,0,200,140,18,0,450,9,4,3,0,0,18610,617,19227 -2,1.3999999999999999,10,3,19000,100,0,80,0,0,0,0,0,1000,0,10,300,145,19,100,600,9.5,5,1,240,48,20570,773.5,21343.5 -1,1,11,4,20000,200,50,0,0,0,0,0,0,1500,25,20,400,150,20,200,0,10,1,2,0,0,22205,180,22385 -2,1.1000000000000001,1,5,21000,300,100,20,0,0,0,0,0,2000,50,30,500,155,21,300,150,10.5,2,3,0,0,23940,336.5,24276.5 -1,1.2,7,6,22000,0,0,40,0,0,0,0,0,2500,0,0,0,160,22,400,300,11,3,1,120,24,24940,493,25433 -2,1.3,10,7,23000,100,50,60,0,0,0,0,0,3000,25,10,100,165,23,500,450,11.5,4,2,0,0,26675,649.5,27324.5 -1,1.3999999999999999,11,1,24000,200,100,80,0,0,0,0,0,0,50,20,200,170,24,600,600,12,5,3,0,0,24980,806,25786 -2,1,1,2,25000,300,0,0,0,0,0,0,0,500,0,30,300,175,25,700,0,12.5,1,1,0,0,26770,212.5,26982.5 -1,1.1000000000000001,7,3,26000,0,50,20,0,0,0,0,0,1000,25,0,400,180,26,0,150,13,2,2,0,0,27345,369,27714 -2,1.2,10,4,27000,100,100,40,0,0,0,0,0,1500,50,10,500,185,27,100,300,13.5,3,3,0,0,29080,525.5,29605.5 -1,1.3,11,5,28000,200,0,60,0,0,0,0,0,2000,0,20,0,190,28,200,450,14,4,1,180,36,30440,682,31122 -2,1.3999999999999999,1,6,29000,300,50,80,0,0,0,0,0,2500,25,30,100,195,29,300,600,14.5,5,2,0,0,32175,838.5,33013.5 -1,1,7,7,30000,0,100,0,0,0,0,0,0,3000,50,0,200,200,30,400,0,15,1,3,0,0,33450,245,33695 -2,1.1000000000000001,10,1,31000,100,0,20,0,0,0,0,0,0,0,10,300,205,31,500,150,15.5,2,1,60,12,31920,401.5,32321.5 -1,1.2,11,2,32000,200,50,40,0,0,0,0,0,500,25,20,400,210,32,600,300,16,3,2,0,0,33645,558,34203 -2,1.3,1,3,33000,300,100,60,0,0,0,0,0,1000,50,30,500,215,33,700,450,16.5,4,3,0,0,35380,714.5,36094.5 -1,1.3999999999999999,7,4,34000,0,0,80,0,0,0,0,0,1500,0,0,0,220,34,0,600,17,5,1,240,48,35580,871,36451 -2,1,10,5,35000,100,50,0,0,0,0,0,0,2000,25,10,100,225,35,100,0,17.5,1,2,0,0,37215,277.5,37492.5 -1,1.1000000000000001,11,6,36000,200,100,20,0,0,0,0,0,2500,50,20,200,230,36,200,150,18,2,3,0,0,38950,434,39384 -2,1.2,1,7,37000,300,0,40,0,0,0,0,0,3000,0,30,300,235,37,300,300,18.5,3,1,120,24,40910,590.5,41500.5 -1,1.3,7,1,38000,0,50,60,0,0,0,0,0,0,25,0,400,240,38,400,450,19,4,2,0,0,38810,747,39557 -2,1.3999999999999999,10,2,39000,100,100,80,0,0,0,0,0,500,50,10,500,245,39,500,600,19.5,5,3,0,0,40520,903.5,41423.5 -1,1,11,3,40000,200,0,0,0,0,0,0,0,1000,0,20,0,250,40,600,0,20,1,1,0,0,41780,310,42090 -2,1.1000000000000001,1,4,41000,300,50,20,0,0,0,0,0,1500,25,30,100,255,41,700,150,20.5,2,2,0,0,43515,466.5,43981.5 -1,1.2,7,5,42000,0,100,40,0,0,0,0,0,2000,50,0,200,260,42,0,300,21,3,3,0,0,44090,623,44713 -2,1.3,10,6,43000,100,0,60,0,0,0,0,0,2500,0,10,300,265,43,100,450,21.5,4,1,180,36,46050,779.5,46829.5 -1,1.3999999999999999,11,7,44000,200,50,80,0,0,0,0,0,3000,25,20,400,270,44,200,600,22,5,2,0,0,47785,936,48721 -2,1,1,1,45000,300,100,0,0,0,0,0,0,0,50,30,500,275,45,300,0,22.5,1,3,0,0,46000,342.5,46342.5 -1,1.1000000000000001,7,2,46000,0,0,20,0,0,0,0,0,500,0,0,0,280,46,400,150,23,2,1,60,12,46920,499,47419 -2,1.2,10,3,47000,100,50,40,0,0,0,0,0,1000,25,10,100,285,47,500,300,23.5,3,2,0,0,48655,655.5,49310.5 -1,1.3,11,4,48000,200,100,60,0,0,0,0,0,1500,50,20,200,290,48,600,450,24,4,3,0,0,50390,812,51202 -2,1.3999999999999999,1,5,49000,300,0,80,0,0,0,0,0,2000,0,30,300,295,49,700,600,24.5,5,1,240,48,52350,968.5,53318.5 -1,1,7,6,50000,0,50,0,0,0,0,0,0,2500,25,0,400,300,50,0,0,25,1,2,0,0,52825,375,53200 -2,1.1000000000000001,10,7,51000,100,100,20,0,0,0,0,0,3000,50,10,500,305,51,100,150,25.5,2,3,0,0,54560,531.5,55091.5 -1,1.2,11,1,52000,200,0,40,0,0,0,0,0,0,0,20,0,310,52,200,300,26,3,1,120,24,52440,688,53128 -2,1.3,1,2,53000,300,50,60,0,0,0,0,0,500,25,30,100,315,53,300,450,26.5,4,2,0,0,54155,844.5,54999.5 -1,1.3999999999999999,7,3,54000,0,100,80,0,0,0,0,0,1000,50,0,200,320,54,400,600,27,5,3,0,0,55530,1001,56531 -2,1,10,4,55000,100,0,0,0,0,0,0,0,1500,0,10,300,325,55,500,0,27.5,1,1,0,0,57390,407.5,57797.5 -1,1.1000000000000001,11,5,56000,200,50,20,0,0,0,0,0,2000,25,20,400,330,56,600,150,28,2,2,0,0,59125,564,59689 -2,1.2,1,6,57000,300,100,40,0,0,0,0,0,2500,50,30,500,335,57,700,300,28.5,3,3,0,0,60860,720.5,61580.5 -1,1.3,7,7,58000,0,0,60,0,0,0,0,0,3000,0,0,0,340,58,0,450,29,4,1,180,36,61060,877,61937 -2,1.3999999999999999,10,1,59000,100,50,80,0,0,0,0,0,0,25,10,100,345,59,100,600,29.5,5,2,0,0,59330,1033.5,60363.5 -1,1,11,2,60000,200,100,0,0,0,0,0,0,500,50,20,200,350,60,200,0,30,1,3,0,0,60930,440,61370 -2,1.1000000000000001,1,3,61000,300,0,20,0,0,0,0,0,1000,0,30,300,355,61,300,150,30.5,2,1,60,12,62890,596.5,63486.5 -1,1.2,7,4,62000,0,50,40,0,0,0,0,0,1500,25,0,400,360,62,400,300,31,3,2,0,0,64265,753,65018 -2,1.3,10,5,63000,100,100,60,0,0,0,0,0,2000,50,10,500,365,63,500,450,31.5,4,3,0,0,66000,909.5,66909.5 -1,1.3999999999999999,11,6,64000,200,0,80,0,0,0,0,0,2500,0,20,0,370,64,600,600,32,5,1,240,48,67360,1066,68426 -2,1,1,7,65000,300,50,0,0,0,0,0,0,3000,25,30,100,375,65,700,0,32.5,1,2,0,0,68995,472.5,69467.5 -1,1.1000000000000001,7,1,66000,0,100,20,0,0,0,0,0,0,50,0,200,380,66,0,150,33,2,3,0,0,66120,629,66749 -2,1.2,10,2,67000,100,0,40,0,0,0,0,0,500,0,10,300,385,67,100,300,33.5,3,1,120,24,68030,785.5,68815.5 -1,1.3,11,3,68000,200,50,60,0,0,0,0,0,1000,25,20,400,390,68,200,450,34,4,2,0,0,69765,942,70707 -2,1.3999999999999999,1,4,69000,300,100,80,0,0,0,0,0,1500,50,30,500,395,69,300,600,34.5,5,3,0,0,71500,1098.5,72598.5 -1,1,7,5,70000,0,0,0,0,0,0,0,0,2000,0,0,0,400,70,400,0,35,1,1,0,0,72400,505,72905 -2,1.1000000000000001,10,6,71000,100,50,20,0,0,0,0,0,2500,25,10,100,405,71,500,150,35.5,2,2,0,0,74135,661.5,74796.5 -1,1.2,11,7,72000,200,100,40,0,0,0,0,0,3000,50,20,200,410,72,600,300,36,3,3,0,0,75870,818,76688 -2,1.3,1,1,73000,300,0,60,0,0,0,0,0,0,0,30,300,415,73,700,450,36.5,4,1,180,36,74360,974.5,75334.5 -1,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -1,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -1,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -1,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -1,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -1,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -1,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -2,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500 -2,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500 -2,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500 -2,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500 -2,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500 -2,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500 -2,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500 -1,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -1,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -1,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -1,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -1,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -1,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -1,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -2,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500 -2,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500 -2,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500 -2,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500 -2,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500 -2,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500 -2,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500 -1,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -1,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -1,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -1,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -1,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -1,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -1,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -2,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000 -2,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000 -2,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000 -2,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000 -2,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000 -2,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000 -2,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000 -1,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -1,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -1,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -1,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -1,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -1,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -1,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -2,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500 -2,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500 -2,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500 -2,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500 -2,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500 -2,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500 -2,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500 -1,0.002,7,-1,4000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4000000,820000,4820000 -2,0.002,11,-1,4250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4250000,820000,5070000 -1,0.002,10,-1,4500000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4500000,820000,5320000 -2,0.002,1,-1,4750000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4750000,820000,5570000 -1,0.002,8,-1,5000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5000000,820000,5820000 -2,0.002,12,-1,5250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5250000,820000,6070000 +SEX,FACT,GORCODE,AGERANGE,PAY,EPB,EXPS,TAXTERM,INCPBEN,OSSBEN,UBISJA,MOTHINC,OTHERINC,PROFITS,CAPALL,LOSSBF,SRP,INCBBS,DIVIDENDS,PENSION,INCPROP,OTHERINV,GIFTAID,GIFTINV,LLIR_RESTRICT_AMT_TOT,TAX_CRED,TEI,TII,TI,MAINSRCE,SEINC_NUM,SPA +1,1,7,1,10000,0,0,0,0,0,0,0,0,0,0,0,0,100,10,0,0,5,1,1,0,0,10000,115,10115,1,0,0 +2,1.1000000000000001,10,2,11000,100,50,20,0,0,0,0,0,500,25,10,100,105,11,100,150,5.5,2,2,0,0,11735,271.5,12006.5,1,1,1 +1,1.2,11,3,12000,200,100,40,0,0,0,0,0,1000,50,20,200,110,12,200,300,6,3,3,0,0,13470,428,13898,1,1,1 +2,1.3,1,4,13000,300,0,60,0,0,0,0,0,1500,0,30,300,115,13,300,450,6.5,4,1,180,36,15430,584.5,16014.5,1,1,1 +1,1.3999999999999999,7,5,14000,0,50,80,0,0,0,0,0,2000,25,0,400,120,14,400,600,7,5,2,0,0,16805,741,17546,1,1,1 +2,1,10,6,15000,100,100,0,0,0,0,0,0,2500,50,10,500,125,15,500,0,7.5,1,3,0,0,18440,147.5,18587.5,1,1,1 +1,1.1000000000000001,11,7,16000,200,0,20,0,0,0,0,0,3000,0,20,0,130,16,600,150,8,2,1,60,12,19800,304,20104,1,1,0 +2,1.2,1,1,17000,300,50,40,0,0,0,0,0,0,25,30,100,135,17,700,300,8.5,3,2,0,0,18090,460.5,18550.5,1,0,1 +1,1.3,7,2,18000,0,100,60,0,0,0,0,0,500,50,0,200,140,18,0,450,9,4,3,0,0,18610,617,19227,1,1,1 +2,1.3999999999999999,10,3,19000,100,0,80,0,0,0,0,0,1000,0,10,300,145,19,100,600,9.5,5,1,240,48,20570,773.5,21343.5,1,1,1 +1,1,11,4,20000,200,50,0,0,0,0,0,0,1500,25,20,400,150,20,200,0,10,1,2,0,0,22205,180,22385,1,1,1 +2,1.1000000000000001,1,5,21000,300,100,20,0,0,0,0,0,2000,50,30,500,155,21,300,150,10.5,2,3,0,0,23940,336.5,24276.5,1,1,1 +1,1.2,7,6,22000,0,0,40,0,0,0,0,0,2500,0,0,0,160,22,400,300,11,3,1,120,24,24940,493,25433,1,1,0 +2,1.3,10,7,23000,100,50,60,0,0,0,0,0,3000,25,10,100,165,23,500,450,11.5,4,2,0,0,26675,649.5,27324.5,1,1,1 +1,1.3999999999999999,11,1,24000,200,100,80,0,0,0,0,0,0,50,20,200,170,24,600,600,12,5,3,0,0,24980,806,25786,1,0,1 +2,1,1,2,25000,300,0,0,0,0,0,0,0,500,0,30,300,175,25,700,0,12.5,1,1,0,0,26770,212.5,26982.5,1,1,1 +1,1.1000000000000001,7,3,26000,0,50,20,0,0,0,0,0,1000,25,0,400,180,26,0,150,13,2,2,0,0,27345,369,27714,1,1,1 +2,1.2,10,4,27000,100,100,40,0,0,0,0,0,1500,50,10,500,185,27,100,300,13.5,3,3,0,0,29080,525.5,29605.5,1,1,1 +1,1.3,11,5,28000,200,0,60,0,0,0,0,0,2000,0,20,0,190,28,200,450,14,4,1,180,36,30440,682,31122,1,1,0 +2,1.3999999999999999,1,6,29000,300,50,80,0,0,0,0,0,2500,25,30,100,195,29,300,600,14.5,5,2,0,0,32175,838.5,33013.5,1,1,1 +1,1,7,7,30000,0,100,0,0,0,0,0,0,3000,50,0,200,200,30,400,0,15,1,3,0,0,33450,245,33695,1,1,1 +2,1.1000000000000001,10,1,31000,100,0,20,0,0,0,0,0,0,0,10,300,205,31,500,150,15.5,2,1,60,12,31920,401.5,32321.5,1,0,1 +1,1.2,11,2,32000,200,50,40,0,0,0,0,0,500,25,20,400,210,32,600,300,16,3,2,0,0,33645,558,34203,1,1,1 +2,1.3,1,3,33000,300,100,60,0,0,0,0,0,1000,50,30,500,215,33,700,450,16.5,4,3,0,0,35380,714.5,36094.5,1,1,1 +1,1.3999999999999999,7,4,34000,0,0,80,0,0,0,0,0,1500,0,0,0,220,34,0,600,17,5,1,240,48,35580,871,36451,1,1,0 +2,1,10,5,35000,100,50,0,0,0,0,0,0,2000,25,10,100,225,35,100,0,17.5,1,2,0,0,37215,277.5,37492.5,1,1,1 +1,1.1000000000000001,11,6,36000,200,100,20,0,0,0,0,0,2500,50,20,200,230,36,200,150,18,2,3,0,0,38950,434,39384,1,1,1 +2,1.2,1,7,37000,300,0,40,0,0,0,0,0,3000,0,30,300,235,37,300,300,18.5,3,1,120,24,40910,590.5,41500.5,1,1,1 +1,1.3,7,1,38000,0,50,60,0,0,0,0,0,0,25,0,400,240,38,400,450,19,4,2,0,0,38810,747,39557,1,0,1 +2,1.3999999999999999,10,2,39000,100,100,80,0,0,0,0,0,500,50,10,500,245,39,500,600,19.5,5,3,0,0,40520,903.5,41423.5,1,1,1 +1,1,11,3,40000,200,0,0,0,0,0,0,0,1000,0,20,0,250,40,600,0,20,1,1,0,0,41780,310,42090,1,1,0 +2,1.1000000000000001,1,4,41000,300,50,20,0,0,0,0,0,1500,25,30,100,255,41,700,150,20.5,2,2,0,0,43515,466.5,43981.5,1,1,1 +1,1.2,7,5,42000,0,100,40,0,0,0,0,0,2000,50,0,200,260,42,0,300,21,3,3,0,0,44090,623,44713,1,1,1 +2,1.3,10,6,43000,100,0,60,0,0,0,0,0,2500,0,10,300,265,43,100,450,21.5,4,1,180,36,46050,779.5,46829.5,1,1,1 +1,1.3999999999999999,11,7,44000,200,50,80,0,0,0,0,0,3000,25,20,400,270,44,200,600,22,5,2,0,0,47785,936,48721,1,1,1 +2,1,1,1,45000,300,100,0,0,0,0,0,0,0,50,30,500,275,45,300,0,22.5,1,3,0,0,46000,342.5,46342.5,1,0,1 +1,1.1000000000000001,7,2,46000,0,0,20,0,0,0,0,0,500,0,0,0,280,46,400,150,23,2,1,60,12,46920,499,47419,1,1,0 +2,1.2,10,3,47000,100,50,40,0,0,0,0,0,1000,25,10,100,285,47,500,300,23.5,3,2,0,0,48655,655.5,49310.5,1,1,1 +1,1.3,11,4,48000,200,100,60,0,0,0,0,0,1500,50,20,200,290,48,600,450,24,4,3,0,0,50390,812,51202,1,1,1 +2,1.3999999999999999,1,5,49000,300,0,80,0,0,0,0,0,2000,0,30,300,295,49,700,600,24.5,5,1,240,48,52350,968.5,53318.5,1,1,1 +1,1,7,6,50000,0,50,0,0,0,0,0,0,2500,25,0,400,300,50,0,0,25,1,2,0,0,52825,375,53200,1,1,1 +2,1.1000000000000001,10,7,51000,100,100,20,0,0,0,0,0,3000,50,10,500,305,51,100,150,25.5,2,3,0,0,54560,531.5,55091.5,1,1,1 +1,1.2,11,1,52000,200,0,40,0,0,0,0,0,0,0,20,0,310,52,200,300,26,3,1,120,24,52440,688,53128,1,0,0 +2,1.3,1,2,53000,300,50,60,0,0,0,0,0,500,25,30,100,315,53,300,450,26.5,4,2,0,0,54155,844.5,54999.5,1,1,1 +1,1.3999999999999999,7,3,54000,0,100,80,0,0,0,0,0,1000,50,0,200,320,54,400,600,27,5,3,0,0,55530,1001,56531,1,1,1 +2,1,10,4,55000,100,0,0,0,0,0,0,0,1500,0,10,300,325,55,500,0,27.5,1,1,0,0,57390,407.5,57797.5,1,1,1 +1,1.1000000000000001,11,5,56000,200,50,20,0,0,0,0,0,2000,25,20,400,330,56,600,150,28,2,2,0,0,59125,564,59689,1,1,1 +2,1.2,1,6,57000,300,100,40,0,0,0,0,0,2500,50,30,500,335,57,700,300,28.5,3,3,0,0,60860,720.5,61580.5,1,1,1 +1,1.3,7,7,58000,0,0,60,0,0,0,0,0,3000,0,0,0,340,58,0,450,29,4,1,180,36,61060,877,61937,1,1,0 +2,1.3999999999999999,10,1,59000,100,50,80,0,0,0,0,0,0,25,10,100,345,59,100,600,29.5,5,2,0,0,59330,1033.5,60363.5,1,0,1 +1,1,11,2,60000,200,100,0,0,0,0,0,0,500,50,20,200,350,60,200,0,30,1,3,0,0,60930,440,61370,1,1,1 +2,1.1000000000000001,1,3,61000,300,0,20,0,0,0,0,0,1000,0,30,300,355,61,300,150,30.5,2,1,60,12,62890,596.5,63486.5,1,1,1 +1,1.2,7,4,62000,0,50,40,0,0,0,0,0,1500,25,0,400,360,62,400,300,31,3,2,0,0,64265,753,65018,1,1,1 +2,1.3,10,5,63000,100,100,60,0,0,0,0,0,2000,50,10,500,365,63,500,450,31.5,4,3,0,0,66000,909.5,66909.5,1,1,1 +1,1.3999999999999999,11,6,64000,200,0,80,0,0,0,0,0,2500,0,20,0,370,64,600,600,32,5,1,240,48,67360,1066,68426,1,1,0 +2,1,1,7,65000,300,50,0,0,0,0,0,0,3000,25,30,100,375,65,700,0,32.5,1,2,0,0,68995,472.5,69467.5,1,1,1 +1,1.1000000000000001,7,1,66000,0,100,20,0,0,0,0,0,0,50,0,200,380,66,0,150,33,2,3,0,0,66120,629,66749,1,0,1 +2,1.2,10,2,67000,100,0,40,0,0,0,0,0,500,0,10,300,385,67,100,300,33.5,3,1,120,24,68030,785.5,68815.5,1,1,1 +1,1.3,11,3,68000,200,50,60,0,0,0,0,0,1000,25,20,400,390,68,200,450,34,4,2,0,0,69765,942,70707,1,1,1 +2,1.3999999999999999,1,4,69000,300,100,80,0,0,0,0,0,1500,50,30,500,395,69,300,600,34.5,5,3,0,0,71500,1098.5,72598.5,1,1,1 +1,1,7,5,70000,0,0,0,0,0,0,0,0,2000,0,0,0,400,70,400,0,35,1,1,0,0,72400,505,72905,1,1,0 +2,1.1000000000000001,10,6,71000,100,50,20,0,0,0,0,0,2500,25,10,100,405,71,500,150,35.5,2,2,0,0,74135,661.5,74796.5,1,1,1 +1,1.2,11,7,72000,200,100,40,0,0,0,0,0,3000,50,20,200,410,72,600,300,36,3,3,0,0,75870,818,76688,1,1,1 +2,1.3,1,1,73000,300,0,60,0,0,0,0,0,0,0,30,300,415,73,700,450,36.5,4,1,180,36,74360,974.5,75334.5,1,0,1 +1,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,1,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,1,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,1,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,1,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,1,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,1,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,1,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,2,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,2,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,2,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,2,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,2,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,2,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,2,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,3,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,3,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,3,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,3,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,3,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,3,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,3,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,4,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,4,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,4,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,4,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,4,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,4,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,4,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,5,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,5,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,5,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,5,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,5,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,5,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,5,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,6,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,6,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,6,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,6,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,6,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,6,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,6,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,7,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,7,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,7,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,7,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,7,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,7,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,7,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,8,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,8,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,8,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,8,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,8,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,8,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,8,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,9,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,9,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,9,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,9,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,9,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,9,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,9,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,10,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,10,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,10,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,10,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,10,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,10,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,10,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,11,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,11,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,11,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,11,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,11,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,11,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,11,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +1,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +1,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +1,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +1,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +1,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +1,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +2,0.002,12,1,251000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,251000,17500,268500,1,0,0 +2,0.002,12,2,252000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,252000,17500,269500,1,0,0 +2,0.002,12,3,253000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,253000,17500,270500,1,0,0 +2,0.002,12,4,254000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,254000,17500,271500,1,0,0 +2,0.002,12,5,255000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,255000,17500,272500,1,0,0 +2,0.002,12,6,256000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,256000,17500,273500,1,0,0 +2,0.002,12,7,257000,0,0,0,0,0,0,0,0,0,0,0,0,5000,12500,0,0,0,0,0,0,0,257000,17500,274500,1,0,0 +1,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,1,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,1,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,1,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,1,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,1,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,1,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,1,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,2,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,2,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,2,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,2,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,2,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,2,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,2,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,3,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,3,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,3,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,3,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,3,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,3,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,3,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,4,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,4,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,4,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,4,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,4,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,4,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,4,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,5,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,5,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,5,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,5,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,5,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,5,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,5,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,6,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,6,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,6,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,6,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,6,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,6,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,6,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,7,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,7,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,7,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,7,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,7,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,7,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,7,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,8,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,8,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,8,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,8,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,8,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,8,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,8,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,9,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,9,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,9,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,9,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,9,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,9,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,9,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,10,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,10,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,10,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,10,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,10,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,10,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,10,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,11,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,11,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,11,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,11,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,11,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,11,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,11,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +1,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +1,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +1,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +1,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +1,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +1,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +2,0.002,12,1,621000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,621000,36500,657500,1,0,0 +2,0.002,12,2,622000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,622000,36500,658500,1,0,0 +2,0.002,12,3,623000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,623000,36500,659500,1,0,0 +2,0.002,12,4,624000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,624000,36500,660500,1,0,0 +2,0.002,12,5,625000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,625000,36500,661500,1,0,0 +2,0.002,12,6,626000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,626000,36500,662500,1,0,0 +2,0.002,12,7,627000,0,0,0,0,0,0,0,0,0,0,0,0,5500,31000,0,0,0,0,0,0,0,627000,36500,663500,1,0,0 +1,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,1,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,1,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,1,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,1,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,1,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,1,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,1,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,2,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,2,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,2,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,2,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,2,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,2,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,2,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,3,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,3,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,3,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,3,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,3,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,3,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,3,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,4,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,4,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,4,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,4,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,4,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,4,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,4,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,5,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,5,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,5,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,5,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,5,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,5,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,5,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,6,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,6,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,6,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,6,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,6,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,6,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,6,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,7,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,7,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,7,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,7,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,7,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,7,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,7,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,8,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,8,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,8,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,8,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,8,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,8,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,8,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,9,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,9,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,9,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,9,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,9,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,9,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,9,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,10,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,10,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,10,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,10,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,10,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,10,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,10,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,11,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,11,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,11,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,11,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,11,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,11,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,11,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +1,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +1,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +1,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +1,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +1,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +1,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +2,0.002,12,1,1301000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1301000,71000,1372000,1,0,0 +2,0.002,12,2,1302000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1302000,71000,1373000,1,0,0 +2,0.002,12,3,1303000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1303000,71000,1374000,1,0,0 +2,0.002,12,4,1304000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1304000,71000,1375000,1,0,0 +2,0.002,12,5,1305000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1305000,71000,1376000,1,0,0 +2,0.002,12,6,1306000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1306000,71000,1377000,1,0,0 +2,0.002,12,7,1307000,0,0,0,0,0,0,0,0,0,0,0,0,6000,65000,0,0,0,0,0,0,0,1307000,71000,1378000,1,0,0 +1,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,1,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,1,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,1,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,1,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,1,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,1,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,1,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,2,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,2,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,2,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,2,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,2,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,2,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,2,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,3,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,3,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,3,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,3,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,3,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,3,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,3,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,4,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,4,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,4,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,4,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,4,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,4,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,4,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,5,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,5,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,5,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,5,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,5,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,5,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,5,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,6,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,6,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,6,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,6,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,6,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,6,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,6,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,7,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,7,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,7,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,7,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,7,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,7,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,7,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,8,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,8,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,8,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,8,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,8,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,8,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,8,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,9,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,9,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,9,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,9,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,9,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,9,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,9,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,10,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,10,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,10,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,10,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,10,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,10,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,10,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,11,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,11,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,11,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,11,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,11,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,11,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,11,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +1,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +1,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +1,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +1,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +1,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +1,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +2,0.002,12,1,2601000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2601000,136500,2737500,1,0,0 +2,0.002,12,2,2602000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2602000,136500,2738500,1,0,0 +2,0.002,12,3,2603000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2603000,136500,2739500,1,0,0 +2,0.002,12,4,2604000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2604000,136500,2740500,1,0,0 +2,0.002,12,5,2605000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2605000,136500,2741500,1,0,0 +2,0.002,12,6,2606000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2606000,136500,2742500,1,0,0 +2,0.002,12,7,2607000,0,0,0,0,0,0,0,0,0,0,0,0,6500,130000,0,0,0,0,0,0,0,2607000,136500,2743500,1,0,0 +1,0.002,7,-1,4000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4000000,820000,4820000,-1,-1,-1 +2,0.002,11,-1,4250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4250000,820000,5070000,-1,-1,-1 +1,0.002,10,-1,4500000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4500000,820000,5320000,-1,-1,-1 +2,0.002,1,-1,4750000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,4750000,820000,5570000,-1,-1,-1 +1,0.002,8,-1,5000000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5000000,820000,5820000,-1,-1,-1 +2,0.002,12,-1,5250000,0,0,0,0,0,0,0,0,0,0,0,0,20000,800000,0,0,0,0,0,0,0,5250000,820000,6070000,-1,-1,-1 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 feba42931e..9fcc03e526 100644 --- a/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json +++ b/packages/microcosm-graph/tests/fixtures/parity/uk_spine/uk_spine.json @@ -1 +1 @@ -{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"7d74e593d9e9241256edbcd5fd913858f85363b2269948e7365f9fafaf0a1167","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","is_uc_claimant","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"78b4ba120f353c529052389942945c6a3bd6a67e0e43085a3da81dce6101cb8c","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"fd24f50655eef56f843700740566b31abb94e8627cddd9d92f65738e87ef38a5","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"a074db1a84b0162322ae659d5f7ea57acddc34359338572fe1ec8175ed217d63","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"2e31cfe8b3e3a6eb8649e6769932e68055886b79a0083dc870f4a4c92977d24f","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"a0b6471e740cc43d63e971c6526319a08372a451bf891c1261ab084464349f78","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","private_pension_income","property_income","reports_rent_from_other_property","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","is_uc_claimant","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"bbddbf8172bb48d1e8be47e3d1c3cbb4817f2a20ebb9f5533d332383e9a5ee65","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"4852ed8e14486675baa85bca2fa8c52db49e3d2d28002af44fcb951fd07c9d54","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"c96414883fe0334f990d7dde89c1b4a6d782319cc900ab5e36e6148573b44e2e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"226ab12a5b97f28445e73c6dfde9a24c79b66721405cbd32a7378036eba37416","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"5a0ef883b6aeafc505a3869adc7d1b2bc582e1e9241d644dbdf4e4610f00be68","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"ecdb9e361778e22b5563a29b277854e8deb4ae3bb1760a5a17dadd4b7490e491","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"d305d97206612108bf825339124433a11f020e500b78484a1201edad572b68a2","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"16c2a0561cae48d25b7c676bf75f7cc436af6090d41c3d7abe3fd4f1e87f5840","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"dd590333c60fb66ee6c4f1c1eb2cf6ad89c9b277f8da1c9dc5db336167598f93","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"e5e88f0c25b92b327533d253275adc21a50fb678d6be57c164cdab14e0a9db04","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"d28eaddaa77793178b6e973ab9e70a98aa6143072faed6e6773e4a7257358371","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} +{"country":"uk","nodes":[{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Load the source-bound UK FRS root population.","id":"create_uk_frs","inputs":[],"kernel":"uk.create@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"sample_fraction":1.0,"sample_seed":578,"stage_contract_sha256":"7d74e593d9e9241256edbcd5fd913858f85363b2269948e7365f9fafaf0a1167","time_period":"2024"},"population":null,"sources":["frs"],"structural":"create","weights":null},{"base":"create_uk_frs","citation":"","description":"Ownership boundary for the source-assembling root stage.","id":"frs_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"base":null,"citation":"","description":"Claim the cells assembled by the UK FRS root transform.","id":"frs_spine","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"gender","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"marital_status","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hours_worked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"care_hours","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_household_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_benunit_head","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_parent","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_blind","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_uc_claimant","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_claimant_or_partner","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_hbai_dependent_child","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_boarder","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent_paid_as_lodger","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"miscellaneous_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_transfer_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"lump_sum_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loan_repayments","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_sick_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"statutory_maternity_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"student_loans","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"access_fund","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"healthy_start_vouchers","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_breakfasts","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_fruit_veg","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"free_school_meals","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"maintenance_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"childcare_expenses","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_asked","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"incapacity_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_married","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dependent_children","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"liable_for_share_of_household_rent","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"region","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_single_adult_raw","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"external_child_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{},"population":"frs_spine.boundary","sources":[],"structural":"none","weights":null},{"base":"frs_spine.boundary","citation":"","description":"Ownership boundary before age_tail rewrites.","id":"age_tail.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage age_tail.","id":"age_tail","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["external_child_payments","region"],"entity":"household","rows":"all"},{"columns":["gender"],"entity":"person","rows":"all"}],"kernel":"uk.stage.age_tail@1","mass":"conserve","outputs":[{"column":"age","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"age_tail","stage_contract_sha256":"963a34f38caede2525e3b8735f904bb70a1bbef5a272f0eefd4346343444484f","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_relationships.","id":"frs_relationships","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","is_household_head"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_relationships@1","mass":"conserve","outputs":[{"column":"relationship_to_head","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_role","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_family_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_looked_after_by_local_authority","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"ons_household_type","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_relationships","stage_contract_sha256":"85aca92dcc0590c2147cfc7e0886664f26cd8e1bc0b1de728d11fa567e9fd8b4","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_employment.","id":"frs_employment","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_employment@1","mass":"conserve","outputs":[{"column":"employment_status","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_sector","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"sic_industry_division","dtype":"int64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_employment","stage_contract_sha256":"ddbefaf05b44788d794a6e4b0e8926c14318d66e50d2f11f50ca549538bbf60c","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_council_tax.","id":"frs_council_tax","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","sic_industry_division"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_council_tax@1","mass":"conserve","outputs":[{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_council_tax","stage_contract_sha256":"425beb2093c2f603e6b7394b98dcb129b2162b73447b6e6a7be33b537ff2ffe1","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_disability.","id":"frs_disability","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax","region"],"entity":"household","rows":"all"},{"columns":["afcs_reported","age","attendance_allowance_reported","dla_m_reported","dla_sc_reported","esa_contrib_reported","esa_income_reported","iidb_reported","incapacity_benefit_reported","pip_dl_reported","pip_m_reported","sda_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_disability@1","mass":"conserve","outputs":[{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_disability","stage_contract_sha256":"ac500b4cb1bc04d4fb72d198592dd376d61da8c150921a6ac53914ac18be0508","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education.","id":"frs_education","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","esa_contrib_reported","esa_income_reported","is_severely_disabled_for_benefits","jsa_contrib_reported","jsa_income_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education@1","mass":"conserve","outputs":[{"column":"current_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"highest_education","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_non_advanced_education","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"is_in_approved_training","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"age_started_or_accepted_current_education_or_training","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"is_before_universal_credit_qualifying_young_person_terminal_date","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"adult_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"child_ema","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education","stage_contract_sha256":"836cb0f5a582fee1425190e96c9cb81bdef859bd236c8b6bc27660b6e3d0c2f8","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_legacy_proxies.","id":"frs_legacy_proxies","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_legacy_proxies@1","mass":"conserve","outputs":[{"column":"legacy_jobseeker_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_health_condition_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"esa_support_group_proxy","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_legacy_proxies","stage_contract_sha256":"1ecf761cf3fa7180da15659e138e67a8654e58272b4fde28344aa27a874ad0aa","time_period":"2024"},"population":"age_tail.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"age_tail.boundary","citation":"","description":"Ownership boundary before frs_education_grant_split rewrites.","id":"frs_education_grant_split.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_education_grant_split.","id":"frs_education_grant_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_education_grant_split@1","mass":"conserve","outputs":[{"column":"disabled_students_allowance_eligible_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"education_grants","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_education_grant_split","stage_contract_sha256":"8718f014b90498c2cc7c754289775ca4a41452d9b978d8cbc5f34b64cbdc7df2","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_take_up.","id":"frs_take_up","inputs":[{"columns":["frs_benunit_capital","is_married"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","child_benefit_reported","education_grants","is_uc_claimant","pension_credit_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_tfc","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_extended_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_universal_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_targeted_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"would_claim_uc_childcare","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"},{"column":"maximum_extended_childcare_hours_usage","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_take_up","stage_contract_sha256":"78b4ba120f353c529052389942945c6a3bd6a67e0e43085a3da81dce6101cb8c","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_person_draws.","id":"frs_person_draws","inputs":[{"columns":["frs_benunit_capital","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_person_draws@1","mass":"conserve","outputs":[{"column":"would_claim_marriage_allowance","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"would_claim_scp","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"attends_private_school_random_draw","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"tax_free_childcare_spend_routed_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_person_draws","stage_contract_sha256":"fd24f50655eef56f843700740566b31abb94e8627cddd9d92f65738e87ef38a5","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_household_draws.","id":"frs_household_draws","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_household_draws@1","mass":"conserve","outputs":[{"column":"household_owns_tv","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"would_evade_tv_licence_fee","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residential_property_purchased_is_first_home","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"property_purchased","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_household_draws","stage_contract_sha256":"c74c63b09264319c4bf0049dabba00ecd0ce660beb7b53d6dae71518434bc949","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_brma.","id":"frs_brma","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_brma@1","mass":"conserve","outputs":[{"column":"brma","dtype":"string","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_brma","stage_contract_sha256":"4285376b37299d375ed583b7f6b1747bd8b7cb1c8c0d19a36481156b5314a854","time_period":"2024"},"population":"frs_education_grant_split.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"frs_education_grant_split.boundary","citation":"","description":"Freeze the assembled-spine gate population.","id":"frs_brma.checkpoint","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage frs_hmrc_spine_leaves.","id":"frs_hmrc_spine_leaves","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["brma","region"],"entity":"household","rows":"all"},{"columns":["age","employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.frs_hmrc_spine_leaves@1","mass":"conserve","outputs":[{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"ossben_identifiable_subset","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"srp_regular_code5","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"frs_hmrc_spine_leaves","stage_contract_sha256":"a074db1a84b0162322ae659d5f7ea57acddc34359338572fe1ec8175ed217d63","time_period":"2024"},"population":"frs_brma.checkpoint","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"frs_brma.checkpoint","citation":"","description":"Run structural UK stage spi_support_channel.","id":"spi_support_channel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_support_channel@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","source_household_id","int64"],["household","source_year","int64"],["household","source_household_key","string"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_support_channel","stage_contract_sha256":"2c682605139c0a8f96e8ba45a2c03f506d3f758ef437841066a8fdb8b74269b6","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_support_channel.","id":"spi_support_channel.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"source_household_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_year","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"source_household_key","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["person.person_source_id","person.person_support_channel","person.person_support_clone_index","benunit.benunit_source_id","benunit.benunit_support_channel","benunit.benunit_support_clone_index","household.source_household_id","household.source_year","household.source_household_key","household.household_source_id","household.household_support_channel","household.household_support_clone_index","household.household_is_spi_synthetic"]},"population":"spi_support_channel","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"spi_support_channel","citation":"","description":"Run structural UK stage spi_income_band_donors.","id":"spi_income_band_donors","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.spi_income_band_donors@1","mass":"declared","outputs":[],"params":{"expand_cells":[["person","person_source_id","int64"],["person","person_support_channel","string"],["person","person_support_clone_index","int64"],["benunit","benunit_source_id","int64"],["benunit","benunit_support_channel","string"],["benunit","benunit_support_clone_index","int64"],["household","household_source_id","int64"],["household","household_support_channel","string"],["household","household_support_clone_index","int64"],["household","household_is_spi_synthetic","bool"],["household","household_is_spi_income_band_donor","bool"],["household","spi_income_band_donor_lower_bound","float64"],["person","person_is_spi_income_band_carrier","bool"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_income_band_donors","stage_contract_sha256":"2e31cfe8b3e3a6eb8649e6769932e68055886b79a0083dc870f4a4c92977d24f","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by spi_income_band_donors.","id":"spi_income_band_donors.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"person_source_id","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_channel","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_support_clone_index","dtype":"int64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_source_id","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_channel","dtype":"string","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"benunit_support_clone_index","dtype":"int64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_source_id","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_channel","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_support_clone_index","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_synthetic","dtype":"bool","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"household_is_spi_income_band_donor","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"spi_income_band_donor_lower_bound","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"person_is_spi_income_band_carrier","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_spi_income_band_donor","household.spi_income_band_donor_lower_bound","person.person_is_spi_income_band_carrier"]},"population":"spi_income_band_donors","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_spi_income_spine.","id":"hmrc_spi_income_spine","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","rent_paid_as_boarder","rent_paid_as_lodger","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","maintenance_expenses","childcare_expenses","salary_sacrifice_reported","salary_sacrifice_asked","ssmg_reported","incapacity_benefit_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","ossben_identifiable_subset","srp_regular_code5","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_spi_income_spine@1","mass":"conserve","outputs":[{"column":"charitable_investment_gifts","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"gift_aid","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_benefits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employment_expenses","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_social_security_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_taxable_termination_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_miscellaneous_employment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_other_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_state_pension_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_employed_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_earned_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_total_investment_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"hmrc_spi_assessable_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"self_employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"savings_interest_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dividend_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"private_pension_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employer_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"personal_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"tax_free_savings_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pension_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"attendance_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"state_pension_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"carers_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"winter_fuel_allowance_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_pay","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_unemployment_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"hmrc_spi_incapacity_benefit_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"aa_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_sc_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"dla_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_m_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"pip_dl_category","dtype":"string","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_carers_allowance","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_startup_period","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"uc_is_in_gainful_self_employment","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"reports_rent_from_other_property","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"person_is_spi_income_recipient","dtype":"bool","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_spi_income_spine","stage_contract_sha256":"e4e1641b5cbf0bcff3292cff470918eb7b2f8022ea3a9d5315cbe3c932a31ccf","time_period":"2024"},"population":"spi_income_band_donors","sources":["frs"],"structural":"none","weights":null},{"base":"spi_income_band_donors","citation":"","description":"Ownership boundary before spi_housing_shell rewrites.","id":"spi_housing_shell.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_housing_shell.","id":"spi_housing_shell","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["council_tax_single_adult_raw","household_support_channel","ons_household_type","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","is_household_head","other_investment_income","person_is_spi_income_recipient","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_housing_shell@1","mass":"conserve","outputs":[{"column":"tenure_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"accommodation_type","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_band","dtype":"string","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"num_bedrooms","dtype":"int64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_reported","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"rent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_interest_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"mortgage_capital_repayment","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"structural_insurance_payments","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_service_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"water_and_sewerage_charges","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"domestic_rates","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"subrent","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_rebate","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"housing_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"council_tax_benefit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_housing_shell","stage_contract_sha256":"809f19fd33ff79ceda005e8cc3fa89ae40b297dceca26a7658b6259267987890","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_wealth.","id":"was_wealth","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_wealth@1","mass":"conserve","outputs":[{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"corporate_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"private_pension_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gross_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"net_financial_wealth","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"savings","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"num_vehicles","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cash_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"stocks_and_shares_isa","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"mortgage_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"consumer_debt","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"student_loan_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_wealth","stage_contract_sha256":"9941b70870b0ced1ea1f51e9c9f12768005ea6c53ffdba1db3cb4e2ee030af87","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage was_lisa.","id":"was_lisa","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance"],"entity":"person","rows":"all"}],"kernel":"uk.stage.was_lisa@1","mass":"conserve","outputs":[{"column":"has_lifetime_isa","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"lifetime_isa_balance","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_lifetime_isa_balance","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"was_lisa","stage_contract_sha256":"46f12fdf9228f721d860ff7858b78b25406bb8737628acf63ac17d44d549f657","time_period":"2024"},"population":"spi_housing_shell.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_housing_shell.boundary","citation":"","description":"Ownership boundary before regional_property_uprating rewrites.","id":"regional_property_uprating.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage regional_property_uprating.","id":"regional_property_uprating","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_lifetime_isa_balance","household_support_channel","region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.regional_property_uprating@1","mass":"conserve","outputs":[{"column":"main_residence_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_wealth","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"owned_land","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"other_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"},{"column":"non_residential_property_value","dtype":"float64","entity":"household","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"regional_property_uprating","stage_contract_sha256":"10e9b226ee1483c9465bec4c8fff6d2d4387bcdb5611907189c84d1645874ab5","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage property_components.","id":"property_components","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["non_residential_property_value","other_residential_property_value","region","subrent"],"entity":"household","rows":"all"},{"columns":["age","is_household_head","person_is_spi_income_recipient","person_support_channel"],"entity":"person","rows":"all"}],"kernel":"uk.stage.property_components@1","mass":"conserve","outputs":[{"column":"property_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_finance_costs","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"property_rental_income","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"property_components","stage_contract_sha256":"bbddbf8172bb48d1e8be47e3d1c3cbb4817f2a20ebb9f5533d332383e9a5ee65","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage nts_bus_travel.","id":"nts_bus_travel","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.nts_bus_travel@1","mass":"conserve","outputs":[{"column":"local_bus_use_band","dtype":"int64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_in_london_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"other_local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_trips","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"bus_pass_eligible","dtype":"bool","entity":"person","ownership":"produced","rows":"all"},{"column":"local_bus_single_fare_share","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"household_local_bus_trips","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"nts_bus_travel","stage_contract_sha256":"4852ed8e14486675baa85bca2fa8c52db49e3d2d28002af44fcb951fd07c9d54","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage lcfs_consumption.","id":"lcfs_consumption","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.lcfs_consumption@1","mass":"conserve","outputs":[{"column":"food_and_non_alcoholic_beverages_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"alcohol_and_tobacco_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"clothing_and_footwear_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"housing_water_and_electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"household_furnishings_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"health_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"transport_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"communication_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"recreation_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"education_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"restaurants_and_hotels_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"miscellaneous_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"petrol_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"diesel_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_fare_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"domestic_energy_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"electricity_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"gas_consumption","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"has_fuel_consumption","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"uses_energy_prepayment_meter","dtype":"bool","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"lcfs_consumption","stage_contract_sha256":"c96414883fe0334f990d7dde89c1b4a6d782319cc900ab5e36e6148573b44e2e","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_vat.","id":"etb_vat","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_vat@1","mass":"conserve","outputs":[{"column":"full_rate_vat_expenditure_rate","dtype":"float64","entity":"household","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_vat","stage_contract_sha256":"226ab12a5b97f28445e73c6dfde9a24c79b66721405cbd32a7378036eba37416","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage etb_services.","id":"etb_services","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share"],"entity":"person","rows":"all"}],"kernel":"uk.stage.etb_services@1","mass":"conserve","outputs":[{"column":"dfe_education_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"bus_subsidy_spending","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"rail_usage","dtype":"float64","entity":"household","ownership":"produced","rows":"all"},{"column":"a_and_e_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"admitted_patient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"outpatient_visits","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_a_and_e_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_admitted_patient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"nhs_outpatient_spending","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"etb_services","stage_contract_sha256":"5a0ef883b6aeafc505a3869adc7d1b2bc582e1e9241d644dbdf4e4610f00be68","time_period":"2024"},"population":"regional_property_uprating.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"regional_property_uprating.boundary","citation":"","description":"Ownership boundary before uc_reporter_redraw rewrites.","id":"uc_reporter_redraw.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_reporter_redraw.","id":"uc_reporter_redraw","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_reporter_redraw@1","mass":"conserve","outputs":[{"column":"universal_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_reporter_redraw","stage_contract_sha256":"93b86a8b8bbb49caebab64381c716da2d78eb7cd43d0bf1ee9edbf3a07b64539","time_period":"2024"},"population":"uc_reporter_redraw.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_reporter_redraw.boundary","citation":"","description":"Ownership boundary before spi_benefit_coherence rewrites.","id":"spi_benefit_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage spi_benefit_coherence.","id":"spi_benefit_coherence","inputs":[{"columns":["benunit_support_channel","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["aa_category","age","attendance_allowance_reported","dla_m_category","dla_m_reported","dla_sc_category","dla_sc_reported","esa_contrib_reported","incapacity_benefit_reported","is_uc_claimant","person_source_id","person_support_channel","pip_dl_category","pip_dl_reported","pip_m_category","pip_m_reported","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.spi_benefit_coherence@1","mass":"conserve","outputs":[{"column":"jsa_contrib_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"jsa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"esa_income_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"income_support_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"working_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_tax_credit_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"sda_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"ssmg_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"iidb_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"afcs_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"bsp_reported","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_enhanced_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"is_severely_disabled_for_benefits","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"receives_benefits_in_own_right","dtype":"bool","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"spi_benefit_coherence","stage_contract_sha256":"ecdb9e361778e22b5563a29b277854e8deb4ae3bb1760a5a17dadd4b7490e491","time_period":"2024"},"population":"spi_benefit_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"spi_benefit_coherence.boundary","citation":"","description":"Ownership boundary before uc_capital_coherence rewrites.","id":"uc_capital_coherence.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_capital_coherence.","id":"uc_capital_coherence","inputs":[{"columns":["benunit_support_channel","dependent_children","is_married"],"entity":"benunit","rows":"all"},{"columns":["non_residential_property_value","other_residential_property_value","owned_land","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","is_benunit_head","is_household_head","is_parent","other_investment_income","person_support_channel","savings_interest_income","universal_credit_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_capital_coherence@1","mass":"conserve","outputs":[{"column":"uc_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"pension_credit_reported_capital","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"frs_benunit_capital","dtype":"float64","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"would_claim_uc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_capital_coherence","stage_contract_sha256":"40440a087f84967c734a1204f1dedcc2432556c7ce2a41f3c38bc9055f324bfa","time_period":"2024"},"population":"uc_capital_coherence.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"uc_capital_coherence.boundary","citation":"","description":"Ownership boundary before pension_credit_take_up rewrites.","id":"pension_credit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage pension_credit_take_up.","id":"pension_credit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.pension_credit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_pc","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"has_mixed_age_couple_pension_credit_saving","dtype":"bool","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"pension_credit_take_up","stage_contract_sha256":"e887dbbb186cb79f6d3fc9a629269dbac4a43381b9574df65353b816f01a3a35","time_period":"2024"},"population":"pension_credit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"base":"pension_credit_take_up.boundary","citation":"","description":"Ownership boundary before child_benefit_take_up rewrites.","id":"child_benefit_take_up.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage child_benefit_take_up.","id":"child_benefit_take_up","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.child_benefit_take_up@1","mass":"conserve","outputs":[{"column":"would_claim_child_benefit","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"},{"column":"child_benefit_opts_out","dtype":"bool","entity":"benunit","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"child_benefit_take_up","stage_contract_sha256":"d305d97206612108bf825339124433a11f020e500b78484a1201edad572b68a2","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage uc_deduction_attributes.","id":"uc_deduction_attributes","inputs":[{"columns":["child_benefit_opts_out","frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age"],"entity":"person","rows":"all"}],"kernel":"uk.stage.uc_deduction_attributes@1","mass":"conserve","outputs":[{"column":"uc_deduction_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_type_random_draw","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_latent_deduction_rate","dtype":"float64","entity":"benunit","ownership":"produced","rows":"all"},{"column":"uc_deduction_combination","dtype":"string","entity":"benunit","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"uc_deduction_attributes","stage_contract_sha256":"6bc7e3ec1a5712e23ca1b7d2956e8b17f2526b94431ba3e5a9294b04658e4fe0","time_period":"2024"},"population":"child_benefit_take_up.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"child_benefit_take_up.boundary","citation":"","description":"Run structural UK stage cgt_support_split.","id":"cgt_support_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_support_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_support_copy","bool"],["household","cgt_support_copies","int64"],["household","cgt_support_copy_index","int64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_support_split","stage_contract_sha256":"16c2a0561cae48d25b7c676bf75f7cc436af6090d41c3d7abe3fd4f1e87f5840","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_support_split.","id":"cgt_support_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_support_copy","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copies","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_support_copy_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_support_copy","household.cgt_support_copies","household.cgt_support_copy_index"]},"population":"cgt_support_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_support_split","citation":"","description":"Run structural UK stage cgt_incidence_clone.","id":"cgt_incidence_clone","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_clone@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_capital_gains_clone","bool"],["person","capital_gains","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_clone","stage_contract_sha256":"ee30278543cc0297a5366d855b7753aa04af5518971594c193c52be36bf8a7b4","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_incidence_clone.","id":"cgt_incidence_clone.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_capital_gains_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_capital_gains_clone","person.capital_gains"]},"population":"cgt_incidence_clone","sources":[],"structural":"none","weights":null},{"base":"cgt_incidence_clone","citation":"","description":"Ownership boundary before hmrc_cgt_gains_spine rewrites.","id":"hmrc_cgt_gains_spine.boundary","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.identity@1","mass":"conserve","outputs":[],"params":{},"population":null,"sources":[],"structural":"filter","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_gains_spine.","id":"hmrc_cgt_gains_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["cgt_support_copies","corporate_wealth","gross_financial_wealth","household_is_cgt_support_copy","non_residential_property_value","other_residential_property_value","region"],"entity":"household","rows":"all"},{"columns":["age","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported","tax_free_savings_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_gains_spine@1","mass":"conserve","outputs":[{"column":"capital_gains","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_gains_spine","stage_contract_sha256":"dd590333c60fb66ee6c4f1c1eb2cf6ad89c9b277f8da1c9dc5db336167598f93","time_period":"2024"},"population":"hmrc_cgt_gains_spine.boundary","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"hmrc_cgt_gains_spine.boundary","citation":"","description":"Run structural UK stage cgt_incidence_anchor.","id":"cgt_incidence_anchor","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["household_is_capital_gains_clone","region"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","dividend_income","employment_income","miscellaneous_income","private_pension_income","property_income","savings_interest_income","self_employment_income","state_pension_reported"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_incidence_anchor@1","mass":"conserve","outputs":[],"params":{"expand_cells":[],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_incidence_anchor","stage_contract_sha256":"b79ce806015de2f1e1703fa68bf4ad871c6df54b5b32633c864632ab68919a48","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":"cgt_incidence_anchor","citation":"","description":"Run structural UK stage cgt_residential_split.","id":"cgt_residential_split","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","employment_income","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","employee_pension_contributions","pension_contributions_via_salary_sacrifice","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains"],"entity":"person","rows":"all"}],"kernel":"uk.stage.expand.cgt_residential_split@1","mass":"conserve","outputs":[],"params":{"expand_cells":[["household","household_is_cgt_residential_clone","bool"],["household","cgt_residential_clone_index","int64"],["person","cgt_residential_probability","float64"],["person","capital_gains_residential_property","float64"]],"expand_weight_entity":"household","expand_weight_kind":"importance","numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"cgt_residential_split","stage_contract_sha256":"e5e88f0c25b92b327533d253275adc21a50fb678d6be57c164cdab14e0a9db04","time_period":"2024"},"population":null,"sources":["frs"],"structural":"expand","weights":null},{"base":null,"citation":"","description":"Own the cells materialized by cgt_residential_split.","id":"cgt_residential_split.owned","inputs":[],"kernel":"uk.claim@1","mass":"conserve","outputs":[{"column":"household_is_cgt_residential_clone","dtype":"bool","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_clone_index","dtype":"int64","entity":"household","ownership":"produced","rows":"all"},{"column":"cgt_residential_probability","dtype":"float64","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_residential_property","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"materialized_expand_outputs":["household.household_is_cgt_residential_clone","household.cgt_residential_clone_index","person.cgt_residential_probability","person.capital_gains_residential_property"]},"population":"cgt_residential_split","sources":[],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage hmrc_cgt_asset_type_spine.","id":"hmrc_cgt_asset_type_spine","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["corporate_wealth","gross_financial_wealth","other_residential_property_value","region","stocks_and_shares_isa"],"entity":"household","rows":"all"},{"columns":["age","capital_gains","capital_gains_residential_property","dividend_income","property_income","reports_rent_from_other_property","self_employment_income"],"entity":"person","rows":"all"}],"kernel":"uk.stage.hmrc_cgt_asset_type_spine@1","mass":"conserve","outputs":[{"column":"capital_gains_asset_type","dtype":"string","entity":"person","ownership":"produced","rows":"all"},{"column":"capital_gains_badr","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"hmrc_cgt_asset_type_spine","stage_contract_sha256":"d28eaddaa77793178b6e973ab9e70a98aa6143072faed6e6773e4a7257358371","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage salary_sacrifice.","id":"salary_sacrifice","inputs":[{"columns":["frs_benunit_capital","is_married","dependent_children","liable_for_share_of_household_rent","would_claim_child_benefit","child_benefit_opts_out","would_claim_pc","would_claim_uc","would_claim_tfc","would_claim_extended_childcare","would_claim_universal_childcare","would_claim_targeted_childcare","would_claim_uc_childcare","maximum_extended_childcare_hours_usage","benunit_source_id","benunit_support_channel","benunit_support_clone_index","uc_reported_capital","pension_credit_reported_capital","has_mixed_age_couple_pension_credit_saving","uc_deduction_random_draw","uc_deduction_type_random_draw","uc_latent_deduction_rate","uc_deduction_combination"],"entity":"benunit","rows":"all"},{"columns":["region","tenure_type","accommodation_type","num_bedrooms","council_tax_reported","council_tax_band","council_tax_rebate","council_tax_single_adult_raw","water_and_sewerage_charges","domestic_rates","rent","subrent","mortgage_interest_repayment","mortgage_capital_repayment","structural_insurance_payments","housing_service_charges","external_child_payments","ons_household_type","council_tax","household_owns_tv","would_evade_tv_licence_fee","main_residential_property_purchased_is_first_home","property_purchased","brma","source_household_id","source_year","source_household_key","household_source_id","household_support_channel","household_support_clone_index","household_is_spi_synthetic","household_is_spi_income_band_donor","spi_income_band_donor_lower_bound","owned_land","property_wealth","corporate_wealth","private_pension_wealth","gross_financial_wealth","net_financial_wealth","main_residence_value","other_residential_property_value","non_residential_property_value","savings","num_vehicles","cash_isa","stocks_and_shares_isa","mortgage_debt","consumer_debt","household_lifetime_isa_balance","household_local_bus_trips","food_and_non_alcoholic_beverages_consumption","alcohol_and_tobacco_consumption","clothing_and_footwear_consumption","housing_water_and_electricity_consumption","household_furnishings_consumption","health_consumption","transport_consumption","communication_consumption","recreation_consumption","education_consumption","restaurants_and_hotels_consumption","miscellaneous_consumption","petrol_spending","diesel_spending","bus_fare_spending","domestic_energy_consumption","electricity_consumption","gas_consumption","has_fuel_consumption","uses_energy_prepayment_meter","full_rate_vat_expenditure_rate","dfe_education_spending","rail_subsidy_spending","bus_subsidy_spending","rail_usage","household_is_cgt_support_copy","cgt_support_copies","cgt_support_copy_index","household_is_capital_gains_clone","household_is_cgt_residential_clone","cgt_residential_clone_index"],"entity":"household","rows":"all"},{"columns":["age","gender","marital_status","hours_worked","care_hours","is_household_head","is_benunit_head","is_parent","is_blind","is_uc_claimant","is_claimant_or_partner","is_hbai_dependent_child","uc_is_in_startup_period","uc_is_in_gainful_self_employment","rent_paid_as_boarder","rent_paid_as_lodger","self_employment_income","private_pension_income","tax_free_savings_income","savings_interest_income","dividend_income","property_income","reports_rent_from_other_property","maintenance_income","miscellaneous_income","private_transfer_income","lump_sum_income","student_loan_repayments","statutory_sick_pay","statutory_maternity_pay","student_loans","access_fund","education_grants","healthy_start_vouchers","free_school_breakfasts","free_school_fruit_veg","free_school_meals","council_tax_benefit_reported","maintenance_expenses","childcare_expenses","personal_pension_contributions","salary_sacrifice_reported","salary_sacrifice_asked","child_benefit_reported","income_support_reported","housing_benefit_reported","attendance_allowance_reported","dla_sc_reported","dla_m_reported","iidb_reported","carers_allowance_reported","would_claim_carers_allowance","sda_reported","afcs_reported","ssmg_reported","pension_credit_reported","child_tax_credit_reported","working_tax_credit_reported","state_pension_reported","winter_fuel_allowance_reported","incapacity_benefit_reported","universal_credit_reported","pip_m_reported","pip_dl_reported","jsa_contrib_reported","jsa_income_reported","esa_contrib_reported","esa_income_reported","bsp_reported","relationship_to_head","ons_family_role","ons_family_index","is_looked_after_by_local_authority","employment_status","employment_sector","sic_industry_division","aa_category","dla_sc_category","dla_m_category","pip_m_category","pip_dl_category","is_disabled_for_benefits","is_enhanced_disabled_for_benefits","is_severely_disabled_for_benefits","current_education","highest_education","is_in_non_advanced_education","is_in_approved_training","age_started_or_accepted_current_education_or_training","is_before_universal_credit_qualifying_young_person_terminal_date","adult_ema","child_ema","receives_benefits_in_own_right","legacy_jobseeker_proxy","esa_health_condition_proxy","esa_support_group_proxy","disabled_students_allowance_eligible_expenses","would_claim_marriage_allowance","would_claim_scp","attends_private_school_random_draw","tax_free_childcare_spend_routed_share","hmrc_spi_pay","hmrc_spi_unemployment_benefit_income","hmrc_spi_incapacity_benefit_income","ossben_identifiable_subset","srp_regular_code5","employer_pension_contributions","person_source_id","person_support_channel","person_support_clone_index","person_is_spi_income_band_carrier","charitable_investment_gifts","gift_aid","other_investment_income","hmrc_spi_employment_benefits","hmrc_spi_employment_expenses","hmrc_spi_other_social_security_income","hmrc_spi_taxable_termination_pay","hmrc_spi_miscellaneous_employment_income","hmrc_spi_other_income","hmrc_spi_state_pension_income","property_finance_costs","hmrc_spi_employed_income","hmrc_spi_total_earned_income","hmrc_spi_total_investment_income","hmrc_spi_assessable_income","person_is_spi_income_recipient","student_loan_balance","has_lifetime_isa","lifetime_isa_balance","property_rental_income","local_bus_use_band","bus_in_london_trips","other_local_bus_trips","local_bus_trips","bus_pass_eligible","local_bus_single_fare_share","a_and_e_visits","admitted_patient_visits","outpatient_visits","nhs_a_and_e_spending","nhs_admitted_patient_spending","nhs_outpatient_spending","capital_gains","cgt_residential_probability","capital_gains_residential_property","capital_gains_asset_type","capital_gains_badr"],"entity":"person","rows":"all"}],"kernel":"uk.stage.salary_sacrifice@1","mass":"conserve","outputs":[{"column":"pension_contributions_via_salary_sacrifice","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employee_pension_contributions","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"employment_income","dtype":"float64","entity":"person","ownership":"produced","rewrite":true,"rows":"all"},{"column":"salary_sacrifice_pre_conversion_pay","dtype":"float64","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"salary_sacrifice","stage_contract_sha256":"051e5ad02ae8f22986db97f513ad3d7dcc06da81f4cfa7ec5d01428f37748360","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null},{"artifact_outputs":[{"name":"stage_evidence","type":{"name":"microcosm.stage-evidence","schema_version":1}}],"base":null,"citation":"","description":"Run UK spine stage student_loans.","id":"student_loans","inputs":[{"columns":["frs_benunit_capital"],"entity":"benunit","rows":"all"},{"columns":["region"],"entity":"household","rows":"all"},{"columns":["age","current_education","highest_education","salary_sacrifice_pre_conversion_pay","student_loan_repayments","student_loans"],"entity":"person","rows":"all"}],"kernel":"uk.stage.student_loans@1","mass":"conserve","outputs":[{"column":"student_loan_plan","dtype":"string","entity":"person","ownership":"produced","rows":"all"}],"params":{"numerical_dependencies":[["policyengine-uk","2.123.0"],["policyengine-core","3.32.19"],["numpy","2.4.6"],["pandas","3.0.3"],["scikit-learn","1.8.0"],["quantile-forest","1.4.2"]],"stage":"student_loans","stage_contract_sha256":"f2936c5e22a0e9b097437e3f3aabaf06c4561d5c25a9b7c05e720a6553f73bbc","time_period":"2024"},"population":"cgt_residential_split","sources":["frs"],"structural":"none","weights":null}],"sources":[{"codec":"csv-tables","description":"Content-bound UK FRS and donor fixture/source bundle.","name":"frs"}]} diff --git a/test_support/microcosm_build/uk_spi_income.py b/test_support/microcosm_build/uk_spi_income.py index bd46537a73..e8e2ac0aca 100644 --- a/test_support/microcosm_build/uk_spi_income.py +++ b/test_support/microcosm_build/uk_spi_income.py @@ -46,6 +46,7 @@ replace_uk_spi_support_tables, support_channel_column, ) +from microcosm.fit import ConditionalUniforms from microcosm.frame import WeightKind from test_support.paths import paths_for @@ -60,6 +61,54 @@ def __init__(self, targets: tuple[str, ...], weight_kind: str) -> None: self.targets = targets self.weight_kind = weight_kind + def regimes(self) -> dict[str, str]: + return dict.fromkeys(self.targets, "zero_inflated_positive") + + def sign_classes(self, target: str) -> tuple[int, ...]: + return (0, 1) + + def conditional_uniforms( + self, + frame: pd.DataFrame, + *, + sign_placement: dict[str, np.ndarray], + quantile_placement: dict[str, np.ndarray], + ) -> ConditionalUniforms: + """Hand the placements back: a fake reference forest locates nothing.""" + + missing = [target for target in self.targets if target not in frame.columns] + assert not missing, missing + return ConditionalUniforms( + quantiles={ + target: np.asarray(quantile_placement[target], dtype=float) + for target in self.targets + }, + sign_uniforms={ + target: np.asarray(sign_placement[target], dtype=float) + for target in self.targets + }, + degenerate=(), + ungated=(), + ) + + def predict_from_uniforms( + self, + predictors: pd.DataFrame, + *, + quantiles: dict[str, np.ndarray], + sign_uniforms: dict[str, np.ndarray], + ) -> pd.DataFrame: + """Draw as ``predict`` does; the uniforms are kept for tests to read.""" + + assert set(quantiles) == set(self.targets) == set(sign_uniforms) + self.last_uniforms = { + "quantiles": {k: np.asarray(v, dtype=float) for k, v in quantiles.items()}, + "sign_uniforms": { + k: np.asarray(v, dtype=float) for k, v in sign_uniforms.items() + }, + } + return self.predict(predictors) + def predict(self, predictors: pd.DataFrame) -> pd.DataFrame: values: dict[str, np.ndarray] = {} for position, target in enumerate(self.targets, start=1): @@ -128,6 +177,9 @@ def _dead_support( "gender": ["MALE", "FEMALE", "MALE", "FEMALE"], # Each one-person benefit unit is its own claimant. "is_uc_claimant": np.ones(4, dtype=bool), + # The bridge predictors and the recipient income rule read these. + "employment_status": ["FT_EMPLOYED"] * 4, + "miscellaneous_income": np.zeros(4, dtype=float), } for position, column in enumerate(SPI_INCOME_IMPUTATION_COLUMNS, start=1): if column == drop_income_component: @@ -203,6 +255,12 @@ def _write_donor(path: Path, *, drop: str | None = None) -> None: # relief in TAX_CRED (microcosm#1106). "LLIR_RESTRICT_AMT_TOT": [0.0, 0.0, 200.0, 300.0], "TAX_CRED": [0.0, 0.0, 40.0, 60.0], + # Annex A bridge codes, consistent with the leaves above: pay is + # every record's main source, every record files trade pages, and + # the two State Pension recipients are at State Pension age. + "MAINSRCE": [1, 1, 1, 1], + "SEINC_NUM": [1, 1, 1, 1], + "SPA": [0, 0, 1, 1], } ) employment = ( diff --git a/tools/graph_uk_spine_fixture.py b/tools/graph_uk_spine_fixture.py index c63068ab45..ec30b50219 100644 --- a/tools/graph_uk_spine_fixture.py +++ b/tools/graph_uk_spine_fixture.py @@ -1111,6 +1111,11 @@ def _spi_donor() -> pd.DataFrame: ) row["TII"] = row["OTHERINV"] + row["DIVIDENDS"] + row["INCPROP"] + row["INCBBS"] row["TI"] = row["TEI"] + row["TII"] + # Annex A bridge codes consistent with the leaves (microcosm#840): the + # main source is the largest leaf, the trade pages follow PROFITS and + # State Pension age follows the State Pension leaf, as the age draw + # places every recipient at or over it. + row.update(_bridge_codes(row)) rows.append(row) # The reserved income bands (spi_income_band_donors) need a pool in every # band from GBP 200,000 for every region, sex and age cell the synthetic @@ -1140,6 +1145,7 @@ def _spi_donor() -> pd.DataFrame: row["TEI"] = row["PAY"] row["TII"] = row["DIVIDENDS"] + row["INCBBS"] row["TI"] = row["TEI"] + row["TII"] + row.update(_bridge_codes(row)) rows.append(row) for offset in range(6): row = {column: 0.0 for column in SPI_DONOR_REQUIRED_COLUMNS} @@ -1157,10 +1163,34 @@ def _spi_donor() -> pd.DataFrame: row["TEI"] = row["PAY"] row["TII"] = row["DIVIDENDS"] + row["INCBBS"] row["TI"] = row["TEI"] + row["TII"] + # Composite records carry no bridge codes, as the published tape. + row.update({"MAINSRCE": -1.0, "SEINC_NUM": -1.0, "SPA": -1.0}) rows.append(row) return pd.DataFrame(rows) +def _bridge_codes(row: dict[str, float]) -> dict[str, float]: + """The published bridge codes implied by a synthetic record's leaves.""" + + employment_income = row["PAY"] + row["EPB"] + row["TAXTERM"] + pension = row["PENSION"] + row["SRP"] + trade = max(row["PROFITS"] - row["CAPALL"] - row["LOSSBF"], 0.0) + largest = max(employment_income, pension, trade) + if largest <= 0.0: + main_source = 5.0 + elif largest == employment_income: + main_source = 1.0 + elif largest == pension: + main_source = 2.0 + else: + main_source = 3.0 + return { + "MAINSRCE": main_source, + "SEINC_NUM": 1.0 if row["PROFITS"] > 0.0 else 0.0, + "SPA": 1.0 if row["SRP"] > 0.0 else 0.0, + } + + def _hmrc_income_targets(path: Path) -> HMRCIncomeTargetSet: upper_bounds = (*HMRC_SPI_INCOME_BAND_LOWER_BOUNDS[1:], None) targets = tuple( @@ -1553,11 +1583,22 @@ def _fixture_stages( stage, "fit_weighted_qrf_chain", n_estimators=_QRF_ESTIMATORS ) elif stage.stage == "hmrc_spi_income_spine": + stage1 = next( + operation + for operation in stage.operations + if operation.kind == "fit_weighted_qrf_stage1" + ) stage = _replace_operation( stage, "fit_weighted_qrf_stage1", sample_size=_SPI_DONOR_SAMPLE_SIZE, n_estimators=_QRF_ESTIMATORS, + # The FRS reference forest (microcosm#840) grows the fixture's + # estimator count too. + reference_model={ + **stage1.parameters["reference_model"], + "n_estimators": _QRF_ESTIMATORS, + }, ) stage = _replace_operation( stage, From 0bb3018c2c10912cd0fd80297d4c79bb3595b401 Mon Sep 17 00:00:00 2001 From: Maria Juaristi Date: Wed, 14 Oct 2026 18:59:24 +0100 Subject: [PATCH 2/2] Add the #840 receipts note (#840) experiments/840-spi-draw-receipts.md: the tape receipts (R0), the spine twins at design weights on the pre-rebase base (R1a to R1e: stage evidence, the award screen and reporters by channel, rank fidelity and the in-sample atom behind the cross-fit, the rebuilt treatment, and the downstream moves by mechanism) and the twins on #1200's base (R1f). Shares and weighted totals only; record counts stay with the raw receipts beside the builds (CD137 cl. 8 / CD171 5.2.1). Co-Authored-By: Claude Fable 5.1 --- experiments/840-spi-draw-receipts.md | 532 +++++++++++++++++++++++++++ 1 file changed, 532 insertions(+) create mode 100644 experiments/840-spi-draw-receipts.md diff --git a/experiments/840-spi-draw-receipts.md b/experiments/840-spi-draw-receipts.md new file mode 100644 index 0000000000..5e0fb1a7b7 --- /dev/null +++ b/experiments/840-spi-draw-receipts.md @@ -0,0 +1,532 @@ +# #840 receipts: the twin-conditional SPI draw + +Receipts for the microcosm#840 PR (bridge predictors, the no-record rule and the +Rosenblatt transport of the twin's standing into the SPI stage-1 draw). Every +figure is a weighted aggregate over 10 or more records or a published number; +cells under 10 records are written "<10" (CD137 cl. 8 / CD171 §5.2.1); record +counts stay with the raw receipts beside the builds, and this note carries +shares and weighted totals. Raw +receipts stay licensed-side under `data/build/840-twins/` on the author's +machine. + +## R0. Tape receipts (SPI 2022-23 PUT, FACT-weighted) + +The bridge predictors are validated against the published Annex A codes (pp. +14-17 of the UKDS documentation). The figures are the stage receipt +(`bridge_validation` on the stage evidence), measured on the full tape with +the stage's preparation (employment income PAY + EPB + TAXTERM, pension +PENSION + SRP, trade max(0, PROFITS − CAPALL − LOSSBF)); an earlier +exploration with the raw columns gave 0.961 overall and a partnership +agreement near zero, which that preparation does not reproduce. + +| Check | Weighted share | +|---|---:| +| Leaf-defined `main_source` agrees with MAINSRCE (1 pay, 2 pension, 3/4 trade, 5/6 other) over classified records | 0.969 | +| ... by code: pay / occupational pension / sole trader / partnership / other | 0.983 / 0.987 / 0.851 / 0.744 / 0.916 | +| `PAY > 0` among MAINSRCE 1 | 0.995 | +| `SEINC_NUM = 1` among `PROFITS > 0`; `PROFITS > 0` among `SEINC_NUM = 1` | 1.000; 0.898 | +| `SRP > 0` among `SPA = 1`; `SPA = 1` among `SRP > 0` | 0.942; 0.999 | +| Composite records (-1, no codes) | 0.002 | +| MAIND claimants (dropped as a predictor) | 0.047 | +| INDUSTRY07 blank among `PAY > 0` (industry deferred to increment 2) | 0.078 | + +`has_trade` and `at_or_over_spa` take the codes on the tape (the leaves serve +only a composite record), `main_source` and `has_pay` the leaves; the receipt +reports each code against its leaf both ways. + +## R1. Spine twins at design (prior) weights + +Control: origin/main `d1fda720b`. Treatment: the branch at the same base. +Same inputs (`spine-request.json`), engine policyengine-uk 2.122.2, seed 42. + +### R1a. Treatment stage evidence (`hmrc_spi_income_spine`, 13 min, peak RSS 13.2 GiB) + +All 36 spine gates pass; the HMRC 208-fact replay stays `reviewed_exclusions_only` +(every fact fenced, as before); the effective-mass columns sit at 0.0119 +(`gift_aid`) and 0.0008 (`charitable_investment_gifts`) against the 1e-6 floor; +the TEI + TII identity is exact on every SPI-channel row checked. + +| Recipient domain | Share | Weight | +|---|---:|---:| +| Drawn recipients (claimants and partners aged 16+) | 0.86 of the domain's rows | | +| ... sharing a twin with another drawn copy (band-donor stacking) | 0.11 of the drawn | | +| Undrawn, no taxable income (the no-record rule) | 0.14 of the domain's rows | 3.80m | +| Reserved band carriers drawn without taxable income | 0.014 of the drawn | | +| Dependants aged 16 to 19 kept on twin values | 0.03 of the channel's 16+ rows | 0.84m | +| Reference forest training rows (FRS claimants and partners with taxable income) | 0.50 of the FRS base adults | | + +Tape validation (the stage receipt, R0): main-source agreement 0.969 overall +(pay 0.983, occupational pension 0.987, sole trader 0.851, partnership 0.744, +other 0.916), `PAY > 0` among MAINSRCE 1 0.995, `SEINC_NUM = 1` among +`PROFITS > 0` 1.000, `SRP > 0` among `SPA = 1` 0.942, `SPA = 1` among `SRP > 0` +0.999, composites 0.002. + +Transport receipt (Kolmogorov distance from U[0,1); the quantile over the +twin's positive rows; the sign over all drawn recipients): + +| Stage-1 target | Source | FRS regime | KS sign | KS quantile | Positive share of drawn | +|---|---|---|---:|---:|---:| +| `hmrc_spi_pay` | twin | zero-inflated positive | 0.007 | 0.044 | 0.56 | +| `savings_interest_income` | twin | zero-inflated positive | 0.007 | 0.049 | 0.44 | +| `hmrc_spi_state_pension_income` | twin | zero-inflated positive | 0.007 | 0.025 | 0.32 | +| `private_pension_income` | twin | zero-inflated positive | 0.010 | 0.035 | 0.27 | +| `self_employment_income` | twin | zero-inflated positive | 0.008 | 0.076 | 0.09 | +| `dividend_income` | twin | zero-inflated positive | 0.005 | 0.029 | 0.07 | +| `property_income` | twin | zero-inflated positive | 0.010 | 0.043 | 0.05 | +| `hmrc_spi_other_income` | twin | zero-inflated positive | 0.014 | 0.051 | 0.01 | +| `hmrc_spi_other_social_security_income` | twin | zero-inflated positive | 0.006 | 0.113 | 0.01 | +| `hmrc_spi_unemployment_benefit_income` | twin | zero-inflated positive | 0.011 | n/a | <0.001 | +| `hmrc_spi_incapacity_benefit_income` | identity (degenerate analogue) | all zero | 0.006 | n/a | 0 | +| 7 leaves without an FRS analogue | identity | | 0.005-0.010 | 0.004-0.008 | | + +By main source the sign uniforms are uniform within the pay (0.54 of the drawn), +pension (0.35) and trade (0.08) groups (KS 0.01-0.03) and skew high in the +"other" group (0.03; KS 0.11-0.25 on dividends, interest and property), +which is the group defined by holding those leaves: a conditional position +restricted to rows selected on the outcome is not uniform, and the overall +uniformity is the receipt. The in-sample atom the D3 ruling anticipated shows +as the 0.03-0.08 quantile distances on the large targets. + +### R1b. Control against treatment (design weights, GB and NI, calendar 2025) + +Control spine: origin/main `123927679` (with #1167); treatment: the branch on +`d1fda720b` plus the stage change. The arms differ in size only through the +CGT clone arms downstream of the changed incomes. + +**Confinement.** On the pre-CGT rows (the same households on both sides) the stage itself leaves every FRS-channel cash and reported column +byte-identical: the FRS person columns that move are the frame-level stages +downstream (`capital_gains` and its CGT companions on a fifth of the FRS +rows, the salary-sacrifice conversion on 1 % of them, where `employment_income` moves with +`pension_contributions_via_salary_sacrifice` and `employee_pension_contributions`, +`student_loan_plan` on <10). FRS household columns move only on the QRF-imputed +consumption and energy columns (the ripple #834 documented) and +`household_weight`, which the CGT mass moves shift within −2.9 % to +1.1 % +(1st to 99th percentile); FRS mass 16.743m to 16.732m, SPI 11.906m to 11.917m. +FRS benefit units move on the residual take-up draws solved over the whole frame +(`would_claim_uc`, `would_claim_pc`, Child Benefit). Everything else that moves +is on SPI-channel rows. + +**The award screen** (`max(0, uc_maximum_amount − uc_income_reduction) > 0`, 2025, +benefit units with an adult under 66; FRS rows identical on both arms): + +| Family type | FRS | SPI control | SPI treatment | +|---|---:|---:|---:| +| Lone parents | 0.644 | 0.539 | 0.646 | +| Couples with children | 0.287 | 0.252 | 0.297 | +| Singles without children | 0.355 | 0.233 | 0.407 | +| Couples without children | 0.100 | 0.074 | 0.125 | + +Over all benefit units the lone-parent shares are 0.639 / 0.538 / 0.645. + +**Universal Credit reporters after `uc_reporter_redraw`** (weighted; in +brackets the SPI channel's distinct FRS source households carrying them as a +share of the FRS channel's): + +| Family type | FRS | SPI control | SPI treatment | +|---|---:|---:|---:| +| Lone parents | 0.827m | 0.554m (0.43) | 0.750m (0.58) | +| Couples with children | 0.376m | 0.237m (0.51) | 0.380m (0.78) | +| Singles without children | 1.094m | 0.450m (0.33) | 0.965m (0.69) | +| Couples without children | 0.115m | 0.032m (0.24) | 0.119m (0.76) | + +**Pay and trade by employment status** (SPI claimants and partners aged 16+, +share with pay > 0; the uk-data#529 defect): + +| Status | FRS pay | SPI control pay | SPI treatment pay | FRS trade | SPI control trade | SPI treatment trade | +|---|---:|---:|---:|---:|---:|---:| +| Full-time employed | 0.983 | 0.831 | 0.980 | 0.014 | 0.114 | 0.016 | +| Part-time employed | 0.970 | 0.794 | 0.969 | 0.029 | 0.091 | 0.027 | +| Full-time self-employed | 0.026 | 0.769 | 0.051 | 0.908 | 0.126 | 0.912 | +| Part-time self-employed | 0.049 | 0.743 | 0.056 | 0.885 | 0.074 | 0.866 | +| Retired | 0.000 | 0.281 | 0.017 | 0.000 | 0.061 | 0.006 | +| Unemployed | 0.000 | 0.848 | 0.017 | 0.000 | 0.095 | 0.005 | +| Student | 0.000 | 0.935 | 0.003 | 0.000 | 0.051 | 0.000 | +| Carer | 0.000 | 0.835 | 0.011 | 0.000 | 0.086 | 0.002 | +| Long-term disabled | 0.000 | 0.790 | 0.015 | 0.000 | 0.100 | 0.003 | + +The residual 1-2 % of pay among SPI non-workers is the reserved band carriers, +whose leaves come from the band pools. + +**Lone-parent adults by FRS adult income quintile** (FRS claimants and +partners, weighted): FRS 0.30 / 0.13 / 0.17 / 0.20 / 0.19; SPI control 0.13 / +0.19 / 0.19 / 0.21 / 0.28; SPI treatment 0.35 / 0.14 / 0.12 / 0.16 / 0.22. + +**Composition after the no-record rule** (working-age units, weighted share +with no taxable income): singles FRS 0.243, SPI control 0.038, SPI treatment +0.239; lone parents FRS 0.220, SPI control 0.027, SPI treatment 0.235. The SPI +singles' screen share above the FRS one comes with a larger share of low +earners (pay above zero and under £12,000: 0.166 against 0.085), see R1c. + +### R1c. Rank fidelity, the in-sample atom and the cross-fit + +The first treatment (reference forest fitted on every FRS adult and scored +in-sample) kept the twin's standing only partly: among employed twins, the +Spearman correlation of copy pay with twin pay was 0.49 overall and 0.40 +within gender x region x age-band cells (control: 0.13 and −0.02). The cause +is the in-sample atom the D3 ruling anticipated, measured here on the pre-CGT +FRS base adults with the stage's forest settings: a twin's own +value occupied a median 0.36 (self-employment), 0.15 (interest), 0.74 +(dividends), 0.46 (private pension), 0.73 (property) and 0.23 (pay) of its +conditional's mass (90th percentile 0.62-0.99), because the weighted bootstrap +fills a row's own leaves with its copies. The located quantile was then +mostly the random placement inside that atom. Marginal uniformity (R1a) does +not show this, rank fidelity does. + +Spearman correlation of the located quantile with the twin's value, over +positive rows, three ways of fitting the reference (in-sample; five folds +keyed on the row; five folds keyed on the predictor cell, so a cell is located +by one forest it never saw): + +| Target | Positive share of FRS base adults | Exact cells: in-sample / row folds / cell folds | Overall: in-sample / row folds / cell folds | +|---|---:|---|---| +| `self_employment_income` | 0.09 | 0.97 / 0.88 / 0.98 | 0.48 / 0.58 / 0.70 | +| `savings_interest_income` | 0.46 | 0.98 / 0.91 / 0.99 | 0.69 / 0.72 / 0.85 | +| `dividend_income` | 0.07 | 0.40 / 0.60 / 0.72 | 0.37 / 0.63 / 0.78 | +| `private_pension_income` | 0.30 | 0.55 / 0.68 / 0.80 | 0.46 / 0.63 / 0.78 | +| `property_income` | 0.04 | 0.35 / 0.60 / 0.84 | 0.43 / 0.64 / 0.83 | +| `hmrc_spi_pay` | 0.54 | 0.66 / 0.73 / 0.83 | 0.51 / 0.61 / 0.73 | + +The stage therefore cross-fits the reference in five folds keyed on the +predictor cell (`reference_model.folds`, `fold_key`); a copy shares its twin's +cell, so the forest that locates it never saw the twin. The residual +within-cell shuffle is the chain: a leaf is located given the twin's observed +earlier leaves, which differ between rows of a cell. The rebuilt treatment's +receipts follow in R1d. + +**The imported pay marginal.** With the twin's rank carried, the level is the +tape's: among earners the tape holds 30 % under £12,570 and 56 % under +£25,000 against 12 % and 35 % on the FRS adults, the annual tax-record +concept against the FRS's annualised current pay. On the first treatment the +copies of employed twins sat at 21 % under £12,570 and 24 % at £12,570-25,000 +(twins 10 % and 21 %), which is why the SPI singles' screen share sits above +the FRS one. + +### R1d. The rebuilt treatment (cross-fitted reference, 16 min, peak RSS 9.3 GiB) + +Same base, inputs, engine and seed as R1a; the reference cross-fitted in five +folds keyed on the predictor cell (each fold holds a fifth of the training +rows and scores a fifth of the recipients, no in-sample fold). All 36 spine gates pass, +the replay stays `reviewed_exclusions_only`, the effective-mass columns and +the TEI + TII identity hold as in R1a. The recipient domain is unchanged +(0.86 of the domain's rows drawn, 0.14 undrawn, 0.014 of the drawn being +carriers without taxable income). + +Held-out location moves the quantile uniformity receipt from the in-sample +values (R1a) to its honest level: KS quantile 0.085 (pay), 0.070 (interest), +0.077 (state pension), 0.080 (private pension), 0.082 (property), 0.108 +(dividends), 0.123 (self-employment); the sign uniforms stay at 0.006-0.012. + +**Rank fidelity of the draw** (Spearman of the copy's leaf with the twin's, +both positive; overall / within gender x region x age-band cells / within +gender x region x whole-year-age cells): + +| Leaf | Control | First treatment (in-sample) | Rebuilt (cross-fitted) | +|---|---|---|---| +| Pay | 0.13 / −0.02 / −0.02 | 0.49 / 0.40 / 0.44 | 0.59 / 0.52 / 0.50 | +| Self-employment | 0.16 / −0.25 / −0.11 | 0.51 / 0.47 / 0.78 | 0.72 / 0.64 / 0.78 | +| Private pension | 0.07 / 0.03 / 0.03 | 0.49 / 0.47 / 0.51 | 0.66 / 0.63 / 0.62 | +| Interest | 0.09 / 0.00 / −0.01 | 0.45 / 0.39 / 0.41 | 0.55 / 0.46 / 0.43 | +| Dividends | 0.16 / 0.03 / −0.17 | 0.32 / 0.33 / 0.47 | 0.53 / 0.51 / 0.56 | +| Property | −0.08 / −0.52 / −0.93 | 0.39 / 0.27 / 0.05 | 0.73 / 0.68 / 0.27 | + +The draw's fidelity sits below the located quantile's (R1c) because the tape +forest's own conditional varies between rows of a cell and the chain locates +each leaf given the twin's observed earlier leaves. + +**The award screen** (benefit units with an adult under 66; all units in +brackets): lone parents FRS 0.644 (0.639), SPI control 0.539 (0.538), SPI +rebuilt 0.653 (0.653); couples with children 0.287 / 0.252 / 0.292; singles +without children 0.355 / 0.233 / 0.324 over all units; couples without +children 0.100 / 0.074 / 0.131 over all units. + +**Universal Credit reporters** (weighted; in brackets the SPI channel's +distinct FRS source households as a share of the FRS channel's): lone parents +FRS 0.827m, SPI control 0.554m (0.43), SPI rebuilt 0.773m (0.59); couples +with children 0.376m / 0.237m (0.51) / 0.403m (0.83); singles without +children 1.094m / 0.450m (0.33) / 0.938m (0.68); couples without children +0.115m / 0.032m (0.24) / 0.115m (0.81). + +**Pay and trade by employment status** on the rebuilt SPI rows match the FRS +rows as in R1b (full-time employed pay 0.979 against 0.983; full-time +self-employed trade 0.908 against 0.908; retired, unemployed, students, +carers and the long-term disabled at 0.3-1.7 % pay, the band carriers). +Lone-parent adults by FRS income quintile: SPI rebuilt 0.36 / 0.15 / 0.13 / +0.16 / 0.20 against FRS 0.30 / 0.13 / 0.17 / 0.20 / 0.19. + +**Confinement and the signed-difference draft.** On the pre-CGT households +(same ids on both arms) the FRS-channel rows move only on: +`household_weight` through the CGT mass moves (−3.8 % to +1.5 %, 1st to 99th +percentile; FRS mass 16.743m to 16.747m, SPI 11.906m to 11.902m); the +QRF-imputed consumption and energy columns (`housing_water_and_electricity_consumption`, +`domestic_energy_consumption`, `electricity_consumption`, `gas_consumption`, +`transport_consumption`, `petrol_spending`, `diesel_spending`, +`full_rate_vat_expenditure_rate`); the CGT lane (`capital_gains`, +`cgt_residential_probability`, `capital_gains_asset_type`, `capital_gains_badr`, +`cgt_support_copies`); the salary-sacrifice conversion (1 % of FRS persons, where +`employment_income`, `employee_pension_contributions`, +`pension_contributions_via_salary_sacrifice` and +`salary_sacrifice_pre_conversion_pay` move together); the residual take-up +draws (`would_claim_child_benefit`, `child_benefit_opts_out` and +`would_claim_pc`, under 0.2 % of FRS units each); `student_loan_plan` (<10). No FRS cash or +reported column moves otherwise. The SPI-channel rows move on every stage-1 +output and its HMRC aggregates, the stage-2 reports and pension contributions, +the disability flags, `receives_benefits_in_own_right`, `would_claim_uc`, the +recorded capitals, the housing shell, the WAS, LCFS, ETB and NTS draws and +the CGT lane: 67 person, 8 benefit-unit and 58 household columns, the +inventory for the signed-difference entries (kept outside the repository +until signed). + +The plan's stage receipts and where they sit: payload confinement (R1b, +R1d, R1e); recipient domain (R1a, R1d); transport receipt and Kolmogorov +distances by main source (R1a, R1d); screened share by channel and family +type (R1b, R1d, R1e); pay and trade by employment status (R1b, R1d); lone +parents' standing in the FRS income quintiles (R1b, R1d); lone-parent UC +reporters, weighted and by distinct source household (R1b, R1d); the HMRC +band replay, the distributional-mass gate and the spine gates (R1a, R1d). + +### R1e. Downstream moves on the rebuilt treatment (control against R1d) + +_Rows matched by id, source id, channel and CGT-lane structure (every +household, person and benefit unit whose keys agree on both arms); every +statistic a weighted aggregate at the control +household weights over a channel's rows; the paired comparisons weight +copy and twin alike with the copy's weight. Scripts +`downstream_columns_840_v2.py`, `engine_aggregates_840.py`, +`paired_reports_840.py` and `paired_screen_840.py` (session scratchpad), outputs +beside the twins._ + +**FRS-channel rows.** The FRS rows move only through frame-level stages after +stage 17, by five mechanisms, none on a cash or reported column except the +salary-sacrifice conversion: + +| Mechanism | Columns (FRS rows moved) | Net change of the FRS channel's total | +|---|---|---| +| The CGT lane re-ranks gains over the frame as the SPI rows' investment incomes and wealth draws rise | `capital_gains` (a fifth of FRS persons), `capital_gains_badr` (0.5 %), `capital_gains_residential_property` (1 %), `cgt_residential_probability` (2 %), `cgt_support_copies` (under 0.1 % of households) | gains −21.9 % (£33.5bn to £26.3bn at own weights over the full tables; SPI rows £86.2bn to £92.6bn; all rows −0.7 %); engine capital gains tax −21.8 % on FRS rows, +7.2 % on SPI rows, −0.5 % in all | +| The energy and fuel rakes re-target the frame | `electricity_consumption` (0.89 of FRS households), `gas_consumption` (0.86), `domestic_energy_consumption` (0.97), `housing_water_and_electricity_consumption` (0.97), `petrol_spending` (0.54), `diesel_spending` (0.24), `transport_consumption` (0.73), `full_rate_vat_expenditure_rate` (0.12) | electricity −1.5 %, gas −1.2 %, domestic energy −1.4 %, housing-water-electricity −0.4 % (row moves of about ±3.5 % in both directions); petrol and diesel +1.9 % and transport +0.4 % by one factor on every row; the VAT rate 0.0 % net; engine fuel duty +1.9 %, VAT −0.05 % | +| The salary-sacrifice conversion rate (the stage's headcount target counts the SPI rows' predicted sacrifice) | `pension_contributions_via_salary_sacrifice` (2.4 % of FRS persons); `employment_income`, `employee_pension_contributions`, `salary_sacrifice_pre_conversion_pay` (0.9 % each) | converted persons 2.80m to 3.05m; pay −0.12 % (£558.4bn to £557.8bn), employee contributions −3.7 %, sacrificed contributions +3.0 %; engine income tax −0.03 %, NI −0.11 % | +| The CGT mass moves between the arms | `household_weight` (0.98 of FRS households) | FRS mass 16.860m to 16.867m; 97.3 % of the mass within ±1 %, 98.5 % within ±4 %, 1.5 % beyond | +| The take-up residual draws | `would_claim_child_benefit`, `child_benefit_opts_out`, `would_claim_pc` (under 0.2 % of FRS units each); `student_loan_plan` (<10 persons) | −0.13 %, −2.2 %, +0.09 %; engine child benefit −0.5 %, pension credit +0.2 %, Universal Credit +0.0006 % | + +The FRS channel's engine net income moves −0.6 %, the gains; income tax, NI, +VAT and the benefits move under 0.2 % except fuel duty and capital gains tax +above. + +**SPI-channel rows, the income leaves** (the adults in the stage domain +against their twins, copy weights; the twin is the composition +yardstick, the tape the magnitude yardstick): + +| Leaf | Share positive: twin / copy control / copy rebuilt | Mean per adult: twin / copy control / copy rebuilt | +|---|---|---| +| Pay | 0.583 / 0.742 / 0.587 | £24.3k / £27.6k / £25.3k | +| Self-employment | 0.090 / 0.099 / 0.089 | £2.75k / £2.72k / £3.12k | +| Private pension | 0.133 / 0.174 / 0.170 | £1.84k / £2.28k / £2.56k | +| Savings interest | 0.452 / 0.373 / 0.375 | £351 / £384 / £519 | +| Dividends | 0.054 / 0.095 / 0.090 | £128 / £1,949 / £2,153 | +| Property | 0.036 / 0.049 / 0.046 | £291 / £572 / £628 | +| State pension (reported) | 0.115 / 0.112 / 0.114 | £1,274 / £1,291 / £1,304 | + +Who earns now follows the twin (0.587 against 0.583; control 0.742). The +positive shares of the other leaves are the tape's class probabilities given +the bridge (the transport preserves the rank; the gate's zero mass is the +tape's), so savings interest stays under the twins' share and dividends and +property above it; the magnitudes are the tape's conditional on the bridge, +which lifts the investment leaves 10-50 % over the control (pensioner and +investment-main-source cells now draw from their own tape conditionals +instead of the cell marginal). Among earners the pay bands are the tape's: +22.5 % under £12,570, 22.7 % at £12,570-25,000, 32.3 % at £25,000-50,000, +15.4 % at £50,000-100,000 and 7.1 % above, against the twins' 10.4 / 21.0 / +43.6 / 19.9 / 5.1 % (control copies 22.9 / 25.4 / 34.1 / 12.9 / 4.7 %): the +low tail is the annual tax-record concept (R1c), unchanged from the control; +the top tail is heavier than the control's. Over all SPI rows pay −6.9 %, +self-employment +12 %, private pension +15 %, interest +37 %, dividends ++19 %, property +25 %; the HMRC aggregates follow +(`hmrc_spi_total_investment_income` +20 %, `hmrc_spi_total_earned_income` +−3.5 %, `hmrc_spi_assessable_income` −1.3 %). + +**SPI-channel rows, reports and flags** (stage 2 and the SPI-row stages after +it; copies against twins, share reporting or flagged): + +| Column | Twin | Copy control | Copy rebuilt | Lone parents twin / rebuilt | Singles twin / rebuilt | +|---|---|---|---|---|---| +| `universal_credit_reported` | 0.107 | 0.061 | 0.108 | 0.404 / 0.372 | 0.100 / 0.099 | +| `pip_dl_reported` | 0.066 | 0.039 | 0.075 | 0.071 / 0.074 | 0.097 / 0.099 | +| `pip_m_reported` | 0.052 | 0.031 | 0.058 | 0.054 / 0.054 | 0.076 / 0.075 | +| `carers_allowance_reported` | 0.021 | 0.015 | 0.026 | 0.063 / 0.072 | 0.012 / 0.018 | +| `housing_benefit_reported` | 0.023 | 0.010 | 0.019 | 0.008 / 0.009 | 0.046 / 0.035 | +| `esa_contrib_reported` | 0.009 | 0.004 | 0.010 | 0.007 / 0.007 | 0.008 / 0.009 | +| `pension_credit_reported` | 0.011 | 0.006 | 0.006 | 0.000 / 0.000 | 0.024 / 0.014 | +| `council_tax_benefit_reported` | 0.065 | 0.053 | 0.056 | 0.133 / 0.105 | 0.104 / 0.086 | +| `child_benefit_reported` | 0.138 | 0.138 | 0.136 | 0.637 / 0.396 | 0.000 / 0.057 | +| `is_disabled_for_benefits` | 0.096 | 0.063 | 0.100 | 0.095 / 0.093 | 0.148 / 0.141 | +| `receives_benefits_in_own_right` | 0.130 | 0.064 | 0.115 | 0.409 / 0.376 | 0.137 / 0.105 | +| `would_claim_uc` (benefit units) | 0.480 | 0.489 | 0.496 | 0.755 / 0.737 | 0.415 / 0.431 | + +The reports land on the twins' shares where the control sat 40-60 % under +them. Two residuals are stage 2's, not the draw's: on the drawn copies +(0.86 of the domain's rows, 82 % of its weight) it imputes disability and carer +reports above the twins' (PIP 0.035 against 0.025, carers 0.012 against +0.006, as on the control's copies), and it gives child benefit to 5.7 % of +childless singles' copies (8.0 % on the control) and to 0.40 of lone +parents' copies against 0.64 of their twins. The undrawn copies (0.14 of the +rows, 18 % of the weight; almost all by the rule, the rest drawn copies that +happen to equal their twins) carry their twins' reports except where +`spi_benefit_coherence` and the take-up stage rewrite them (UC 0.322 against +0.351, `receives_benefits_in_own_right` 0.348 against 0.459, council tax +benefit 0.082 against 0.123), the exemption the plan's step 6 holds for +review. + +**SPI-channel households, the draws after stage 17** (per SPI household, +control to rebuilt; FRS households in brackets). The WAS wealth draws follow +the investment incomes up: net financial wealth £125k to £154k (£101k), gross +financial wealth £131k to £159k (£106k), savings £26.1k to £32.4k (£22.3k), +corporate wealth £39.4k to £53.5k (£33.2k), stocks-and-shares ISA £17.6k to +£21.9k (£14.9k), other residential property £40.3k to £48.7k (£27.0k); +property wealth £253k to £258k (£222k) and private pension wealth £178k to +£184k (£172k) barely; consumer debt £4.82k to £4.35k (£3.72k). The housing +shell: renters 0.318 to 0.362 (0.331) with rent £3.04k to £3.36k (£2.96k), +mortgage interest £2.02k to £1.94k (£1.35k), council tax −0.5 %. The LCFS +consumption draws move 0-5 % toward the FRS level (clothing £1.19k to £1.13k, +communication £882 to £847, transport £7.25k to £7.04k, food £3.85k to +£3.76k; FRS £1.04k, £766, £6.09k, £3.71k); energy +2 % (electricity £1.03k +to £1.05k; £994); vehicles 1.18 to 1.12 (1.09); the NTS bus draws +4-7 %. +Recorded capital (`uc_reported_capital`) £78.0k to £83.3k per unit (£44.1k). +The SPI rows' CGT-lane weights move more than the FRS rows' (80 % of the mass +within ±1 %, 10 % beyond ±4 %). + +**Engine aggregates by channel** (calendar 2025, each arm's own weights, the +full tables): + +| Variable | FRS control → rebuilt | SPI control → rebuilt | +|---|---|---| +| Employment income | £594.8bn → £594.2bn | £657.0bn → £610.7bn | +| Self-employment income | £66.2bn | £72.7bn → £82.2bn | +| Savings interest | £12.5bn | £11.7bn → £15.4bn | +| Dividends | £5.3bn | £60.2bn → £65.7bn | +| Property income | £10.0bn | £15.7bn → £18.5bn | +| Income tax | £148.9bn → £148.8bn | £205.0bn → £222.5bn | +| National insurance | £27.5bn → £27.4bn | £26.8bn → £24.8bn | +| Capital gains tax | £7.4bn → £5.8bn | £20.7bn → £22.2bn | +| Universal Credit | £36.18bn → £36.18bn | £18.4bn → £36.5bn | +| PIP | £14.2bn | £6.7bn → £11.9bn | +| Carer's allowance | £2.18bn | £1.28bn → £2.18bn | +| Housing benefit | £5.96bn | £0.74bn → £1.11bn | +| Pension credit | £4.16bn → £4.17bn | £0.42bn → £0.51bn | +| Child benefit | £7.07bn → £7.04bn | £6.35bn → £6.32bn | +| Household net income | £946.3bn → £940.7bn | £840.9bn → £835.8bn | + +SPI income tax rises 8.6 % while SPI pay falls 7 %: the pay mass now sits on +the 0.44 of adults who earn (control 0.55) at the tape's main-source-pay +magnitudes, and the investment leaves rise; income tax per unit on the copies +is 1.49 times the twins' (control 1.38). The design-weight levels are not the +calibrated ones; the direction is the tape's. + +**Universal Credit, copies against twin units** (engine; copy weights; +working-age units in brackets): + +| Family | Screened: twin / copy control / copy rebuilt | Recipients: twin / control / rebuilt | Mean award per unit: twin / control / rebuilt | +|---|---|---|---| +| Lone parents | 0.649 / 0.547 / 0.666 | 0.582 / 0.449 / 0.584 | £9,135 / £5,458 / £9,357 | +| Couples with children | 0.254 / 0.262 / 0.302 | 0.181 / 0.175 / 0.223 | £2,422 / £1,600 / £2,891 | +| Singles without children (working-age in brackets) | 0.283 / 0.188 / 0.331 (0.356 / 0.236 / 0.415) | 0.186 / 0.124 / 0.214 (0.233 / 0.156 / 0.269) | £1,591 / £673 / £1,690 (£1,996 / £846 / £2,120) | +| Couples without children | 0.098 / 0.078 / 0.135 | 0.062 / 0.045 / 0.091 | £604 / £308 / £736 | +| All | 0.289 / 0.223 / 0.331 | 0.208 / 0.156 / 0.237 | £2,403 / £1,301 / £2,585 | + +Lone parents land on their twins. The childless units and the couples with +children pass the screen 17-37 % more often than their twins and receive +15-48 % more often: the imported low-pay tail (22.5 % of earning copies under +£12,570 against 10.4 % of their twins), where a copy of a low or mid earner, +or of the second earner of a couple, falls below the taper more often than +its twin. Over all units the copies receive 14 % more often and 8 % more per +unit than the twins (the control: 25 % less often, 46 % less). By channel at +design weights the SPI channel's UC recipients per unit are now 1.00 (lone +parents), 1.07 (couples with children), 1.58 (singles) and 1.35 (couples +without children) times the FRS channel's (control 0.77, 0.83, 0.92, 0.67); +the childless cells of the national UC surface and the award bands are the +sibling watch for the full build (R2). + +**Reading.** No column moves against its mechanism's direction. Three +magnitudes to hold in view: the childless units' screen above their twins +(the tape's annual pay concept, exposed now that who earns follows the twin); +the investment leaves and the wealth draws 10-50 % above the control on SPI +rows, with the CGT lane moving a fifth of the FRS channel's gains to SPI rows +at design weights; and the stage-2 disability and carer over-imputation on +drawn copies, a stage-2 residual the no-record rule narrows at the domain +level. + +### R1f. Twins on the #1200 base (13 October) + +Control: #1200's branch `uk-data-ports-1095-3` at `a50ffba5e` (it carries +#1145 and #1198). Treatment: this branch rebased on that commit, with the +three integration items the rebase exposed (the recipient flag the landlord +stage reads, the finance-costs leaf on identity uniforms, the gainful +self-employment refresh on the root's whole rule). Same inputs, engine +(policyengine-uk 2.123.0) and seed; 13 and 27 minutes (the second beside a +fixture regeneration). All 37 spine gates pass on both arms, including +`uk_stage_property_components` and `uk_stage_spi_benefit_coherence`. Rows +matched as in R1e. The receipts of R1b to R1e +reproduce within a point or two; the differences below are the base's. + +**The award screen** (all units; FRS / SPI control / SPI rebuilt): lone +parents 0.634 / 0.532 / 0.636; couples with children 0.274 / 0.238 / 0.281; +singles without children 0.200 / 0.184 / 0.322; couples without children +0.093 / 0.073 / 0.123. Lone-parent UC reporters 0.827m FRS, SPI 0.584m to +0.779m, the SPI channel's distinct source households rising from 0.45 to +0.60 of the FRS channel's; couples with children 0.376m, SPI 0.229m to 0.408m +(0.49 to 0.85); singles 1.094m, SPI 0.434m to 1.012m (0.33 to 0.73). Full-time +employees with pay 0.979 against 0.983 on FRS rows; full-time self-employed +with trade 0.908 against 0.908. + +**Copies against their twins** (share, twin / copy control / copy rebuilt): +earners 0.583 / 0.743 / 0.587; UC reported 0.107 / 0.062 / 0.111 (lone +parents 0.404 / 0.277 / 0.375; singles 0.100 / 0.045 / 0.106); PIP daily +living 0.066 / 0.040 / 0.075; carer's allowance 0.021 / 0.016 / 0.026; +housing benefit 0.023 / 0.010 / 0.019. Undrawn copies 0.14 of the domain's rows, +18.3 % of its weight. Engine, per unit (twin / copy control / copy rebuilt): +lone parents screened 0.646 / 0.540 / 0.648, receiving 0.581 / 0.454 / +0.575, award £9,110 / £5,412 / £9,159; couples with children screened 0.241 +/ 0.248 / 0.291, receiving 0.178 / 0.172 / 0.221; singles screened 0.280 / +0.187 / 0.329, receiving 0.184 / 0.116 / 0.220; couples without children +screened 0.090 / 0.076 / 0.128, receiving 0.057 / 0.047 / 0.085; all units +screened 0.283 / 0.219 / 0.325, receiving 0.206 / 0.152 / 0.238, award +£2,385 / £1,263 / £2,577; income tax per unit £8,746 / £11,990 / £12,960. +By channel the SPI channel's UC recipients per unit are 0.99 (lone +parents), 1.08 (couples with children), 1.64 (singles) and 1.34 (couples +without children) times the FRS channel's (control 0.79, 0.83, 0.87, 0.74). + +**Engine aggregates by channel** (own weights; control to rebuilt): SPI +Universal Credit £17.9bn to £36.4bn (FRS £35.9bn), PIP £6.7bn to £11.9bn +(FRS £14.2bn), carer's allowance £1.28bn to £2.18bn (FRS £2.18bn), housing +benefit £0.77bn to £1.19bn (FRS £5.95bn), pension credit £0.39bn to +£0.47bn; SPI income tax £204.4bn to £221.8bn (+8.5 %), national insurance +−7.4 %, employment income −7.0 %, self-employment +13 %, savings interest ++32 %, dividends +9 %, property income +18 %; FRS income tax −0.03 %, +national insurance −0.10 %, VAT −0.04 %, fuel duty +1.8 %, child benefit +−0.5 %, pension credit +0.7 %; capital gains tax FRS £7.24bn to £6.00bn +(−17 %), SPI £20.75bn to £21.61bn (+4 %); household net income FRS −0.5 %, +SPI −0.8 %. + +**FRS-channel rows** move as in R1e, plus one mechanism the merged base +adds: `property_rental_income` (4 % of FRS persons, −6.2 % of the FRS +channel's total), because `property_components` ranks both channels' +landlords by profit against the PRIS bands, so the SPI rows' redrawn +property incomes move the FRS landlords' places. The rest: the CGT lane +(`capital_gains` on a fifth of FRS persons, −15.9 %; `capital_gains_badr` −25 %; +`capital_gains_residential_property` +18 %; `cgt_residential_probability` +−5 %), the energy and fuel rakes (electricity −1.5 %, gas −1.3 %, domestic +energy −1.4 %, petrol +1.8 %, diesel +1.9 %, transport +0.4 %), the +salary-sacrifice conversion (0.9 % of FRS persons; converted 2.78m to 3.03m; pay +−0.10 %, employee contributions −3.2 %, sacrificed +4.5 %), the CGT mass +moves on `household_weight` (97.4 % of the FRS mass within ±1 %, 1.4 % +beyond ±4 %), the take-up residual draws (`would_claim_pc`, +`would_claim_child_benefit`, `child_benefit_opts_out`, under 0.3 % of FRS +units each) and, new on this base, the LCFS consumption columns on under +0.2 % of FRS households at under 0.1 % of their totals. The SPI rows' leaves and the draws after +stage 17 move as in R1e (pay −6.9 %, self-employment +12 %, private pension ++16 %, interest +37 %, dividends +19 %, property +26 %; net financial +wealth £125k to £154k per SPI household against £101k on FRS households). + +## R2. Full local build + +_One build at the latest run's configuration on the merged head (plan of +2026-10-12). R1f was measured on #1200's head (`a50ffba5e`); the branch now +sits on `main` after #1260._