diff --git a/changelog.d/ar-liheap.added.md b/changelog.d/ar-liheap.added.md new file mode 100644 index 00000000000..e235554b14d --- /dev/null +++ b/changelog.d/ar-liheap.added.md @@ -0,0 +1 @@ +Add Arkansas LIHEAP income limits, countable income, and regular heating payment tables. diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_disregard.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_disregard.yaml new file mode 100644 index 00000000000..65170212bea --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_disregard.yaml @@ -0,0 +1,13 @@ +description: Arkansas excludes this share of earned income under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 0.2 + +metadata: + unit: /1 + period: year + label: Arkansas LIHEAP earned income disregard + reference: + - title: Arkansas FY2026 State Plan, Section 1.8 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=5 + - title: Arkansas FY2025 State Plan, Section 1.8 + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=5 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_minimum_age.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_minimum_age.yaml new file mode 100644 index 00000000000..64f856b85a5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/earned_minimum_age.yaml @@ -0,0 +1,21 @@ +description: Arkansas excludes the earned income of household members younger than this age under the Low Income Home Energy Assistance Program. +# Application Section III (FY2025 form R 01/FY2025 and current form R 11/2025) +# requests work income only from members 18 and older, and the accepted plans +# leave a child's earnings unchecked. Full-time students of any age are +# excluded in the formula. +values: + 2024-10-01: 18 + +metadata: + unit: year + period: year + label: Arkansas LIHEAP earned income minimum age + reference: + - title: Arkansas LIHEAP application, section III + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2 + - title: Arkansas LIHEAP application AEO 9495 R 01/FY2025, Section III (Wayback capture) + href: https://web.archive.org/web/20250104155015/https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2 + - title: Arkansas FY2026 LIHEAP State Plan, section 1.9 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=6 + - title: Arkansas FY2025 LIHEAP State Plan, section 1.9 + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/interest_disregard.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/interest_disregard.yaml new file mode 100644 index 00000000000..071d82a0002 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/interest_disregard.yaml @@ -0,0 +1,18 @@ +description: Arkansas excludes this monthly amount of each member's interest from countable income under the Low Income Home Energy Assistance Program. +# Manual Appendix F (page 137) counts interest only as the "amount over +# $200.00". Unearned income is what is received in the month before application +# (Section 4.7, page 41; Appendix E, pages 129-130, converts other frequencies +# to monthly), so the amount is monthly. The manual does not say whose $200 it +# is; applying it to each recipient is a chosen reading, and a household-wide +# $200 would count more. Plan Section 1.9 (page 6) counts "Interest, dividends, +# or royalties" with no threshold; the manual is followed. +values: + 2024-10-01: 200 + +metadata: + unit: currency-USD + period: month + label: Arkansas LIHEAP interest income disregard + reference: + - title: Arkansas LIHEAP draft manual FY2025, Appendix F, Interest + href: https://liheapch.acf.gov/sites/default/files/webfiles/docs/2025/manuals/AR_Manual%5Bdraft%5D_2025.pdf#page=137 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/additional_member_amount.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/additional_member_amount.yaml new file mode 100644 index 00000000000..f26ac0b9529 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/additional_member_amount.yaml @@ -0,0 +1,17 @@ +description: Arkansas sets this amount as the monthly income limit increase per additional household member under the Low Income Home Energy Assistance Program. +# The charts print these amounts for each member above the largest published +# size. Half-up rounding of 150% of the FY2025 guideline increment ($672.50) +# would give $673, so the printed amounts are stored rather than derived. +values: + 2024-10-01: 672 + 2025-10-01: 688 + +metadata: + unit: currency-USD + period: month + label: Arkansas LIHEAP additional member income limit amount + reference: + - title: Arkansas FY2026 Income Eligibility Chart, additional-person instruction + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 Income Eligibility Chart, additional-person instruction + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_rate.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_rate.yaml new file mode 100644 index 00000000000..a6aa86e0bfa --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_rate.yaml @@ -0,0 +1,17 @@ +description: Arkansas limits countable income to this multiple of the federal poverty guideline for households above the state median income size limit under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 1.5 + +metadata: + unit: /1 + period: year + label: Arkansas LIHEAP federal poverty guideline rate + reference: + - title: Arkansas FY2026 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=9 + - title: Arkansas FY2026 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=8 + - title: Arkansas FY2025 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_year_lag.yaml new file mode 100644 index 00000000000..826bc323b1b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/fpg_year_lag.yaml @@ -0,0 +1,16 @@ +description: Arkansas uses the federal poverty guideline from this many years before the benefit year under the Low Income Home Energy Assistance Program. +# The FY2025 and FY2026 published thresholds match the 2024 and 2025 federal +# poverty guidelines. Other years use their corresponding guideline year but +# are unverified. +values: + 2024-10-01: 1 + +metadata: + unit: year + period: year + label: Arkansas LIHEAP federal poverty guideline year lag + reference: + - title: Arkansas FY2026 Income Eligibility Chart, poverty guideline rows reproduced by the 2025 federal poverty guidelines + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 Income Eligibility Chart, poverty guideline rows reproduced by the 2024 federal poverty guidelines + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/max_table_size.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/max_table_size.yaml new file mode 100644 index 00000000000..4abd092ff0f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/max_table_size.yaml @@ -0,0 +1,13 @@ +description: Arkansas sets income limits through this household size, with a fixed monthly amount for each additional member, under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 20 + +metadata: + unit: person + period: year + label: Arkansas LIHEAP maximum published income limit household size + reference: + - title: Arkansas FY2026 Income Eligibility Chart, additional-person instruction + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 Income Eligibility Chart, additional-person instruction + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/rounding_increment.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/rounding_increment.yaml new file mode 100644 index 00000000000..ee8c0eb4e4a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/rounding_increment.yaml @@ -0,0 +1,16 @@ +description: Arkansas uses this increment to round monthly income limits under the Low Income Home Energy Assistance Program. +# Half-up rounding of the monthly base limit reproduces every FY2025 and FY2026 +# row for sizes 1 to 20. This is a reconciled numerical pattern, not an express +# rounding instruction. +values: + 2024-10-01: 1 + +metadata: + unit: currency-USD + period: month + label: Arkansas LIHEAP monthly income limit rounding increment + reference: + - title: Arkansas FY2026 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_max_size.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_max_size.yaml new file mode 100644 index 00000000000..c066f95dcb3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_max_size.yaml @@ -0,0 +1,21 @@ +description: Arkansas uses state median income for households up to this size under the Low Income Home Energy Assistance Program. +values: + # FY2025 plan Section 2.1: sizes 1-6 use state median income, size 7 and up + # use the HHS poverty guidelines. + 2024-10-01: 6 + # FY2026 plan Section 2.1: sizes 1-7 use state median income. + 2025-10-01: 7 + +metadata: + unit: person + period: year + label: Arkansas LIHEAP maximum state median income household size + reference: + - title: Arkansas FY2026 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=9 + - title: Arkansas FY2026 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=8 + - title: Arkansas FY2025 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_rate.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_rate.yaml new file mode 100644 index 00000000000..4a9216f3ace --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/limit/smi_rate.yaml @@ -0,0 +1,17 @@ +description: Arkansas limits countable income to this share of state median income for households within the state median income size limit under the Low Income Home Energy Assistance Program. +values: + 2024-10-01: 0.6 + +metadata: + unit: /1 + period: year + label: Arkansas LIHEAP state median income rate + reference: + - title: Arkansas FY2026 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=9 + - title: Arkansas FY2026 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - title: Arkansas FY2025 State Plan, Section 2.1 + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=8 + - title: Arkansas FY2025 Income Eligibility Chart + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/earned.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/earned.yaml new file mode 100644 index 00000000000..75386d9c94b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/earned.yaml @@ -0,0 +1,32 @@ +description: Arkansas uses these sources as earned income under the Low Income Home Energy Assistance Program. +# Existing net business income approximates gross receipts; no additional +# business-expense deduction or new gross-receipts input is modeled. +# Active and passive partnership income cannot be separated by existing inputs. +values: + 2024-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + # Manual Appendix F (page 141) treats rental property as a self-employment + # enterprise, so rental income, including farm rent, takes the earned + # disregard. Plan Section 1.8 (page 5) subtracts 20% from work income only + # and Section 1.9 (page 6) lists rental income as its own item; the manual + # is followed. + - rental_income + - farm_rent_income + +metadata: + unit: list + period: year + label: Arkansas LIHEAP earned income sources + reference: + - title: Arkansas FY2026 State Plan, Section 1.9 + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=6 + - title: "Arkansas FY2025 State Plan, Section 1.9 #page 5-6" + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=5 + - title: Arkansas LIHEAP Application, Section III Household Income + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2 + - title: Arkansas LIHEAP draft manual FY2025, Appendix F, Rental property + href: https://liheapch.acf.gov/sites/default/files/webfiles/docs/2025/manuals/AR_Manual%5Bdraft%5D_2025.pdf#page=141 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/unearned.yaml new file mode 100644 index 00000000000..da5bab942b8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/income/sources/unearned.yaml @@ -0,0 +1,54 @@ +description: Arkansas uses these sources as unearned income under the Low Income Home Energy Assistance Program. +# Each source is floored at zero in the income formula, so a loss in one source +# cannot offset other income. The formula also counts Social Security and +# railroad retirement net of the Medicare Part B premium, interest above the +# monthly disregard, and TEA. Rental income is in the earned list. +# Where the plan and the FY2025 draft manual differ, the manual is followed. +# Counted loans, jury duty, royalties and foster care receipts lack +# sufficiently specific inputs and are not represented here. +values: + 2024-10-01: + - total_unemployment_compensation + - strike_benefits + - ssi + # Military retirement pay is a separate input from the pension inputs that + # pension_income adds, so both are listed; a household reports the amount + # in one or the other (manual Appendix F, page 141). + - pension_income + - military_retirement_pay + # Non-Social-Security survivor receipts. + - survivor_benefits + - alimony_income + - child_support_received + - ordinary_dividend_income + - veterans_benefits + # Cash gifts from friends and relatives outside the household. + - financial_assistance + # Manual Appendices E (page 130) and F (page 144) and the application + # (page 2) count workers' compensation; plan Section 1.9 leaves "Insurance + # payments made directly to the insured" unchecked. + - workers_compensation + # Manual Appendix F (page 135) counts all gaming or gambling winnings. Plan + # Section 1.9 (page 7) counts lottery winnings as the only one-time lump + # sum, and manual page 138 excludes nonrecurring lump sums; the Appendix F + # row is followed. + - gambling_winnings + # Manual Appendix F (page 132) counts capital gains and excludes capital + # losses. Plan Section 1.9 (page 7) counts no one-time lump sum other than + # lottery winnings, and manual page 138 excludes nonrecurring lump sums, + # including the sale of personal property; the Appendix F row is followed. + - capital_gains + +metadata: + unit: list + period: year + label: Arkansas LIHEAP unearned income sources + reference: + - title: "Arkansas FY2026 State Plan, Section 1.9 #page 6-7" + href: https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=6 + - title: "Arkansas FY2025 State Plan, Section 1.9 #page 5-7" + href: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=5 + - title: "Arkansas LIHEAP draft manual FY2025, Appendices E and F #page 130-133,135,138,140-141,143-144" + href: https://liheapch.acf.gov/sites/default/files/webfiles/docs/2025/manuals/AR_Manual%5Bdraft%5D_2025.pdf#page=130 + - title: Arkansas LIHEAP Application, Section III Household Income + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml new file mode 100644 index 00000000000..515b1313e43 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml @@ -0,0 +1,26 @@ +description: Arkansas uses these household size group boundaries for the regular heating benefit under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 1 + - threshold: + 2024-10-01: 3 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 5 + amount: + 2024-10-01: 3 + +metadata: + type: single_amount + threshold_unit: person + amount_unit: /1 + period: year + label: Arkansas LIHEAP payment household size group + reference: + - title: Arkansas FY2026 Benefits Matrix, household size columns common to all fuel schedules + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1 + - title: Arkansas FY2025 Benefits Matrix, household size columns common to all fuel schedules + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml new file mode 100644 index 00000000000..eb56a8db58a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml @@ -0,0 +1,178 @@ +description: Arkansas uses these monthly countable income band boundaries for the regular heating benefit under the Low Income Home Energy Assistance Program. +# Published lower bounds are inclusive and apply to monthly countable income +# rounded to the nearest whole dollar. Bands with one threshold entry apply in +# both FY2025 and FY2026; the top five lower bounds changed in FY2026. +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 1 + - threshold: + 2024-10-01: 70 + amount: + 2024-10-01: 2 + - threshold: + 2024-10-01: 130 + amount: + 2024-10-01: 3 + - threshold: + 2024-10-01: 190 + amount: + 2024-10-01: 4 + - threshold: + 2024-10-01: 250 + amount: + 2024-10-01: 5 + - threshold: + 2024-10-01: 310 + amount: + 2024-10-01: 6 + - threshold: + 2024-10-01: 370 + amount: + 2024-10-01: 7 + - threshold: + 2024-10-01: 430 + amount: + 2024-10-01: 8 + - threshold: + 2024-10-01: 490 + amount: + 2024-10-01: 9 + - threshold: + 2024-10-01: 550 + amount: + 2024-10-01: 10 + - threshold: + 2024-10-01: 610 + amount: + 2024-10-01: 11 + - threshold: + 2024-10-01: 670 + amount: + 2024-10-01: 12 + - threshold: + 2024-10-01: 730 + amount: + 2024-10-01: 13 + - threshold: + 2024-10-01: 790 + amount: + 2024-10-01: 14 + - threshold: + 2024-10-01: 850 + amount: + 2024-10-01: 15 + - threshold: + 2024-10-01: 910 + amount: + 2024-10-01: 16 + - threshold: + 2024-10-01: 970 + amount: + 2024-10-01: 17 + - threshold: + 2024-10-01: 1_030 + amount: + 2024-10-01: 18 + - threshold: + 2024-10-01: 1_090 + amount: + 2024-10-01: 19 + - threshold: + 2024-10-01: 1_150 + amount: + 2024-10-01: 20 + - threshold: + 2024-10-01: 1_210 + amount: + 2024-10-01: 21 + - threshold: + 2024-10-01: 1_270 + amount: + 2024-10-01: 22 + - threshold: + 2024-10-01: 1_330 + amount: + 2024-10-01: 23 + - threshold: + 2024-10-01: 1_390 + amount: + 2024-10-01: 24 + - threshold: + 2024-10-01: 1_450 + amount: + 2024-10-01: 25 + - threshold: + 2024-10-01: 1_510 + amount: + 2024-10-01: 26 + - threshold: + 2024-10-01: 1_570 + amount: + 2024-10-01: 27 + - threshold: + 2024-10-01: 1_630 + amount: + 2024-10-01: 28 + - threshold: + 2024-10-01: 1_690 + amount: + 2024-10-01: 29 + - threshold: + 2024-10-01: 1_750 + amount: + 2024-10-01: 30 + - threshold: + 2024-10-01: 1_870 + amount: + 2024-10-01: 31 + - threshold: + 2024-10-01: 1_990 + amount: + 2024-10-01: 32 + - threshold: + 2024-10-01: 2_010 + amount: + 2024-10-01: 33 + - threshold: + 2024-10-01: 2_130 + amount: + 2024-10-01: 34 + - threshold: + 2024-10-01: 2_250 + 2025-10-01: 2_348 + amount: + 2024-10-01: 35 + - threshold: + 2024-10-01: 2_945 + 2025-10-01: 3_071 + amount: + 2024-10-01: 36 + - threshold: + 2024-10-01: 4_330 + 2025-10-01: 3_793 + amount: + 2024-10-01: 37 + - threshold: + 2024-10-01: 5_022 + 2025-10-01: 4_515 + amount: + 2024-10-01: 38 + - threshold: + 2024-10-01: 5_140 + 2025-10-01: 5_237 + amount: + 2024-10-01: 39 + +metadata: + type: single_amount + threshold_unit: currency-USD + amount_unit: /1 + period: month + label: Arkansas LIHEAP monthly income band + reference: + - title: "Arkansas FY2026 Benefits Matrix, income bands common to all fuel schedules #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, income bands common to all fuel schedules #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml new file mode 100644 index 00000000000..634e598cf92 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml @@ -0,0 +1,342 @@ +description: Arkansas provides this regular heating benefit for households using electricity under the Low Income Home Energy Assistance Program. +# Cells with one entry apply in both FY2025 and FY2026. + +1: + 1: + 2024-10-01: 242 + 2: + 2024-10-01: 288 + 3: + 2024-10-01: 344 + +2: + 1: + 2024-10-01: 233 + 2: + 2024-10-01: 276 + 3: + 2024-10-01: 334 + +3: + 1: + 2024-10-01: 221 + 2: + 2024-10-01: 266 + 3: + 2024-10-01: 322 + +4: + 1: + 2024-10-01: 209 + 2: + 2024-10-01: 254 + 3: + 2024-10-01: 310 + +5: + 1: + 2024-10-01: 199 + 2: + 2024-10-01: 242 + 3: + 2024-10-01: 300 + +6: + 1: + 2024-10-01: 187 + 2: + 2024-10-01: 233 + 3: + 2024-10-01: 288 + +7: + 1: + 2024-10-01: 179 + 2: + 2024-10-01: 223 + 3: + 2024-10-01: 276 + +8: + 1: + 2024-10-01: 174 + 2: + 2024-10-01: 215 + 3: + 2024-10-01: 266 + +9: + 1: + 2024-10-01: 170 + 2: + 2024-10-01: 209 + 3: + 2024-10-01: 254 + +10: + 1: + 2024-10-01: 166 + 2: + 2024-10-01: 204 + 3: + 2024-10-01: 242 + +11: + 1: + 2024-10-01: 160 + 2: + 2024-10-01: 197 + 3: + 2024-10-01: 233 + +12: + 1: + 2024-10-01: 155 + 2: + 2024-10-01: 192 + 3: + 2024-10-01: 221 + +13: + 1: + 2024-10-01: 149 + 2: + 2024-10-01: 187 + 3: + 2024-10-01: 209 + +14: + 1: + 2024-10-01: 143 + 2: + 2024-10-01: 181 + 3: + 2024-10-01: 199 + +15: + 1: + 2024-10-01: 138 + 2: + 2024-10-01: 175 + 3: + 2024-10-01: 190 + +16: + 1: + 2024-10-01: 132 + 2: + 2024-10-01: 170 + 3: + 2024-10-01: 182 + +17: + 1: + 2024-10-01: 127 + 2: + 2024-10-01: 164 + 3: + 2024-10-01: 176 + +18: + 1: + 2024-10-01: 121 + 2: + 2024-10-01: 158 + 3: + 2024-10-01: 170 + +19: + 1: + 2024-10-01: 115 + 2: + 2024-10-01: 154 + 3: + 2024-10-01: 164 + +20: + 1: + 2024-10-01: 110 + 2: + 2024-10-01: 148 + 3: + 2024-10-01: 158 + +21: + 1: + 2024-10-01: 104 + 2: + 2024-10-01: 143 + 3: + 2024-10-01: 152 + +22: + 1: + 2024-10-01: 100 + 2: + 2024-10-01: 137 + 3: + 2024-10-01: 145 + +23: + 1: + 2024-10-01: 95 + 2025-10-01: 94 + 2: + 2024-10-01: 131 + 3: + 2024-10-01: 140 + +24: + 1: + 2024-10-01: 91 + 2025-10-01: 88 + 2: + 2024-10-01: 126 + 3: + 2024-10-01: 134 + +25: + 1: + 2024-10-01: 88 + 2025-10-01: 83 + 2: + 2024-10-01: 120 + 3: + 2024-10-01: 128 + +26: + 1: + 2024-10-01: 84 + 2025-10-01: 77 + 2: + 2024-10-01: 114 + 3: + 2024-10-01: 124 + +27: + 1: + 2024-10-01: 80 + 2025-10-01: 72 + 2: + 2024-10-01: 109 + 3: + 2024-10-01: 118 + +28: + 1: + 2024-10-01: 78 + 2025-10-01: 66 + 2: + 2024-10-01: 103 + 3: + 2024-10-01: 112 + +29: + 1: + 2024-10-01: 74 + 2025-10-01: 60 + 2: + 2024-10-01: 97 + 3: + 2024-10-01: 107 + +30: + 1: + 2024-10-01: 71 + 2025-10-01: 60 + 2: + 2024-10-01: 92 + 3: + 2024-10-01: 101 + +31: + 1: + 2024-10-01: 66 + 2025-10-01: 60 + 2: + 2024-10-01: 86 + 3: + 2024-10-01: 95 + +32: + 1: + 2024-10-01: 62 + 2025-10-01: 60 + 2: + 2024-10-01: 80 + 3: + 2024-10-01: 90 + +33: + 1: + 2024-10-01: 60 + 2: + 2024-10-01: 76 + 3: + 2024-10-01: 84 + +34: + 1: + 2024-10-01: 60 + 2: + 2024-10-01: 70 + 3: + 2024-10-01: 79 + +35: + 1: + 2024-10-01: 60 + 2: + 2024-10-01: 64 + 3: + 2024-10-01: 73 + +36: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 60 + 3: + 2024-10-01: 67 + +37: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 2025-10-01: 60 + 3: + 2024-10-01: 61 + +38: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 60 + +39: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 60 + +metadata: + unit: currency-USD + period: year + label: Arkansas LIHEAP electricity benefit matrix + propagate_metadata_to_children: true + breakdown: + - range(1, 40) + - range(1, 4) + breakdown_labels: + - Monthly countable income band + - Household size group + reference: + - title: "Arkansas FY2026 Benefits Matrix, Electricity #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, Electricity #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/fuel_oil.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/fuel_oil.yaml new file mode 100644 index 00000000000..b7a5f3c4478 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/fuel_oil.yaml @@ -0,0 +1,342 @@ +description: Arkansas provides this regular heating benefit for households using fuel oil under the Low Income Home Energy Assistance Program. +# Cells with one entry apply in both FY2025 and FY2026. + +1: + 1: + 2024-10-01: 402 + 2: + 2024-10-01: 478 + 3: + 2024-10-01: 570 + +2: + 1: + 2024-10-01: 385 + 2: + 2024-10-01: 457 + 3: + 2024-10-01: 552 + +3: + 1: + 2024-10-01: 365 + 2: + 2024-10-01: 442 + 3: + 2024-10-01: 534 + +4: + 1: + 2024-10-01: 347 + 2: + 2024-10-01: 422 + 3: + 2024-10-01: 514 + +5: + 1: + 2024-10-01: 330 + 2: + 2024-10-01: 402 + 3: + 2024-10-01: 497 + +6: + 1: + 2024-10-01: 310 + 2: + 2024-10-01: 385 + 3: + 2024-10-01: 478 + +7: + 1: + 2024-10-01: 296 + 2: + 2024-10-01: 370 + 3: + 2024-10-01: 457 + +8: + 1: + 2024-10-01: 288 + 2: + 2024-10-01: 356 + 3: + 2024-10-01: 442 + +9: + 1: + 2024-10-01: 282 + 2: + 2024-10-01: 347 + 3: + 2024-10-01: 422 + +10: + 1: + 2024-10-01: 275 + 2: + 2024-10-01: 337 + 3: + 2024-10-01: 402 + +11: + 1: + 2024-10-01: 265 + 2: + 2024-10-01: 326 + 3: + 2024-10-01: 385 + +12: + 1: + 2024-10-01: 257 + 2: + 2024-10-01: 319 + 3: + 2024-10-01: 365 + +13: + 1: + 2024-10-01: 247 + 2: + 2024-10-01: 310 + 3: + 2024-10-01: 347 + +14: + 1: + 2024-10-01: 238 + 2: + 2024-10-01: 301 + 3: + 2024-10-01: 330 + +15: + 1: + 2024-10-01: 228 + 2: + 2024-10-01: 292 + 3: + 2024-10-01: 313 + +16: + 1: + 2024-10-01: 220 + 2: + 2024-10-01: 282 + 3: + 2024-10-01: 302 + +17: + 1: + 2024-10-01: 210 + 2: + 2024-10-01: 272 + 3: + 2024-10-01: 293 + +18: + 1: + 2024-10-01: 200 + 2: + 2024-10-01: 264 + 3: + 2024-10-01: 282 + +19: + 1: + 2024-10-01: 192 + 2: + 2024-10-01: 254 + 3: + 2024-10-01: 272 + +20: + 1: + 2024-10-01: 182 + 2: + 2024-10-01: 245 + 3: + 2024-10-01: 262 + +21: + 1: + 2024-10-01: 173 + 2: + 2024-10-01: 236 + 3: + 2024-10-01: 252 + +22: + 1: + 2024-10-01: 166 + 2: + 2024-10-01: 227 + 3: + 2024-10-01: 241 + +23: + 1: + 2024-10-01: 158 + 2: + 2024-10-01: 217 + 3: + 2024-10-01: 233 + +24: + 1: + 2024-10-01: 151 + 2: + 2024-10-01: 209 + 3: + 2024-10-01: 223 + +25: + 1: + 2024-10-01: 145 + 2: + 2024-10-01: 199 + 3: + 2024-10-01: 214 + +26: + 1: + 2024-10-01: 140 + 2: + 2024-10-01: 190 + 3: + 2024-10-01: 204 + +27: + 1: + 2024-10-01: 134 + 2: + 2024-10-01: 180 + 3: + 2024-10-01: 196 + +28: + 1: + 2024-10-01: 128 + 2: + 2024-10-01: 172 + 3: + 2024-10-01: 186 + +29: + 1: + 2024-10-01: 124 + 2: + 2024-10-01: 162 + 3: + 2024-10-01: 176 + +30: + 1: + 2024-10-01: 118 + 2: + 2024-10-01: 152 + 3: + 2024-10-01: 168 + +31: + 1: + 2024-10-01: 110 + 2: + 2024-10-01: 144 + 3: + 2024-10-01: 158 + +32: + 1: + 2024-10-01: 103 + 2: + 2024-10-01: 134 + 3: + 2024-10-01: 149 + +33: + 1: + 2024-10-01: 96 + 2: + 2024-10-01: 125 + 3: + 2024-10-01: 140 + +34: + 1: + 2024-10-01: 89 + 2: + 2024-10-01: 116 + 3: + 2024-10-01: 131 + +35: + 1: + 2024-10-01: 82 + 2: + 2024-10-01: 107 + 2025-10-01: 108 + 3: + 2024-10-01: 121 + 2025-10-01: 122 + +36: + 1: + 2024-10-01: 74 + 2025-10-01: 0 + 2: + 2024-10-01: 97 + 2025-10-01: 98 + 3: + 2024-10-01: 112 + 2025-10-01: 113 + +37: + 1: + 2024-10-01: 67 + 2025-10-01: 0 + 2: + 2024-10-01: 88 + 2025-10-01: 90 + 3: + 2024-10-01: 102 + 2025-10-01: 104 + +38: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 78 + 2025-10-01: 0 + 3: + 2024-10-01: 92 + 2025-10-01: 95 + +39: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 83 + 2025-10-01: 86 + +metadata: + unit: currency-USD + period: year + label: Arkansas LIHEAP fuel oil benefit matrix + propagate_metadata_to_children: true + breakdown: + - range(1, 40) + - range(1, 4) + breakdown_labels: + - Monthly countable income band + - Household size group + reference: + - title: "Arkansas FY2026 Winter Benefits Matrix, Fuel Oil #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Fuel-Oil.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, Fuel Oil #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Fuel-Oil.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/natural_gas.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/natural_gas.yaml new file mode 100644 index 00000000000..454dc20cb2f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/natural_gas.yaml @@ -0,0 +1,356 @@ +description: Arkansas provides this regular heating benefit for households using natural gas under the Low Income Home Energy Assistance Program. +# Cells with one entry apply in both FY2025 and FY2026. + +1: + 1: + 2024-10-01: 308 + 2: + 2024-10-01: 366 + 3: + 2024-10-01: 437 + +2: + 1: + 2024-10-01: 295 + 2: + 2024-10-01: 350 + 3: + 2024-10-01: 422 + +3: + 1: + 2024-10-01: 280 + 2: + 2024-10-01: 338 + 3: + 2024-10-01: 409 + +4: + 1: + 2024-10-01: 265 + 2: + 2024-10-01: 324 + 3: + 2024-10-01: 394 + +5: + 1: + 2024-10-01: 253 + 2: + 2024-10-01: 308 + 3: + 2024-10-01: 380 + +6: + 1: + 2024-10-01: 238 + 2: + 2024-10-01: 295 + 3: + 2024-10-01: 366 + +7: + 1: + 2024-10-01: 227 + 2: + 2024-10-01: 283 + 3: + 2024-10-01: 350 + +8: + 1: + 2024-10-01: 221 + 2: + 2024-10-01: 272 + 3: + 2024-10-01: 338 + +9: + 1: + 2024-10-01: 216 + 2: + 2024-10-01: 265 + 3: + 2024-10-01: 324 + +10: + 1: + 2024-10-01: 210 + 2: + 2024-10-01: 258 + 3: + 2024-10-01: 308 + +11: + 1: + 2024-10-01: 203 + 2: + 2024-10-01: 250 + 3: + 2024-10-01: 295 + +12: + 1: + 2024-10-01: 197 + 2: + 2024-10-01: 245 + 3: + 2024-10-01: 280 + +13: + 1: + 2024-10-01: 190 + 2: + 2024-10-01: 238 + 3: + 2024-10-01: 265 + +14: + 1: + 2024-10-01: 182 + 2: + 2024-10-01: 230 + 3: + 2024-10-01: 253 + +15: + 1: + 2024-10-01: 175 + 2: + 2024-10-01: 223 + 3: + 2024-10-01: 240 + +16: + 1: + 2024-10-01: 168 + 2: + 2024-10-01: 216 + 3: + 2024-10-01: 232 + +17: + 1: + 2024-10-01: 161 + 2: + 2024-10-01: 209 + 3: + 2024-10-01: 224 + +18: + 1: + 2024-10-01: 154 + 2: + 2024-10-01: 202 + 3: + 2024-10-01: 216 + +19: + 1: + 2024-10-01: 146 + 2: + 2024-10-01: 194 + 3: + 2024-10-01: 209 + +20: + 1: + 2024-10-01: 139 + 2: + 2024-10-01: 187 + 3: + 2024-10-01: 200 + +21: + 1: + 2024-10-01: 132 + 2: + 2024-10-01: 181 + 3: + 2024-10-01: 193 + +22: + 1: + 2024-10-01: 127 + 2: + 2024-10-01: 174 + 3: + 2024-10-01: 185 + +23: + 1: + 2024-10-01: 121 + 2: + 2024-10-01: 167 + 3: + 2024-10-01: 178 + +24: + 1: + 2024-10-01: 115 + 2: + 2024-10-01: 160 + 3: + 2024-10-01: 170 + 2025-10-01: 169 + +25: + 1: + 2024-10-01: 112 + 2: + 2024-10-01: 152 + 3: + 2024-10-01: 163 + 2025-10-01: 162 + +26: + 1: + 2024-10-01: 107 + 2: + 2024-10-01: 145 + 3: + 2024-10-01: 156 + 2025-10-01: 154 + +27: + 1: + 2024-10-01: 103 + 2: + 2024-10-01: 138 + 3: + 2024-10-01: 150 + 2025-10-01: 146 + +28: + 1: + 2024-10-01: 98 + 2: + 2024-10-01: 131 + 3: + 2024-10-01: 143 + 2025-10-01: 138 + +29: + 1: + 2024-10-01: 95 + 2: + 2024-10-01: 124 + 3: + 2024-10-01: 136 + 2025-10-01: 131 + +30: + 1: + 2024-10-01: 90 + 2: + 2024-10-01: 116 + 3: + 2024-10-01: 128 + 2025-10-01: 122 + +31: + 1: + 2024-10-01: 84 + 2: + 2024-10-01: 110 + 2025-10-01: 109 + 3: + 2024-10-01: 121 + 2025-10-01: 115 + +32: + 1: + 2024-10-01: 79 + 2: + 2024-10-01: 103 + 2025-10-01: 102 + 3: + 2024-10-01: 114 + 2025-10-01: 107 + +33: + 1: + 2024-10-01: 73 + 2: + 2024-10-01: 96 + 2025-10-01: 95 + 3: + 2024-10-01: 107 + 2025-10-01: 100 + +34: + 1: + 2024-10-01: 68 + 2: + 2024-10-01: 89 + 2025-10-01: 88 + 3: + 2024-10-01: 100 + 2025-10-01: 91 + +35: + 1: + 2024-10-01: 64 + 2025-10-01: 62 + 2: + 2024-10-01: 82 + 2025-10-01: 80 + 3: + 2024-10-01: 92 + 2025-10-01: 84 + +36: + 1: + 2024-10-01: 60 + 2025-10-01: 0 + 2: + 2024-10-01: 74 + 2025-10-01: 73 + 3: + 2024-10-01: 85 + 2025-10-01: 76 + +37: + 1: + 2024-10-01: 60 + 2025-10-01: 0 + 2: + 2024-10-01: 60 + 2025-10-01: 66 + 3: + 2024-10-01: 60 + 2025-10-01: 68 + +38: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 60 + 2025-10-01: 0 + 3: + 2024-10-01: 60 + +39: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 60 + +metadata: + unit: currency-USD + period: year + label: Arkansas LIHEAP natural gas benefit matrix + propagate_metadata_to_children: true + breakdown: + - range(1, 40) + - range(1, 4) + breakdown_labels: + - Monthly countable income band + - Household size group + reference: + - title: "Arkansas FY2026 Winter Benefits Matrix, Natural Gas #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Natural-Gas.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, Natural Gas #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Natural-Gas.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/other.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/other.yaml new file mode 100644 index 00000000000..7b264691dc9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/other.yaml @@ -0,0 +1,335 @@ +description: Arkansas provides this regular heating benefit for households using other heating fuels under the Low Income Home Energy Assistance Program. +# Cells with one entry apply in both FY2025 and FY2026. + +1: + 1: + 2024-10-01: 289 + 2: + 2024-10-01: 344 + 3: + 2024-10-01: 410 + +2: + 1: + 2024-10-01: 277 + 2: + 2024-10-01: 330 + 3: + 2024-10-01: 397 + +3: + 1: + 2024-10-01: 263 + 2: + 2024-10-01: 318 + 3: + 2024-10-01: 384 + +4: + 1: + 2024-10-01: 250 + 2: + 2024-10-01: 305 + 3: + 2024-10-01: 370 + +5: + 1: + 2024-10-01: 238 + 2: + 2024-10-01: 289 + 3: + 2024-10-01: 358 + +6: + 1: + 2024-10-01: 223 + 2: + 2024-10-01: 277 + 3: + 2024-10-01: 344 + +7: + 1: + 2024-10-01: 214 + 2: + 2024-10-01: 266 + 3: + 2024-10-01: 330 + +8: + 1: + 2024-10-01: 208 + 2: + 2024-10-01: 257 + 3: + 2024-10-01: 318 + +9: + 1: + 2024-10-01: 203 + 2: + 2024-10-01: 250 + 3: + 2024-10-01: 305 + +10: + 1: + 2024-10-01: 198 + 2: + 2024-10-01: 244 + 3: + 2024-10-01: 289 + +11: + 1: + 2024-10-01: 191 + 2: + 2024-10-01: 235 + 3: + 2024-10-01: 277 + +12: + 1: + 2024-10-01: 185 + 2: + 2024-10-01: 230 + 3: + 2024-10-01: 263 + +13: + 1: + 2024-10-01: 178 + 2: + 2024-10-01: 223 + 3: + 2024-10-01: 250 + +14: + 1: + 2024-10-01: 172 + 2: + 2024-10-01: 216 + 3: + 2024-10-01: 238 + +15: + 1: + 2024-10-01: 164 + 2: + 2024-10-01: 210 + 3: + 2024-10-01: 226 + +16: + 1: + 2024-10-01: 158 + 2: + 2024-10-01: 203 + 3: + 2024-10-01: 218 + +17: + 1: + 2024-10-01: 151 + 2: + 2024-10-01: 197 + 3: + 2024-10-01: 211 + +18: + 1: + 2024-10-01: 144 + 2: + 2024-10-01: 190 + 3: + 2024-10-01: 203 + +19: + 1: + 2024-10-01: 138 + 2: + 2024-10-01: 184 + 3: + 2024-10-01: 197 + +20: + 1: + 2024-10-01: 131 + 2: + 2024-10-01: 176 + 3: + 2024-10-01: 188 + +21: + 1: + 2024-10-01: 125 + 2: + 2024-10-01: 170 + 3: + 2024-10-01: 182 + +22: + 1: + 2024-10-01: 119 + 2: + 2024-10-01: 163 + 3: + 2024-10-01: 174 + +23: + 1: + 2024-10-01: 114 + 2: + 2024-10-01: 156 + 3: + 2024-10-01: 167 + +24: + 1: + 2024-10-01: 109 + 2: + 2024-10-01: 150 + 3: + 2024-10-01: 161 + +25: + 1: + 2024-10-01: 104 + 2: + 2024-10-01: 143 + 3: + 2024-10-01: 154 + +26: + 1: + 2024-10-01: 101 + 2: + 2024-10-01: 137 + 3: + 2024-10-01: 148 + +27: + 1: + 2024-10-01: 97 + 2: + 2024-10-01: 130 + 3: + 2024-10-01: 140 + +28: + 1: + 2024-10-01: 92 + 2: + 2024-10-01: 124 + 3: + 2024-10-01: 134 + +29: + 1: + 2024-10-01: 89 + 2: + 2024-10-01: 116 + 3: + 2024-10-01: 127 + +30: + 1: + 2024-10-01: 85 + 2: + 2024-10-01: 110 + 3: + 2024-10-01: 121 + +31: + 1: + 2024-10-01: 79 + 2: + 2024-10-01: 103 + 3: + 2024-10-01: 114 + +32: + 1: + 2024-10-01: 74 + 2: + 2024-10-01: 97 + 3: + 2024-10-01: 107 + +33: + 1: + 2024-10-01: 68 + 2: + 2024-10-01: 90 + 3: + 2024-10-01: 101 + +34: + 1: + 2024-10-01: 64 + 2: + 2024-10-01: 83 + 3: + 2024-10-01: 94 + +35: + 1: + 2024-10-01: 60 + 2: + 2024-10-01: 77 + 3: + 2024-10-01: 88 + +36: + 1: + 2024-10-01: 60 + 2025-10-01: 0 + 2: + 2024-10-01: 70 + 3: + 2024-10-01: 80 + +37: + 1: + 2024-10-01: 60 + 2025-10-01: 0 + 2: + 2024-10-01: 64 + 3: + 2024-10-01: 74 + +38: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 60 + 2025-10-01: 0 + 3: + 2024-10-01: 67 + +39: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 0 + 2025-10-01: 61 + +metadata: + unit: currency-USD + period: year + label: Arkansas LIHEAP other heating fuels benefit matrix + propagate_metadata_to_children: true + breakdown: + - range(1, 40) + - range(1, 4) + breakdown_labels: + - Monthly countable income band + - Household size group + reference: + - title: "Arkansas FY2026 Winter Benefits Matrix, Other Heating Fuels #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Other-Wood-Pellets.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, Other Heating Fuels #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Other-Wood-Pellets.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/propane.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/propane.yaml new file mode 100644 index 00000000000..bf697648d60 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/propane.yaml @@ -0,0 +1,343 @@ +description: Arkansas provides this regular heating benefit for households using propane under the Low Income Home Energy Assistance Program. +# Cells with one entry apply in both FY2025 and FY2026. + +1: + 1: + 2024-10-01: 397 + 2: + 2024-10-01: 472 + 3: + 2024-10-01: 563 + +2: + 1: + 2024-10-01: 380 + 2: + 2024-10-01: 451 + 3: + 2024-10-01: 545 + +3: + 1: + 2024-10-01: 360 + 2: + 2024-10-01: 436 + 3: + 2024-10-01: 527 + +4: + 1: + 2024-10-01: 342 + 2: + 2024-10-01: 418 + 3: + 2024-10-01: 506 + +5: + 1: + 2024-10-01: 326 + 2: + 2024-10-01: 397 + 3: + 2024-10-01: 490 + +6: + 1: + 2024-10-01: 306 + 2: + 2024-10-01: 380 + 3: + 2024-10-01: 472 + +7: + 1: + 2024-10-01: 293 + 2: + 2024-10-01: 365 + 3: + 2024-10-01: 451 + +8: + 1: + 2024-10-01: 284 + 2: + 2024-10-01: 352 + 3: + 2024-10-01: 436 + +9: + 1: + 2024-10-01: 278 + 2: + 2024-10-01: 342 + 3: + 2024-10-01: 418 + +10: + 1: + 2024-10-01: 271 + 2: + 2024-10-01: 334 + 3: + 2024-10-01: 397 + +11: + 1: + 2024-10-01: 262 + 2: + 2024-10-01: 323 + 3: + 2024-10-01: 380 + +12: + 1: + 2024-10-01: 253 + 2: + 2024-10-01: 314 + 3: + 2024-10-01: 360 + +13: + 1: + 2024-10-01: 244 + 2: + 2024-10-01: 306 + 3: + 2024-10-01: 342 + +14: + 1: + 2024-10-01: 235 + 2: + 2024-10-01: 296 + 3: + 2024-10-01: 326 + +15: + 1: + 2024-10-01: 226 + 2: + 2024-10-01: 288 + 3: + 2024-10-01: 310 + +16: + 1: + 2024-10-01: 216 + 2: + 2024-10-01: 278 + 3: + 2024-10-01: 299 + +17: + 1: + 2024-10-01: 208 + 2: + 2024-10-01: 269 + 3: + 2024-10-01: 289 + +18: + 1: + 2024-10-01: 198 + 2: + 2024-10-01: 260 + 3: + 2024-10-01: 278 + +19: + 1: + 2024-10-01: 190 + 2: + 2024-10-01: 251 + 3: + 2024-10-01: 269 + +20: + 1: + 2024-10-01: 180 + 2: + 2024-10-01: 242 + 3: + 2024-10-01: 258 + +21: + 1: + 2024-10-01: 170 + 2: + 2024-10-01: 233 + 3: + 2024-10-01: 250 + +22: + 1: + 2024-10-01: 163 + 2: + 2024-10-01: 223 + 3: + 2024-10-01: 239 + +23: + 1: + 2024-10-01: 156 + 2: + 2024-10-01: 215 + 3: + 2024-10-01: 229 + +24: + 1: + 2024-10-01: 149 + 2: + 2024-10-01: 205 + 3: + 2024-10-01: 220 + +25: + 1: + 2024-10-01: 144 + 2: + 2024-10-01: 197 + 3: + 2024-10-01: 211 + +26: + 1: + 2024-10-01: 138 + 2: + 2024-10-01: 187 + 3: + 2024-10-01: 202 + +27: + 1: + 2024-10-01: 132 + 2: + 2024-10-01: 178 + 3: + 2024-10-01: 193 + +28: + 1: + 2024-10-01: 127 + 2: + 2024-10-01: 169 + 3: + 2024-10-01: 184 + +29: + 1: + 2024-10-01: 121 + 2: + 2024-10-01: 160 + 3: + 2024-10-01: 174 + +30: + 1: + 2024-10-01: 116 + 2: + 2024-10-01: 151 + 3: + 2024-10-01: 166 + +31: + 1: + 2024-10-01: 109 + 2025-10-01: 110 + 2: + 2024-10-01: 142 + 3: + 2024-10-01: 156 + +32: + 1: + 2024-10-01: 102 + 2025-10-01: 106 + 2: + 2024-10-01: 132 + 3: + 2024-10-01: 148 + +33: + 1: + 2024-10-01: 95 + 2025-10-01: 100 + 2: + 2024-10-01: 124 + 3: + 2024-10-01: 138 + +34: + 1: + 2024-10-01: 88 + 2025-10-01: 95 + 2: + 2024-10-01: 114 + 3: + 2024-10-01: 128 + +35: + 1: + 2024-10-01: 80 + 2025-10-01: 89 + 2: + 2024-10-01: 106 + 3: + 2024-10-01: 119 + 2025-10-01: 120 + +36: + 1: + 2024-10-01: 73 + 2025-10-01: 0 + 2: + 2024-10-01: 96 + 3: + 2024-10-01: 110 + +37: + 1: + 2024-10-01: 66 + 2025-10-01: 0 + 2: + 2024-10-01: 86 + 3: + 2024-10-01: 109 + 2025-10-01: 102 + +38: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 77 + 2025-10-01: 0 + 3: + 2024-10-01: 100 + 2025-10-01: 92 + +39: + 1: + 2024-10-01: 0 + 2: + 2024-10-01: 0 + 3: + 2024-10-01: 90 + 2025-10-01: 83 + +metadata: + unit: currency-USD + period: year + label: Arkansas LIHEAP propane benefit matrix + propagate_metadata_to_children: true + breakdown: + - range(1, 40) + - range(1, 4) + breakdown_labels: + - Monthly countable income band + - Household size group + reference: + - title: "Arkansas FY2026 Winter Benefits Matrix, Propane #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Propane.pdf#page=1 + - title: "Arkansas FY2025 Benefits Matrix, Propane #page 1-2" + href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Propane.pdf#page=1 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 5250ab3aa89..a4935930a30 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -808,8 +808,15 @@ programs: category: Benefits agency: HHS status: partial - coverage: DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OR, TX + coverage: AR, DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OR, TX state_implementations: + - state: AR + status: partial + name: Arkansas LIHEAP + full_name: Arkansas Low Income Home Energy Assistance Program + variable: ar_liheap + parameter_prefix: gov.states.ar.ee.aeo.liheap + notes: FY2025-FY2026 regular heating matrices and income limits are checked; draft-manual income rules and other years are unverified. Crisis, cooling, weatherization and equipment assistance are out of scope. - state: DC status: complete name: DC LIHEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml new file mode 100644 index 00000000000..5417bee22ba --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml @@ -0,0 +1,600 @@ +# Official FY2026 gas matrix: monthly 370-429 gives 227 for size 1-2; monthly 2130-2347 gives 68; zero income gives 308. Oil zero-income size 5+ gives 570. The 20 percent earned disregard applies before these lookups. +# TEA now counts through take-up-gated tanf, so Cases 1 and 3 pin ar_tea to 0 to keep their +# household-size and zero-income checks; TEA counting is covered in ar_liheap_countable_income.yaml. + +- name: Case 1, a nonqualified parents full counted income uses two qualified children for the grant. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: UNDOCUMENTED + ssi: 0 + is_full_time_student: false + employment_income: 6_000 + person2: + age: 12 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person3: + age: 8 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + heating_expense: 50 + ar_tea: 0 + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_liheap_household_size: 2 + ar_liheap_countable_income: 4_800 + ar_liheap_income_limit: 36_840 + ar_liheap_matrix_amount: 227 + ar_liheap: 227 + +# Manual p42 rounds MCI to whole dollars. Alimony counts in full (rental income would +# take the 20% disregard): 28164 / 12 = 2347 and 28164.12 / 12 = 2347.01 rounds to 2347, +# so a one-cent monthly excess stays within the 2347 size-one limit; gas 2130-2347 pays +# 68 for 1&2. +- name: Case 2, a one cent monthly alimony excess rounds away at the one person limit. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + heating_expense: [1_200, 1_200] + alimony_income: [28_164, 28_164.12] + output: + ar_liheap: [68, 68] + +- name: Case 3, five qualified household members receive the large household oil grant. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person2: + age: 39 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person3: + age: 12 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person4: + age: 8 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person5: + age: 4 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: FUEL_OIL + heating_expense: 100 + ar_tea: 0 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: AR + output: + ar_liheap_household_size: 5 + ar_liheap: 570 + +- name: Case 4, the final grant follows heat in rent eligibility without an expense cap. + period: 2026 + input: + state_code: [AR, AR, AR] + age: [40, 40, 40] + immigration_status: [CITIZEN, CITIZEN, CITIZEN] + ssi: [0, 0, 0] + is_full_time_student: [false, false, false] + employment_income: [0, 0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + heating_expense: [0, 0, 10] + heat_expense_included_in_rent: [true, true, true] + receives_housing_assistance: [false, true, true] + output: + ar_liheap: [308, 0, 308] + +- name: Case 5, a mixed state population pays only Arkansas households. + period: 2026 + input: + state_code: [AR, GA] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + heating_expense: [10, 10] + output: + ar_liheap: [308, 0] + +# FY2025: wages 21000x0.8=16800, MCI 1400; size-one limit 2251 (x12=27012). +# FFY2025 electric row 1390-1449 pays 91 for 1&2 (the FY2026 row pays 88). +- name: Case 6, FY2025 electric grant for a one person household. + period: 2025 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 21_000 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_800 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 16_800 + ar_liheap_income_limit: 27_012 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 91 + ar_liheap: 91 + +# FY2025: wages 34500x0.8=27600, MCI 2300; size-three limit 3636 (x12=43632). +# FFY2025 electric row 2250-2944 pays 64 for 3&4 (FY2026 puts 2300 in 2130-2347, paying 70). +- name: Case 7, FY2025 electric grant uses the FY2025 income bands. + period: 2025 + input: + people: + person1: + age: 32 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 34_500 + person2: + age: 10 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 6 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 2_100 + ar_tea: 0 + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_liheap_household_size: 3 + ar_liheap_countable_income: 27_600 + ar_liheap_income_limit: 43_632 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 64 + ar_liheap: 64 + +# Boundary: FY2025 size 7 uses 150% FPG, 47340x1.5/12=5917.50 -> 5918 (x12=71016); 60% SMI would be 5844. +# Wages (50000+38500)x0.8=70800, MCI 5900, so eligible; FFY2025 electric 5140-Max pays 60 for 5&up. +- name: Case 8, FY2025 seven person household between the SMI and FPG limits is paid. + period: 2025 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 50_000 + person2: + age: 38 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 38_500 + person3: + age: 16 + immigration_status: CITIZEN + ssi: 0 + person4: + age: 14 + immigration_status: CITIZEN + ssi: 0 + person5: + age: 11 + immigration_status: CITIZEN + ssi: 0 + person6: + age: 8 + immigration_status: CITIZEN + ssi: 0 + person7: + age: 5 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 2_400 + ar_tea: 0 + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7] + state_code: AR + output: + ar_liheap_household_size: 7 + ar_liheap_countable_income: 70_800 + ar_liheap_income_limit: 71_016 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 60 + ar_liheap: 60 + +# FY2025 Medicare-net Social Security (plan 1.9 p6; manual 4.7.2 p43): 2025 Part B 185x12=2220; +# 26400-2220=24180, MCI 2015; size-one limit 27012; FFY2025 gas 2010-2129 pays 73 for 1&2. +- name: Case 9, FY2025 Social Security net of the Part B premium sets the gas grant. + period: 2025 + input: + people: + person1: + age: 67 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + social_security: 26_400 + medicare_part_b_premium: 2_220 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 24_180 + ar_liheap_income_limit: 27_012 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 73 + ar_liheap: 73 + +# 2026 Part B 202.90x12=2434.80; 29400-2434.80=26965.20, MCI 2247.10 -> 2247 (x12=26964) <= 28164. +# Gross Social Security (2450/month) would exceed the 2347 limit. Gas 2130-2347 pays 68 for 1&2. +- name: Case 10, netting the Part B premium makes a Social Security recipient eligible. + period: 2026 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + social_security: 29_400 + medicare_part_b_premium: 2_434.8 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 26_964 + ar_liheap_income_limit: 28_164 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 68 + ar_liheap: 68 + +# Per-source floor: farm rent is an earned source (manual p141) and its 1000 loss counts +# as 0, so 36000 x 0.8 = 28800 > 28164 and no grant is paid. Netting the loss would give +# (36000 - 1000) x 0.8 = 28000, MCI 2333 (27996), eligible, and a 68 grant. +# The ungated gas row 2348-3070 shows 62 for 1&2. +- name: Case 11, a farm rent loss does not make a wage earner eligible. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 36_000 + farm_rent_income: -1_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 28_800 + ar_liheap_income_limit: 28_164 + ar_liheap_eligible: false + ar_liheap_matrix_amount: 62 + ar_liheap: 0 + +# Boundary: manual p42 half-up MCI rounding at the 2347 size-one limit. +# 28169.88/12=2347.49 -> 2347 (28164, eligible, gas 2130-2347 pays 68); +# 28170/12=2347.50 -> 2348 (28176 > 28164, ineligible; ungated gas 2348-3070 shows 62). +- name: Case 12, half-up rounding decides eligibility at the income limit. + period: 2026 + input: + state_code: [AR, AR] + age: [60, 60] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + heating_type: [NATURAL_GAS, NATURAL_GAS] + gas_expense: [900, 900] + ar_tea: [0, 0] + pension_income: [28_169.88, 28_170] + output: + ar_liheap_countable_income: [28_164, 28_176] + ar_liheap_income_limit: [28_164, 28_164] + ar_liheap_eligible: [true, false] + ar_liheap_matrix_amount: [68, 62] + ar_liheap: [68, 0] + +# Boundary: half-up rounding moves MCI 69.50 into the 70-129 band. Alimony counts in +# full. +# 833.88 / 12 = 69.49 -> 69 (828), electric 0-69 pays 242 for 1&2; +# 834 / 12 = 69.50 -> 70 (840), 70-129 pays 233. +- name: Case 13, half-up rounding of alimony decides the income band. + period: 2026 + input: + state_code: [AR, AR] + age: [30, 30] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + heating_type: [ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [1_800, 1_800] + ar_tea: [0, 0] + alimony_income: [833.88, 834] + output: + ar_liheap_countable_income: [828, 840] + ar_liheap_eligible: [true, true] + ar_liheap_matrix_amount: [242, 233] + ar_liheap: [242, 233] + +# Case 3's family with TEA received: manual Appendix E p130 counts TEA, read through take-up-gated tanf. +# Five-person TEA maximum $286/month x 12 = 3432; MCI 286 (whole); size-five limit 5236 (62832). +# FY2026 fuel oil 250-309 pays 497 for 5&up, down from 570 at zero income (0-69). +- name: Case 14, received TEA lowers the large household oil grant. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person2: + age: 39 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person3: + age: 12 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person4: + age: 8 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person5: + age: 4 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: FUEL_OIL + heating_expense: 100 + ar_tea: 3_432 + takes_up_tanf_if_eligible: true + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: AR + output: + tanf: 3_432 + ar_liheap_household_size: 5 + ar_liheap_countable_income: 3_432 + ar_liheap_income_limit: 62_832 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 497 + ar_liheap: 497 + +# Manual Appendix F p137 counts interest only over $200 a month: 3000 - 200 x 12 = 600. +# Pension 12000 + 600 = 12600; MCI 1050; size-one limit 28164; electric 1030-1089 pays +# 121 for 1&2. Counting all interest would give MCI 1250 and the 1210-1269 row, 104. +- name: Case 15, only interest above the monthly disregard lowers the electric grant. + period: 2026 + input: + people: + person1: + age: 62 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + pension_income: 12_000 + interest_income: 3_000 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_800 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 12_600 + ar_liheap_income_limit: 28_164 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 121 + ar_liheap: 121 + +# Manual Appendix F p141 treats rental property as self-employment, so the 20% disregard +# applies: 30000 x 0.8 = 24000, MCI 2000 <= 2347 size-one limit; gas 1990-2009 pays 79 +# for 1&2. Gross rental of 2500 a month would exceed the limit. +- name: Case 16, the self employment disregard makes a landlord eligible. + period: 2026 + input: + people: + person1: + age: 58 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + rental_income: 30_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_household_size: 1 + ar_liheap_countable_income: 24_000 + ar_liheap_income_limit: 28_164 + ar_liheap_eligible: true + ar_liheap_matrix_amount: 79 + ar_liheap: 79 + +# Current application section III excludes under-18 earnings. At 18, +# wages 48_000 less 20% = 38_400 exceed the two-person FY2026 limit 36_840. +# The published natural-gas matrix awards 308 at zero income for size two. +- name: Case 17, age 17 nonstudent earnings determine the final heating award. + period: 2026 + input: + people: + parent: + age: 40 + immigration_status: CITIZEN + ssi: 0 + child: + age: 17 + immigration_status: CITIZEN + is_full_time_student: false + employment_income: 48_000 + ssi: 0 + spm_units: + unit: + members: [parent, child] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [parent, child] + state_code: AR + output: + ar_liheap_countable_income: 0 + ar_liheap_income_limit: 36_840 + ar_liheap_eligible: true + ar_liheap: 308 + +# Current application section III excludes under-18 earnings. At 18, +# wages 48_000 less 20% = 38_400 exceed the two-person FY2026 limit 36_840. +# The published natural-gas matrix awards 308 at zero income for size two. +- name: Case 18, age 18 nonstudent earnings determine the final heating award. + period: 2026 + input: + people: + parent: + age: 40 + immigration_status: CITIZEN + ssi: 0 + child: + age: 18 + immigration_status: CITIZEN + is_full_time_student: false + employment_income: 48_000 + ssi: 0 + spm_units: + unit: + members: [parent, child] + heating_type: NATURAL_GAS + gas_expense: 1_200 + tanf: 0 + households: + household: + members: [parent, child] + state_code: AR + output: + ar_liheap_countable_income: 38400 + ar_liheap_income_limit: 36_840 + ar_liheap_eligible: false + ar_liheap: 0 + +# Current application section III requests work income only from members 18+ +# who are not full-time students, without age or dependency restrictions. +# For an independent student earning 48_000, counted earnings are zero and the +# FY2026 one-person natural-gas matrix pays 308. Nonstudent earnings after the 20% +# disregard are 38_400, above the 28_164 limit, so the comparison gets zero. +- name: Case 19, independent adult full-time students retain the regular heating award beyond age 23. + period: 2026 + input: + state_code: [AR, AR, AR, AR] + age: [22, 23, 24, 24] + immigration_status: [CITIZEN, CITIZEN, CITIZEN, CITIZEN] + is_full_time_student: [true, true, true, false] + is_tax_unit_dependent: [false, false, false, false] + employment_income: [48_000, 48_000, 48_000, 48_000] + ssi: [0, 0, 0, 0] + tanf: [0, 0, 0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + heating_expense: [1_200, 1_200, 1_200, 1_200] + output: + ar_liheap_countable_income: [0, 0, 0, 38_400] + ar_liheap_income_limit: [28_164, 28_164, 28_164, 28_164] + ar_liheap_eligible: [true, true, true, false] + ar_liheap: [308, 308, 308, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.yaml new file mode 100644 index 00000000000..17f77fd6309 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.yaml @@ -0,0 +1,70 @@ +# FY2025 draft manual sections 4.4-4.4.1 (pp 36-37), corroborated by the CSCDC applicant rights statement, item 9. + +- name: Case 1, qualified citizens permanent residents and asylees count in the household. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + ssi: 0 + is_full_time_student: false + person2: + age: 39 + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi: 0 + is_full_time_student: false + person3: + age: 19 + immigration_status: ASYLEE + ssi: 0 + is_full_time_student: false + person4: + age: 17 + immigration_status: DACA + ssi: 0 + is_full_time_student: false + person5: + age: 8 + immigration_status: UNDOCUMENTED + ssi: 0 + is_full_time_student: false + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: NATURAL_GAS + heating_expense: 1_200 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: AR + output: + ar_liheap_household_size: 3 + +# No qualified member: size 0 (manual p36 requires at least one eligible member), so the income limit is 0; without the size mask the one-person 28_164 would apply. +- name: Case 2, a household with no qualified member has zero eligible household size. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: UNDOCUMENTED + ssi: 0 + is_full_time_student: false + person2: + age: 8 + immigration_status: DACA + ssi: 0 + is_full_time_student: false + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + heating_expense: 1_200 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_household_size: 0 + ar_liheap_income_limit: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml new file mode 100644 index 00000000000..3c18fa7fd57 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml @@ -0,0 +1,139 @@ +# FY2026 plan items 1.4 and 2.1-2.3 (pp 5, 9-10) and the FY2026 income chart. + +- name: Case 1, the exact income ceiling is inclusive and does not impose an asset test. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + heating_expense: [1_200, 1_200] + ar_liheap_countable_income: [28_164, 28_164.12] + spm_unit_assets: [1_000_000, 1_000_000] + output: + ar_liheap_eligible: [true, false] + +- name: Case 2, subsidized heat in rent requires a reported residual charge despite a general obligation flag. + period: 2026 + input: + state_code: [AR, AR, AR, AR, AR] + age: [40, 40, 40, 40, 40] + immigration_status: [CITIZEN, CITIZEN, CITIZEN, CITIZEN, CITIZEN] + ssi: [0, 0, 0, 0, 0] + is_full_time_student: [false, false, false, false, false] + employment_income: [0, 0, 0, 0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + heating_expense: [0, 0, 120, 0, 120] + has_heating_expense: [false, true, true, true, true] + heat_expense_included_in_rent: [true, true, true, true, true] + receives_housing_assistance: [false, true, true, false, false] + is_in_public_housing: [false, false, false, true, true] + output: + ar_liheap_eligible: [true, false, true, false, true] + +- name: Case 3, a direct heating obligation can be reported without a current positive bill. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + heating_expense: [0, 0] + has_heating_expense: [true, false] + heat_expense_included_in_rent: [false, false] + output: + ar_liheap_eligible: [true, false] + +- name: Case 4, explicit no heating and no qualified member each prevent eligibility. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, UNDOCUMENTED] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [0, 0] + heating_type: [NONE, NATURAL_GAS] + heating_expense: [1_200, 1_200] + output: + ar_liheap_eligible: [false, false] + +# An aged SSI recipient (Social Security 600/month; SSI (994-(600-20))x12=4968) lives with a +# working adult son. The State's Medicaid buy-in pays Part B for an SSI recipient, so no premium is netted. +# 40000x0.8=32000 + 4968 + 7200 = 44168; MCI 3680.67 rounds to 3681; x12=44172 > 36840 two-person limit. +- name: Case 5, SSI receipt does not waive the ordinary income ceiling. + period: 2026 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 4_968 + social_security: 7_200 + medicare_part_b_premium: 0 + person2: + age: 45 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 40_000 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + heating_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 44_172 + ar_liheap_eligible: false + +# Boundary: FY2025 plan 2.1 (p8) and chart set size 7 at 150% FPG: 47340x1.5/12=5917.50 -> 5918 +# (annual 71016). MCI 5900 (70800) and 5918 (71016) are eligible; 5919 (71028) is not. +# 60% SMI would have given 5844 and denied MCI 5900. +- name: Case 6, FY2025 size seven households use the poverty guideline limit. + period: 2025 + input: + state_code: [AR, AR, AR] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [2_400, 2_400, 2_400] + ar_liheap_household_size: [7, 7, 7] + ar_liheap_countable_income: [70_800, 71_016, 71_028] + output: + ar_liheap_eligible: [true, true, false] + +# FY2026 plan item 2.3 (p10): a household has an energy burden if it pays utilities +# directly; one whose utilities are reimbursed through an allowance is not eligible unless +# it shows an energy burden. has_heating_expense defaults to a positive primary-fuel bill +# with heat not in rent, and an explicit false is respected. Wages 20 hours x 52 weeks x +# $11.00 Arkansas minimum wage = 11440; x 0.8 = 9152; MCI 762.67 rounds to 763 +# (x12 = 9156); 763 <= 2347 one-person limit. Gas 730-789 pays 190 for 1&2; the second +# unit has no heating obligation and gets 0. +- name: Case 7, an explicit no heating cost flag overrides a reported direct bill. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + is_full_time_student: [false, false] + employment_income: [11_440, 11_440] + ar_tea: [0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS] + gas_expense: [1_200, 1_200] + has_heating_expense: [true, false] + heat_expense_included_in_rent: [false, false] + output: + ar_liheap_countable_income: [9_156, 9_156] + ar_liheap_eligible: [true, false] + ar_liheap: [190, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.yaml new file mode 100644 index 00000000000..284482ad911 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.yaml @@ -0,0 +1,777 @@ +# Independent AR component tests; no final household eligibility or total benefit is asserted. + +# Plan p5: 15000 x 0.8 = 12000 countable work income. +- name: Case 1, adult gross wages receive the twenty percent disregard. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 15_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 12_000 + +# Current application section III excludes work income of every full-time +# student, without an adult age or dependency test. Only Social Security +# 1_200 counts; under 65 without SSDI there is no Part B premium to deduct. +- name: Case 2, a full time college student living alone has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 22 + immigration_status: CITIZEN + is_full_time_student: true + is_full_time_college_student: true + is_tax_unit_dependent: false + ssi: 0 + employment_income: 15_000 + self_employment_income: 3_000 + social_security: 1_200 + medicare_part_b_premium: 0 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 1_200 + +# Current application section III and accepted plan section 1.9 exclude every +# minor's earnings, even without school attendance. Unearned income counts: +# SSI 2400 + child support 3600 = 6000; MCI 500. +- name: Case 3, a minor not attending school has work excluded but unearned income counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 17 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 2_400 + employment_income: 15_000 + self_employment_income: 3_000 + child_support_received: 3_600 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 6_000 + +# Exactly 18 and not a full-time student makes wages countable after the 20% disregard: 15000 x 0.8 = 12000. +- name: Case 4, age eighteen nonstudent earnings are counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 18 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 15_000 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 12_000 + +# Countable adult existing earned inputs total 20000; the standard 20% disregard gives 16000, without a new business-expense calculation. +# Manual p42 rounds MCI to whole dollars: 16000/12=1333.33 -> 1333; x12=15996. +- name: Case 5, existing business sources receive the standard earned disregard. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 10_000 + self_employment_income: 5_000 + farm_operations_income: 2_500 + sstb_self_employment_income: 1_250 + partnership_s_corp_income: 1_250 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 15_996 + +# Manual 4.7.4 (p47) counts negative self-employment income as zero: wages 12000 x 0.8 = 9600 + pension 1200 = 10800. +- name: Case 6, source losses do not offset wages or unearned receipts. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 12_000 + self_employment_income: -6_000 + farm_operations_income: -2_400 + pension_income: 1_200 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 10_800 + +# Manual Appendix F p141 treats rental property as self-employment, so rental and farm +# rent take the 20% disregard with wages: (12000 + 2400 + 1200) x 0.8 = 12480. +# Survivor 600 + child SSI 2400 count in full: 15480. +# Manual Appendix E p130 counts TEA (plan 1.9 leaves TANF unchecked); TEA flows +# through take-up-gated tanf. TEA 1944 = two-person maximum $162 x 12. +# 15480 + 1944 = 17424; MCI 1452 is already whole. +- name: Case 7, rental and farm rent take the earned disregard; other income counts. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 12_000 + rental_income: 2_400 + farm_rent_income: 1_200 + survivor_benefits: 600 + person2: + age: 8 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 2_400 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 1_944 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 17_424 + +# Plan 1.9 p6 counts SSA "Excluding MediCare deduction"; manual 4.7.2 p43 nets the Part B premium. +# 2026 Part B 202.90 x 12 = 2434.80; 29400-2434.80=26965.20; MCI 2247.10 rounds to 2247; x12=26964. +- name: Case 8, Social Security counts net of the Medicare Part B premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + social_security: 29_400 + medicare_part_b_premium: 2_434.8 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 26_964 + +# Manual 4.7.2 p43 applies the Part B netting to Railroad Retirement too. +# (18000-2434.80)+(15600-2434.80)=15565.20+13165.20=28730.40; MCI 2394.20 rounds to 2394; x12=28728. +- name: Case 9, Social Security and railroad retirement are each net of the member's premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + social_security: 18_000 + medicare_part_b_premium: 2_434.8 + person2: + age: 68 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + railroad_benefits: 15_600 + medicare_part_b_premium: 2_434.8 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 28_728 + +# Boundary: a premium above a small benefit floors that member's net Social Security at 0 +# and does not reduce other income. max(1200-2434.80,0)=0; pension 12000; MCI 1000. +- name: Case 10, a premium larger than Social Security does not offset a pension. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 66 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + social_security: 1_200 + medicare_part_b_premium: 2_434.8 + pension_income: 12_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 12_000 + +# Manual Appendix F: military retirement p141, workers' compensation p144 (also Appendix E p130), +# gaming or gambling winnings p135, capital gains p132. Each counts in full; every MCI is whole: +# 24000/12=2000, 15600/12=1300, 1200/12=100, 3000/12=250. +- name: Case 11, military retirement workers compensation gambling winnings and capital gains count in full. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR] + age: [55, 45, 60, 62] + immigration_status: [CITIZEN, CITIZEN, CITIZEN, CITIZEN] + is_full_time_student: [false, false, false, false] + ssi: [0, 0, 0, 0] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [900, 900, 900, 900] + ar_tea: [0, 0, 0, 0] + military_retirement_pay: [24_000, 0, 0, 0] + workers_compensation: [0, 15_600, 0, 0] + gambling_winnings: [0, 0, 1_200, 0] + capital_gains: [0, 0, 0, 3_000] + output: + ar_liheap_countable_income: [24_000, 15_600, 1_200, 3_000] + +# Manual Appendix E p130 counts TEA once monthly; take-up-gated tanf includes ar_tea. +# Three-person TEA maximum $204 x 12 = 2448; MCI 204. +- name: Case 12, TEA the household takes up is counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 26 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 6 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 3 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 2_448 + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_liheap_countable_income: 2_448 + +# Same family without TEA take-up: tanf is 0, so the unreceived entitlement is not counted. +- name: Case 13, TEA the household does not take up is not counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 26 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 6 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 3 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 2_448 + takes_up_tanf_if_eligible: false + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_liheap_countable_income: 0 + +# Each source is floored at 0. Farm rent -1000 and rental -2000 are earned sources +# (manual p141) and do not offset wages; capital gains -3000 (manual p132 excludes +# capital losses) does not offset child support. 36000 x 0.8 = 28800 + 2400 = 31200; +# MCI 2600. +# Without the floors: (36000 - 3000) x 0.8 = 26400 + (2400 - 3000) = 25800. +- name: Case 14, rental farm rent and capital losses do not offset other income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 36_000 + farm_rent_income: -1_000 + rental_income: -2_000 + capital_gains: -3_000 + child_support_received: 2_400 + person2: + age: 8 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 900 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 31_200 + +# Boundary: manual p42 rounds MCI to the nearest whole dollar, halves up. +# Alimony counts in full (interest below $200 a month would be disregarded). +# 833.88 / 12 = 69.49 -> 69 -> 828; 834 / 12 = 69.50 -> 70 -> 840. +- name: Case 15, monthly countable alimony rounds half up to whole dollars. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [30, 30] + immigration_status: [CITIZEN, CITIZEN] + is_full_time_student: [false, false] + ssi: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [1_800, 1_800] + ar_tea: [0, 0] + alimony_income: [833.88, 834] + output: + ar_liheap_countable_income: [828, 840] + +# Manual Appendix F p137 counts only interest "amount over $200.00", read per recipient +# per month. 2400 / 12 = 200 is not over the disregard: 0. 3000 - 200 x 12 = 600; +# MCI 50. +- name: Case 16, interest counts only above two hundred dollars a month. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [62, 62] + immigration_status: [CITIZEN, CITIZEN] + is_full_time_student: [false, false] + ssi: [0, 0] + ar_tea: [0, 0] + interest_income: [2_400, 3_000] + output: + ar_liheap_countable_income: [0, 600] + +# Manual p137 does not say whose interest the $200 applies to; the chosen reading applies +# it to each person. Each spouse's 2400 (200 a month) is fully disregarded, leaving the +# pension 12000; MCI 1000. A household-wide $200 would give +# 12000 + (4800 - 2400) = 14400. +- name: Case 17, each spouse receives a separate interest disregard. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 66 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + pension_income: 12_000 + interest_income: 2_400 + person2: + age: 64 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + interest_income: 2_400 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 12_000 + +# Manual Appendix F p141: "Ownership of rental property will be considered a +# self-employment enterprise", so rental income takes the 20% disregard: +# 15000 x 0.8 = 12000; MCI 1000. A farm rent loss of 3000 is floored at 0 and does not +# offset the rental income: still 12000. +- name: Case 18, rental income receives the twenty percent self employment disregard. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [58, 58] + immigration_status: [CITIZEN, CITIZEN] + is_full_time_student: [false, false] + ssi: [0, 0] + ar_tea: [0, 0] + rental_income: [15_000, 15_000] + farm_rent_income: [0, -3_000] + output: + ar_liheap_countable_income: [12_000, 12_000] + +# Current application section III excludes all minor earnings. A 17-year-old +# attending high school has 6_000 wages and 1_200 self-employment excluded; +# SSI 2_400 + child support 3_600 = 6_000 remains countable. +- name: Case 19, a minor attending high school has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 17 + immigration_status: CITIZEN + is_full_time_student: true + ssi: 2_400 + employment_income: 6_000 + self_employment_income: 1_200 + child_support_received: 3_600 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 6_000 + +# Current application section III excludes all minor earnings, regardless of +# part-time college attendance. Only SSI 2_400 + child support 3_600 counts. +- name: Case 20, a minor attending college part time has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + person2: + age: 17 + immigration_status: CITIZEN + is_full_time_student: false + is_part_time_college_student: true + ssi: 2_400 + employment_income: 6_000 + child_support_received: 3_600 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 6_000 + +# Current application section III excludes all full-time students work income, +# without a dependency requirement. Only the parent's 24_000 x 80% = 19_200 counts. +- name: Case 21, a dependent college student aged twenty two has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 24_000 + person2: + age: 22 + immigration_status: CITIZEN + is_full_time_student: true + is_full_time_college_student: true + is_tax_unit_dependent: true + ssi: 0 + employment_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 19_200 + +# Current application section III supplies no adult-student age ceiling. +# The student's 6_000 wages remain excluded; parent 24_000 x 80% = 19_200. +- name: Case 22, a dependent college student aged twenty three still has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 24_000 + person2: + age: 23 + immigration_status: CITIZEN + is_full_time_student: true + is_full_time_college_student: true + is_tax_unit_dependent: true + ssi: 0 + employment_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 19_200 + +# Current application section III supplies no age ceiling for the full-time +# student exclusion. Only the parent's 24_000 x 80% = 19_200 counts. +- name: Case 23, a dependent college student aged twenty four has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 24_000 + person2: + age: 24 + immigration_status: CITIZEN + is_full_time_student: true + is_full_time_college_student: true + is_tax_unit_dependent: true + ssi: 0 + employment_income: 6_000 + spm_units: + spm_unit: + members: [person1, person2] + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 19_200 + +# Current application section III excludes earnings of full-time students, +# including high school. Both work at Arkansas's $11.00 minimum wage: +# the parent 40 hours x 52 weeks = 22880; the 18-year-old high school senior part time, +# 12 hours x 52 weeks = 6864, which is excluded. Full-time status is explicit +# for both people: 22880 x 0.8 = 18304; MCI 1525.33 rounds to 1525; x12 = 18300. +# Counting the senior's wages would give 23796 (Case 25). +- name: Case 24, an eighteen year old high school student has work excluded. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 22_880 + person2: + age: 18 + immigration_status: CITIZEN + is_in_k12_school: true + is_full_time_student: true + ssi: 0 + employment_income: 6_864 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 18_300 + +# Case 24's household, but the 18-year-old is not enrolled in high school, so the +# wages count: (22880 + 6864) x 0.8 = 23795.20; MCI 1982.93 rounds to 1983; +# x12 = 23796. Case 4 leaves is_in_k12_school at its default (false at 18); this case +# sets it explicitly. +- name: Case 25, an eighteen year old not in high school has work counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + is_full_time_student: false + ssi: 0 + employment_income: 22_880 + person2: + age: 18 + immigration_status: CITIZEN + is_in_k12_school: false + is_full_time_student: false + ssi: 0 + employment_income: 6_864 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_liheap_countable_income: 23_796 + +# Plan 1.9 checks unemployment insurance, strike pay, "Interest, dividends, or royalties", +# VA benefits and cash gifts; manual Appendix F counts unemployment (p144), strike pay +# (p143), dividends (p133), retirement/veteran benefits (p141) and regular cash gifts (p132), +# each in full. UI at Arkansas's $451 maximum weekly benefit for the 12-week maximum: +# 451 x 12 = 5412 (MCI 451). Strike pay 6 weeks x $500 = 3000 (MCI 250). Dividends 1200 +# (MCI 100). 2026 VA compensation, 30%, veteran alone: 552.47 x 12 = 6629.64; MCI 552.47 +# rounds to 552; x12 = 6624. Regular cash gifts 150 x 12 = 1800 (MCI 150). Arkansas UI is +# not modeled, so total_unemployment_compensation is the reported amount. +- name: Case 26, unemployment strike pay dividends veterans benefits and regular cash gifts count in full. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR] + age: [45, 50, 58, 60, 35] + immigration_status: [CITIZEN, CITIZEN, CITIZEN, CITIZEN, CITIZEN] + is_full_time_student: [false, false, false, false, false] + ssi: [0, 0, 0, 0, 0] + ar_tea: [0, 0, 0, 0, 0] + unemployment_compensation: [5_412, 0, 0, 0, 0] + strike_benefits: [0, 3_000, 0, 0, 0] + qualified_dividend_income: [0, 0, 1_200, 0, 0] + veterans_benefits: [0, 0, 0, 6_629.64, 0] + financial_assistance: [0, 0, 0, 0, 1_800] + output: + ar_liheap_countable_income: [5_412, 3_000, 1_200, 6_624, 1_800] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml new file mode 100644 index 00000000000..0f55255967c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml @@ -0,0 +1,49 @@ +# Independent AR component tests; no final household eligibility or total benefit is asserted. + +# Official 2026 income chart sizes 1-20 plus the printed 688 monthly amount for the extra person at 21; source limits are literal, independent of the SMI/FPG formula. +- name: Case 1, all published household limits and the first additional person match. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] + output: + ar_liheap_income_limit: [28_164, 36_840, 45_504, 54_168, 62_832, 71_496, 73_128, 81_228, 89_472, + 97_728, 105_972, 114_228, 122_472, 130_728, 138_972, 147_228, 155_472, 163_728, 171_972, 180_228, + 188_484] + + +# FY2025 chart (2024 FPG 15060 + 5380 per extra person): size 8 52720 x 1.5 / 12 = 6590; size 20 117280 x 1.5 / 12 = 14660; +# size 21 adds the printed $672 (not the half-up 673): 14660 + 672 = 15332, x 12 = 183984. +- name: Case 2, FY2025 poverty guideline rows and the printed additional person amount. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [1_200, 1_200, 1_200] + ar_liheap_household_size: [8, 20, 21] + output: + ar_liheap_income_limit: [79_080, 175_920, 183_984] + +# FY2025 chart and plan 2.1 (p8): sizes 1-6 use 60% SMI ($86,577 for four), size 7+ uses 150% FPG. +# SMI x 0.6 / 12 x size factor: 0.52 -> 2251.00 -> 2251; 0.68 -> 2943.62 -> 2944; 0.84 -> 3636.23 -> 3636; +# 1.00 -> 4328.85 -> 4329; 1.16 -> 5021.47 -> 5021; 1.32 -> 5714.08 -> 5714. +# Size 7: 47340x1.5/12=5917.50 -> 5918 (60% SMI would be 5844); size 9: 58100x1.5/12=7262.50 -> 7263. +# Annual = monthly x 12. +- name: Case 3, FY2025 state median income rows and the size seven poverty guideline row. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS] + gas_expense: [900, 900, 900, 900, 900, 900, 900, 900] + ar_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 9] + output: + ar_liheap_income_limit: [27_012, 35_328, 43_632, 51_948, 60_252, 68_568, 71_016, 87_156] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.yaml new file mode 100644 index 00000000000..b94a528b3bc --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.yaml @@ -0,0 +1,465 @@ +# Independent AR component tests; no final household eligibility or total benefit is asserted. + +# Original two-page fuel matrix: 39 lower bounds x 3 size columns = 117 literal cell checks; no eligibility gate is expected in this intermediate. +- name: Case 1, every published electric row and household column matches at its lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + pre_subsidy_electricity_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, + 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, + 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, + 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [0, 0, 0, 840, 840, 840, 1_560, 1_560, 1_560, 2_280, 2_280, 2_280, 3_000, + 3_000, 3_000, 3_720, 3_720, 3_720, 4_440, 4_440, 4_440, 5_160, 5_160, 5_160, 5_880, 5_880, 5_880, + 6_600, 6_600, 6_600, 7_320, 7_320, 7_320, 8_040, 8_040, 8_040, 8_760, 8_760, 8_760, 9_480, 9_480, + 9_480, 10_200, 10_200, 10_200, 10_920, 10_920, 10_920, 11_640, 11_640, 11_640, 12_360, 12_360, + 12_360, 13_080, 13_080, 13_080, 13_800, 13_800, 13_800, 14_520, 14_520, 14_520, 15_240, 15_240, + 15_240, 15_960, 15_960, 15_960, 16_680, 16_680, 16_680, 17_400, 17_400, 17_400, 18_120, 18_120, + 18_120, 18_840, 18_840, 18_840, 19_560, 19_560, 19_560, 20_280, 20_280, 20_280, 21_000, 21_000, + 21_000, 22_440, 22_440, 22_440, 23_880, 23_880, 23_880, 24_120, 24_120, 24_120, 25_560, 25_560, + 25_560, 28_176, 28_176, 28_176, 36_852, 36_852, 36_852, 45_516, 45_516, 45_516, 54_180, 54_180, + 54_180, 62_844, 62_844, 62_844] + output: + ar_liheap_matrix_amount: [242, 288, 344, 233, 276, 334, 221, 266, 322, 209, 254, 310, 199, 242, + 300, 187, 233, 288, 179, 223, 276, 174, 215, 266, 170, 209, 254, 166, 204, 242, 160, 197, 233, + 155, 192, 221, 149, 187, 209, 143, 181, 199, 138, 175, 190, 132, 170, 182, 127, 164, 176, 121, + 158, 170, 115, 154, 164, 110, 148, 158, 104, 143, 152, 100, 137, 145, 94, 131, 140, 88, 126, 134, + 83, 120, 128, 77, 114, 124, 72, 109, 118, 66, 103, 112, 60, 97, 107, 60, 92, 101, 60, 86, 95, + 60, 80, 90, 60, 76, 84, 60, 70, 79, 60, 64, 73, 0, 60, 67, 0, 60, 61, 0, 0, 60, 0, 0, 60] + + +# Original two-page fuel matrix: 39 lower bounds x 3 size columns = 117 literal cell checks; no eligibility gate is expected in this intermediate. +- name: Case 2, every published natgas row and household column matches at its lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, + 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, + 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, + 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [0, 0, 0, 840, 840, 840, 1_560, 1_560, 1_560, 2_280, 2_280, 2_280, 3_000, + 3_000, 3_000, 3_720, 3_720, 3_720, 4_440, 4_440, 4_440, 5_160, 5_160, 5_160, 5_880, 5_880, 5_880, + 6_600, 6_600, 6_600, 7_320, 7_320, 7_320, 8_040, 8_040, 8_040, 8_760, 8_760, 8_760, 9_480, 9_480, + 9_480, 10_200, 10_200, 10_200, 10_920, 10_920, 10_920, 11_640, 11_640, 11_640, 12_360, 12_360, + 12_360, 13_080, 13_080, 13_080, 13_800, 13_800, 13_800, 14_520, 14_520, 14_520, 15_240, 15_240, + 15_240, 15_960, 15_960, 15_960, 16_680, 16_680, 16_680, 17_400, 17_400, 17_400, 18_120, 18_120, + 18_120, 18_840, 18_840, 18_840, 19_560, 19_560, 19_560, 20_280, 20_280, 20_280, 21_000, 21_000, + 21_000, 22_440, 22_440, 22_440, 23_880, 23_880, 23_880, 24_120, 24_120, 24_120, 25_560, 25_560, + 25_560, 28_176, 28_176, 28_176, 36_852, 36_852, 36_852, 45_516, 45_516, 45_516, 54_180, 54_180, + 54_180, 62_844, 62_844, 62_844] + output: + ar_liheap_matrix_amount: [308, 366, 437, 295, 350, 422, 280, 338, 409, 265, 324, 394, 253, 308, + 380, 238, 295, 366, 227, 283, 350, 221, 272, 338, 216, 265, 324, 210, 258, 308, 203, 250, 295, + 197, 245, 280, 190, 238, 265, 182, 230, 253, 175, 223, 240, 168, 216, 232, 161, 209, 224, 154, + 202, 216, 146, 194, 209, 139, 187, 200, 132, 181, 193, 127, 174, 185, 121, 167, 178, 115, 160, + 169, 112, 152, 162, 107, 145, 154, 103, 138, 146, 98, 131, 138, 95, 124, 131, 90, 116, 122, 84, + 109, 115, 79, 102, 107, 73, 95, 100, 68, 88, 91, 62, 80, 84, 0, 73, 76, 0, 66, 68, 0, 0, 60, 0, + 0, 60] + + +# Original two-page fuel matrix: 39 lower bounds x 3 size columns = 117 literal cell checks; no eligibility gate is expected in this intermediate. +- name: Case 3, every published propane row and household column matches at its lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + bottled_gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, + 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, + 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, + 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [0, 0, 0, 840, 840, 840, 1_560, 1_560, 1_560, 2_280, 2_280, 2_280, 3_000, + 3_000, 3_000, 3_720, 3_720, 3_720, 4_440, 4_440, 4_440, 5_160, 5_160, 5_160, 5_880, 5_880, 5_880, + 6_600, 6_600, 6_600, 7_320, 7_320, 7_320, 8_040, 8_040, 8_040, 8_760, 8_760, 8_760, 9_480, 9_480, + 9_480, 10_200, 10_200, 10_200, 10_920, 10_920, 10_920, 11_640, 11_640, 11_640, 12_360, 12_360, + 12_360, 13_080, 13_080, 13_080, 13_800, 13_800, 13_800, 14_520, 14_520, 14_520, 15_240, 15_240, + 15_240, 15_960, 15_960, 15_960, 16_680, 16_680, 16_680, 17_400, 17_400, 17_400, 18_120, 18_120, + 18_120, 18_840, 18_840, 18_840, 19_560, 19_560, 19_560, 20_280, 20_280, 20_280, 21_000, 21_000, + 21_000, 22_440, 22_440, 22_440, 23_880, 23_880, 23_880, 24_120, 24_120, 24_120, 25_560, 25_560, + 25_560, 28_176, 28_176, 28_176, 36_852, 36_852, 36_852, 45_516, 45_516, 45_516, 54_180, 54_180, + 54_180, 62_844, 62_844, 62_844] + output: + ar_liheap_matrix_amount: [397, 472, 563, 380, 451, 545, 360, 436, 527, 342, 418, 506, 326, 397, + 490, 306, 380, 472, 293, 365, 451, 284, 352, 436, 278, 342, 418, 271, 334, 397, 262, 323, 380, + 253, 314, 360, 244, 306, 342, 235, 296, 326, 226, 288, 310, 216, 278, 299, 208, 269, 289, 198, + 260, 278, 190, 251, 269, 180, 242, 258, 170, 233, 250, 163, 223, 239, 156, 215, 229, 149, 205, + 220, 144, 197, 211, 138, 187, 202, 132, 178, 193, 127, 169, 184, 121, 160, 174, 116, 151, 166, + 110, 142, 156, 106, 132, 148, 100, 124, 138, 95, 114, 128, 89, 106, 120, 0, 96, 110, 0, 86, 102, + 0, 0, 92, 0, 0, 83] + + +# Original two-page fuel matrix: 39 lower bounds x 3 size columns = 117 literal cell checks; no eligibility gate is expected in this intermediate. +- name: Case 4, every published fueloil row and household column matches at its lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + fuel_oil_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, + 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, + 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, + 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [0, 0, 0, 840, 840, 840, 1_560, 1_560, 1_560, 2_280, 2_280, 2_280, 3_000, + 3_000, 3_000, 3_720, 3_720, 3_720, 4_440, 4_440, 4_440, 5_160, 5_160, 5_160, 5_880, 5_880, 5_880, + 6_600, 6_600, 6_600, 7_320, 7_320, 7_320, 8_040, 8_040, 8_040, 8_760, 8_760, 8_760, 9_480, 9_480, + 9_480, 10_200, 10_200, 10_200, 10_920, 10_920, 10_920, 11_640, 11_640, 11_640, 12_360, 12_360, + 12_360, 13_080, 13_080, 13_080, 13_800, 13_800, 13_800, 14_520, 14_520, 14_520, 15_240, 15_240, + 15_240, 15_960, 15_960, 15_960, 16_680, 16_680, 16_680, 17_400, 17_400, 17_400, 18_120, 18_120, + 18_120, 18_840, 18_840, 18_840, 19_560, 19_560, 19_560, 20_280, 20_280, 20_280, 21_000, 21_000, + 21_000, 22_440, 22_440, 22_440, 23_880, 23_880, 23_880, 24_120, 24_120, 24_120, 25_560, 25_560, + 25_560, 28_176, 28_176, 28_176, 36_852, 36_852, 36_852, 45_516, 45_516, 45_516, 54_180, 54_180, + 54_180, 62_844, 62_844, 62_844] + output: + ar_liheap_matrix_amount: [402, 478, 570, 385, 457, 552, 365, 442, 534, 347, 422, 514, 330, 402, + 497, 310, 385, 478, 296, 370, 457, 288, 356, 442, 282, 347, 422, 275, 337, 402, 265, 326, 385, + 257, 319, 365, 247, 310, 347, 238, 301, 330, 228, 292, 313, 220, 282, 302, 210, 272, 293, 200, + 264, 282, 192, 254, 272, 182, 245, 262, 173, 236, 252, 166, 227, 241, 158, 217, 233, 151, 209, + 223, 145, 199, 214, 140, 190, 204, 134, 180, 196, 128, 172, 186, 124, 162, 176, 118, 152, 168, + 110, 144, 158, 103, 134, 149, 96, 125, 140, 89, 116, 131, 82, 108, 122, 0, 98, 113, 0, 90, 104, + 0, 0, 95, 0, 0, 86] + + +# Original two-page fuel matrix: 39 lower bounds x 3 size columns = 117 literal cell checks; no eligibility gate is expected in this intermediate. +- name: Case 5, every published other row and household column matches at its lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, + AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + other_heating_fuel_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, + 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, + 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, + 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, + 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [0, 0, 0, 840, 840, 840, 1_560, 1_560, 1_560, 2_280, 2_280, 2_280, 3_000, + 3_000, 3_000, 3_720, 3_720, 3_720, 4_440, 4_440, 4_440, 5_160, 5_160, 5_160, 5_880, 5_880, 5_880, + 6_600, 6_600, 6_600, 7_320, 7_320, 7_320, 8_040, 8_040, 8_040, 8_760, 8_760, 8_760, 9_480, 9_480, + 9_480, 10_200, 10_200, 10_200, 10_920, 10_920, 10_920, 11_640, 11_640, 11_640, 12_360, 12_360, + 12_360, 13_080, 13_080, 13_080, 13_800, 13_800, 13_800, 14_520, 14_520, 14_520, 15_240, 15_240, + 15_240, 15_960, 15_960, 15_960, 16_680, 16_680, 16_680, 17_400, 17_400, 17_400, 18_120, 18_120, + 18_120, 18_840, 18_840, 18_840, 19_560, 19_560, 19_560, 20_280, 20_280, 20_280, 21_000, 21_000, + 21_000, 22_440, 22_440, 22_440, 23_880, 23_880, 23_880, 24_120, 24_120, 24_120, 25_560, 25_560, + 25_560, 28_176, 28_176, 28_176, 36_852, 36_852, 36_852, 45_516, 45_516, 45_516, 54_180, 54_180, + 54_180, 62_844, 62_844, 62_844] + output: + ar_liheap_matrix_amount: [289, 344, 410, 277, 330, 397, 263, 318, 384, 250, 305, 370, 238, 289, + 358, 223, 277, 344, 214, 266, 330, 208, 257, 318, 203, 250, 305, 198, 244, 289, 191, 235, 277, + 185, 230, 263, 178, 223, 250, 172, 216, 238, 164, 210, 226, 158, 203, 218, 151, 197, 211, 144, + 190, 203, 138, 184, 197, 131, 176, 188, 125, 170, 182, 119, 163, 174, 114, 156, 167, 109, 150, + 161, 104, 143, 154, 101, 137, 148, 97, 130, 140, 92, 124, 134, 89, 116, 127, 85, 110, 121, 79, + 103, 114, 74, 97, 107, 68, 90, 101, 64, 83, 94, 60, 77, 88, 0, 70, 80, 0, 64, 74, 0, 0, 67, 0, + 0, 61] + + +# Electric 3-4 column: 69.99 -> 288; 70 -> 276; 1989.99 -> 86; 1990 -> 80; 2009.99 -> 80; 2010 -> 76. The irregular 20-dollar band is preserved. +- name: Case 6, fractional income stays below the next published lower bound. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [3, 3, 3, 3, 3, 3] + ar_liheap_countable_income: [839.88, 840, 23_879.88, 23_880, 24_119.88, 24_120] + pre_subsidy_electricity_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + output: + ar_liheap_matrix_amount: [288, 276, 86, 80, 80, 76] + + +# Propane 0-69 row, groups 1-2, 3-4 and 5+; no fixed-matrix expense cap from a 50 annual bill. +- name: Case 7, within group sizes and large households share published payment columns. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + gas_expense: [1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [1, 2, 3, 4, 5, 8, 21] + ar_liheap_countable_income: [0, 0, 0, 0, 0, 0, 0] + bottled_gas_expense: [50, 50, 50, 50, 50, 50, 50] + output: + ar_liheap_matrix_amount: [397, 397, 472, 472, 563, 563, 563] + + +# Application fuel grouping maps kerosene to fuel oil; wood/coal/other use the other-fuel table. +- name: Case 8, kerosene wood and coal use their source supported fuel groups. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR] + heating_type: [KEROSENE, WOOD, COAL, OTHER] + gas_expense: [1_200, 1_200, 1_200, 1_200] + ar_liheap_household_size: [5, 5, 5, 5] + ar_liheap_countable_income: [0, 0, 0, 0] + fuel_oil_expense: [1_200, 1_200, 1_200, 1_200] + wood_expense: [1_200, 1_200, 1_200, 1_200] + coal_expense: [1_200, 1_200, 1_200, 1_200] + other_heating_fuel_expense: [1_200, 1_200, 1_200, 1_200] + output: + ar_liheap_matrix_amount: [570, 410, 410, 410] + + +# NONE affirmatively means no heating; no invented fuel fallback. +- name: Case 9, explicit no heating has no matrix amount. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: AR + heating_type: NONE + gas_expense: 1_200 + ar_liheap_household_size: 1 + ar_liheap_countable_income: 0 + output: + ar_liheap_matrix_amount: 0 + +# FFY2025 Electric matrix pp1-2: top bands start at 2250/2945/4330/5022/5140 (annual x12 = +# 27000/35340/51960/60264/61680) for sizes 1&2, 3&4, 5&up; 1390-1449 pays 91 for 1&2 +# (FY2026: 88). Annual 16800 = MCI 1400. +- name: Case 10, FY2025 electric top bands and a changed size one cell. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, ELECTRICITY, + ELECTRICITY] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1] + ar_liheap_countable_income: [27_000, 27_000, 27_000, 35_340, 35_340, 35_340, 51_960, 51_960, 51_960, + 60_264, 60_264, 60_264, 61_680, 61_680, 61_680, 16_800] + output: + ar_liheap_matrix_amount: [60, 64, 73, 0, 60, 67, 0, 0, 61, 0, 0, 60, 0, 0, 60, 91] + +# FFY2025 Natural Gas matrix p2: same top bands; 1450-1509 pays 163 for 5&up (FY2026: 162). +# Annual 17400 = MCI 1450. +- name: Case 11, FY2025 natural gas top bands and a changed large household cell. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, + NATURAL_GAS] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 5] + ar_liheap_countable_income: [27_000, 27_000, 27_000, 35_340, 35_340, 35_340, 51_960, 51_960, 51_960, + 60_264, 60_264, 60_264, 61_680, 61_680, 61_680, 17_400] + output: + ar_liheap_matrix_amount: [64, 82, 92, 60, 74, 85, 60, 60, 60, 0, 60, 60, 0, 0, 60, 163] + +# FFY2025 Propane matrix p2: same top bands; 1870-1989 pays 109 for 1&2 (FY2026: 110). +# Annual 22440 = MCI 1870. +- name: Case 12, FY2025 propane top bands and a changed size one cell. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, + PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE, PROPANE] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1] + ar_liheap_countable_income: [27_000, 27_000, 27_000, 35_340, 35_340, 35_340, 51_960, 51_960, 51_960, + 60_264, 60_264, 60_264, 61_680, 61_680, 61_680, 22_440] + output: + ar_liheap_matrix_amount: [80, 106, 119, 73, 96, 110, 66, 86, 109, 0, 77, 100, 0, 0, 90, 109] + +# FFY2025 Fuel Oil matrix p2: rows 2250-2944 through 5140-Max for sizes 1&2, 3&4, 5&up. +- name: Case 13, FY2025 fuel oil top bands. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, + FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL, FUEL_OIL] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [27_000, 27_000, 27_000, 35_340, 35_340, 35_340, 51_960, 51_960, 51_960, + 60_264, 60_264, 60_264, 61_680, 61_680, 61_680] + output: + ar_liheap_matrix_amount: [82, 107, 121, 74, 97, 112, 67, 88, 102, 0, 78, 92, 0, 0, 83] + +# FFY2025 Other/Wood/Pellets matrix p2: rows 2250-2944 through 5140-Max; the 5140-Max row pays 0 in +# every column (FY2026 pays 61 for 5&up). +- name: Case 14, FY2025 other fuel top bands. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR, AR] + heating_type: [OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, OTHER, + OTHER, OTHER] + ar_liheap_household_size: [1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5] + ar_liheap_countable_income: [27_000, 27_000, 27_000, 35_340, 35_340, 35_340, 51_960, 51_960, 51_960, + 60_264, 60_264, 60_264, 61_680, 61_680, 61_680] + output: + ar_liheap_matrix_amount: [60, 77, 88, 60, 70, 80, 60, 64, 74, 0, 60, 67, 0, 0, 0] + +# SOLAR and UNSPECIFIED have no supported fuel schedule, so the matrix pays 0 (unverified estimate). +# Electric at zero income pays 242 for 1&2 as a control; an empty qualified household pays 0. +- name: Case 15, solar unspecified fuel and an empty household have no matrix amount. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR, AR] + heating_type: [SOLAR, UNSPECIFIED, ELECTRICITY, ELECTRICITY] + pre_subsidy_electricity_expense: [1_800, 1_800, 1_800, 1_800] + ar_liheap_household_size: [1, 1, 1, 0] + ar_liheap_countable_income: [0, 0, 0, 0] + output: + ar_liheap_matrix_amount: [0, 0, 242, 0] diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap.py new file mode 100644 index 00000000000..d9a66ef4dab --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class ar_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Arkansas LIHEAP regular heating benefit" + defined_for = "ar_liheap_eligible" + documentation = ( + "Annual regular heating grant from the FY2025 and FY2026 fuel matrices. " + "Other years use parameter backfilling and are unverified estimates. " + "The proposed FY2027 increase is not treated as an adopted schedule." + ) + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=11" + ) + + def formula(spm_unit, period, parameters): + # Regular assistance is a fixed grant, not capped by the reported bill. + # Unsupported fuel mappings are documented in the matrix variable. + return spm_unit("ar_liheap_matrix_amount", period) diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.py new file mode 100644 index 00000000000..911e0e3f77e --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/ar_liheap_household_size.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class ar_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Arkansas LIHEAP household size" + defined_for = StateCode.AR + documentation = ( + "Number of citizens and qualified noncitizens in the household. Other " + "members' otherwise countable income remains included in full. The " + "FY2025 draft manual's composition rule is corroborated by the current " + "rights statement of a state-designated LIHEAP subgrantee." + ) + reference = ( + # Draft manual sections 4.4-4.4.1; not an adopted FY2026 manual. + # PDF pages 36-37 + "https://liheapch.acf.gov/sites/default/files/webfiles/docs/2025/manuals/AR_Manual%5Bdraft%5D_2025.pdf#page=36", + # Current operator's rights statement, item 9; no revision date shown. + "https://www.cscdc.net/rights-responsibilities-of-liheap-applicants/", + # State designation of CSCDC; revised May 11, 2026. + "https://adeq.state.ar.us/energy/initiatives/pdfs/LIHEAP-SubgranteeNetworkServiceTerritories.pdf#page=2", + ) + # Do not import SNAP-specific waiting periods or immigration restrictions. + # Qualified COFA/battered and other cases absent from immigration_status + # require an override of the existing qualified-status flag. Identity and + # immigration-document verification remain administrative assumptions. + adds = ["is_citizen_or_legal_immigrant"] diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.py new file mode 100644 index 00000000000..595778589b9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class ar_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Eligible for Arkansas LIHEAP regular heating assistance" + defined_for = StateCode.AR + # Plan question 1.4 and sections 2.1-2.3: no categorical income bypass or + # asset test; direct or indirect heating burden required. + # PDF pages 5, 9-10 + reference = "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=5" + + def formula(spm_unit, period, parameters): + size = spm_unit("ar_liheap_household_size", period) + income = spm_unit("ar_liheap_countable_income", period) + income_limit = spm_unit("ar_liheap_income_limit", period) + fuel = spm_unit("heating_type", period) + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + expense = spm_unit("heating_expense", period) + has_expense = spm_unit("has_heating_expense", period) + subsidized = spm_unit.household("is_in_public_housing", period) | spm_unit( + "receives_housing_assistance", period + ) + # For subsidized heat included in rent, a positive expense represents + # a verified excess charge. The general responsibility flag cannot + # substitute for this surcharge. Unsubsidized rent needs no extra bill. + rent_responsibility = ~subsidized | (expense > 0) + # A direct bill or obligation counts through has_heating_expense, which + # defaults to a positive primary-fuel bill with heat not in rent. An + # explicit false (for example, a bill fully reimbursed through a utility + # allowance, plan item 2.3) is respected. Verification is not modeled. + direct_responsibility = has_expense + heating_responsibility = where( + heat_in_rent, rent_responsibility, direct_responsibility + ) + return ( + (size > 0) + & (income <= income_limit) + & (fuel != fuel.possible_values.NONE) + & heating_responsibility + ) diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.py new file mode 100644 index 00000000000..9f02c69e172 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_countable_income.py @@ -0,0 +1,93 @@ +from policyengine_us.model_api import * + + +class ar_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Arkansas LIHEAP countable income" + defined_for = StateCode.AR + reference = ( + # FY2026 state plan sections 1.8 and 1.9. + # PDF pages 5-7 + "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=5", + # FY2025 state plan sections 1.8 and 1.9. + # PDF pages 5-7 + "https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=5", + # Draft manual sections 4.7 and 4.7.2 and Appendices E-F. + # PDF pages 41-43, 130-144 + "https://liheapch.acf.gov/sites/default/files/webfiles/docs/2025/manuals/AR_Manual%5Bdraft%5D_2025.pdf#page=41", + # Application section III. + "https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2", + # FY2025 application R 01/FY2025, section III (Wayback capture). + "https://web.archive.org/web/20250104155015/https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=2", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ee.aeo.liheap.income + person = spm_unit.members + age = person("age", period) + # Application Section III, in the FY2025 form (R 01/FY2025) and the + # current form (R 11/2025), requests work income only from members 18 + # and older who are not full-time students, with no student age or + # dependency limit, so the earnings of every minor and of every + # full-time student at any age are excluded. Manual section 4.7.3 + # (page 43) also exempts adult full-time students from the Zero Income + # Form, which fits this broad reading. The draft manual's narrower rules + # (page 41; Appendix F, pages 133-134) are not followed. The accepted + # plans leave a child's earnings unchecked. + counted_worker = (age >= p.earned_minimum_age) & ~person( + "is_full_time_student", period + ) + # Existing net business income approximates gross receipts. Additional + # business/work-expense deductions and new gross inputs are deferred. + # Each source is floored at zero, so a loss in one source cannot + # offset another. + earned_income = 0 + for source in p.sources.earned: + earned_income = earned_income + max_(person(source, period), 0) + countable_earnings = spm_unit.sum(earned_income * counted_worker) * ( + 1 - p.earned_disregard + ) + unearned_income = 0 + for source in p.sources.unearned: + unearned_income = unearned_income + max_(person(source, period), 0) + # Manual Appendix F (page 137) counts only the interest "amount over + # $200.00". The amount is monthly because unearned income is a month's + # receipts (page 41; Appendix E, pages 129-130, converts other + # frequencies to monthly). The manual does not say whose $200 it is; + # applying it to each recipient is a chosen reading, and a household- + # wide $200 would count more. Plan Section 1.9 (page 6) counts + # interest with no threshold. + annual_interest_disregard = p.interest_disregard * MONTHS_IN_YEAR + countable_interest = max_( + person("interest_income", period) - annual_interest_disregard, 0 + ) + # Plan section 1.9 counts Social Security "Excluding MediCare + # deduction", and manual section 4.7.2 excludes the Part B premium + # from Social Security and Railroad Retirement for members not + # eligible for Medicaid. medicare_part_b_premium is zero when not + # enrolled and excludes the share a Medicare Savings Program pays. + # Other medical deductions are not modeled. + ssa_and_railroad = max_(person("social_security", period), 0) + max_( + person("railroad_benefits", period), 0 + ) + premium = person("medicare_part_b_premium", period) + net_ssa_and_railroad = max_(ssa_and_railroad - premium, 0) + # Manual Appendix E (page 130) counts TEA once monthly; plan section + # 1.9 leaves TANF unchecked. The annual tanf aggregate includes ar_tea + # and applies take-up, so a nonrecipient's entitlement is not counted. + tea = spm_unit("tanf", period) + # Annual inputs approximate the month before application. Otherwise + # countable income from every member is included in full, even when + # that member is excluded from ar_liheap_household_size. + annual_income = ( + countable_earnings + + spm_unit.sum(unearned_income + countable_interest + net_ssa_and_railroad) + + tea + ) + # Manual page 42: round monthly countable income to the nearest whole + # dollar before the income limit and band tests. + monthly_income = np.floor(annual_income / MONTHS_IN_YEAR + 0.5) + return monthly_income * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py new file mode 100644 index 00000000000..ebcff76f8e7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ar_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Arkansas LIHEAP annualized income limit" + defined_for = StateCode.AR + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=9", + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf", + "https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=8", + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ee.aeo.liheap.income.limit + size = spm_unit("ar_liheap_household_size", period) + state = spm_unit.household("state_code_str", period) + monthly_smi = smi(size, state, period, parameters) * p.smi_rate / MONTHS_IN_YEAR + state_group = spm_unit.household("state_group_str", period) + capped_size = clip(size, 1, p.max_table_size) + guideline = fpg( + capped_size, state_group, period, parameters, year_lag=p.fpg_year_lag + ) + monthly_fpg = guideline * p.fpg_rate / MONTHS_IN_YEAR + monthly_base = where(size <= p.smi_max_size, monthly_smi, monthly_fpg) + # Half-up monthly rounding reproduces the published FY2025 and FY2026 + # tables; it is a reconciled numerical pattern, not an express rule. + rounding = p.rounding_increment + rounded_base = np.floor(monthly_base / rounding + 0.5) * rounding + # The charts add a printed amount for each person above size 20. + extra_people = max_(size - p.max_table_size, 0) + monthly_limit = rounded_base + extra_people * p.additional_member_amount + return where(size > 0, monthly_limit * MONTHS_IN_YEAR, 0) diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.py new file mode 100644 index 00000000000..40ac72a73e5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.py @@ -0,0 +1,73 @@ +from policyengine_us.model_api import * + + +class ar_liheap_matrix_amount(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Arkansas LIHEAP regular heating matrix amount" + defined_for = StateCode.AR + reference = ( + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Natural-Gas.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Propane.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Fuel-Oil.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Other-Wood-Pellets.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Natural-Gas.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Propane.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Fuel-Oil.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Other-Wood-Pellets.pdf#page=1", + # Application fuel groups. + "https://www.adeq.state.ar.us/energy/assistance/pdfs/fillable_aeo-9495_liheap-long-application.pdf#page=3", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ee.aeo.liheap.payment + income = spm_unit("ar_liheap_countable_income", period) / MONTHS_IN_YEAR + size = spm_unit("ar_liheap_household_size", period) + # Countable income is already rounded to whole monthly dollars, and + # the printed lower bounds are inclusive: $70 starts the second band. + band = p.income_band.calc(max_(income, 0)).astype(int) + size_group = p.household_size_group.calc(max_(size, 1)).astype(int) + fuel = spm_unit("heating_type", period) + fuels = fuel.possible_values + # FY2025 cells follow AEO's matrices headed "(20% OVER BASE)", dated + # October 7, 2024 and posted before the season, not FY2025 plan item + # 2.6's $50 to $475 estimate. The Clearinghouse "2025" Arkansas matrix + # repeats the FY2024 base amounts; 1.2 times them, rounded, gives the + # FY2025 cells in the 35 rows from $0 through $2,250. The top rows differ. + amount = select( + [ + fuel == fuels.ELECTRICITY, + fuel == fuels.NATURAL_GAS, + fuel == fuels.PROPANE, + (fuel == fuels.FUEL_OIL) | (fuel == fuels.KEROSENE), + (fuel == fuels.WOOD) | (fuel == fuels.COAL) | (fuel == fuels.OTHER), + ], + [ + p.matrix.electricity[band][size_group], + p.matrix.natural_gas[band][size_group], + p.matrix.propane[band][size_group], + p.matrix.fuel_oil[band][size_group], + p.matrix.other[band][size_group], + ], + # NONE has no heating. UNSPECIFIED and SOLAR have no supported + # schedule mapping; zero is an unverified estimate, not a legal + # eligibility determination, including when heat is in rent. + default=0, + ) + # This is the ungated table amount; ar_liheap applies eligibility. + # The fixed regular schedule has no actual-expense cap. + return where(size > 0, amount, 0)