policyengine-us 1.465.0__py3-none-any.whl → 1.471.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. policyengine_us/parameters/gov/hhs/medicaid/emergency_medicaid/enabled.yaml +14 -0
  2. policyengine_us/parameters/gov/hhs/medicaid/emergency_medicaid/uses_medicaid_income_thresholds.yaml +13 -0
  3. policyengine_us/parameters/gov/ssa/revenue/oasdi_share_of_gross_ss.yaml +13 -0
  4. policyengine_us/parameters/gov/states/il/isbe/age_threshold/teen_parent.yaml +15 -0
  5. policyengine_us/parameters/gov/states/il/isbe/income/countable_sources.yaml +28 -0
  6. policyengine_us/parameters/gov/states/il/isbe/income/income_limit_rate.yaml +13 -0
  7. policyengine_us/parameters/gov/states/il/isbe/pfa/benefit/amount.yaml +15 -0
  8. policyengine_us/parameters/gov/states/il/isbe/pfae/benefit/amount.yaml +15 -0
  9. policyengine_us/parameters/gov/states/il/isbe/pfae/eligibility/age_range.yaml +26 -0
  10. policyengine_us/parameters/gov/states/il/isbe/pfae/eligibility/income/deep_poverty_rate.yaml +10 -0
  11. policyengine_us/parameters/gov/states/il/isbe/pfae/eligibility/income/low_income_rate.yaml +10 -0
  12. policyengine_us/parameters/gov/states/il/isbe/pi/benefit/amount.yaml +16 -0
  13. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/child.yaml +13 -0
  14. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/age_threshold/young_parent.yaml +11 -0
  15. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/deep_poverty_rate.yaml +11 -0
  16. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/low_income_rate.yaml +11 -0
  17. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/income/poverty_rate.yaml +11 -0
  18. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/priority/geriatric_pregnancy_age.yaml +10 -0
  19. policyengine_us/parameters/gov/states/il/isbe/pi/eligibility/risk_factors/minimum_score.yaml +11 -0
  20. policyengine_us/parameters/gov/states/in/fssa/README.md +1 -0
  21. policyengine_us/parameters/gov/states/in/fssa/tanf/README.md +1 -0
  22. policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/continuing/fpg_rate.yaml +12 -0
  23. policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/benefit/earned_income_disregard/rate.yaml +12 -0
  24. policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/earned_income_disregard/rate.yaml +12 -0
  25. policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/eligibility/flat_disregard/amount.yaml +12 -0
  26. policyengine_us/parameters/gov/states/in/fssa/tanf/income/deductions/work_expense/amount.yaml +12 -0
  27. policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/at_application/amount.yaml +12 -0
  28. policyengine_us/parameters/gov/states/in/fssa/tanf/resources/limit/while_receiving/amount.yaml +12 -0
  29. policyengine_us/parameters/gov/states/in/fssa/tanf/resources/vehicle_exemption/amount.yaml +12 -0
  30. policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/amount.yaml +34 -0
  31. policyengine_us/parameters/gov/states/in/fssa/tanf/standard_of_need/max_unit_size.yaml +12 -0
  32. policyengine_us/parameters/gov/states/mo/tax/income/minimum_taxable_income.yaml +3 -0
  33. policyengine_us/parameters/gov/states/mo/tax/income/rates.yaml +13 -4
  34. policyengine_us/parameters/gov/states/mo/tax/income/subtractions/agi_subtractions.yaml +18 -0
  35. policyengine_us/parameters/gov/states/mo/tax/income/subtractions/net_capital_gain/rate.yaml +14 -0
  36. policyengine_us/parameters/gov/states/oh/odjfs/owf/income/deductions/earned_income_disregard/flat_amount.yaml +14 -0
  37. policyengine_us/parameters/gov/states/oh/odjfs/owf/income/deductions/earned_income_disregard/percentage_of_disregard.yaml +16 -0
  38. policyengine_us/parameters/gov/states/oh/odjfs/owf/initial_eligibility/income_limit_rate.yaml +14 -0
  39. policyengine_us/parameters/gov/states/oh/odjfs/owf/payment_standard/additional_person_increment.yaml +14 -0
  40. policyengine_us/parameters/gov/states/oh/odjfs/owf/payment_standard/amounts.yaml +43 -0
  41. policyengine_us/parameters/gov/states/oh/odjfs/owf/payment_standard/max_group_size.yaml +12 -0
  42. policyengine_us/parameters/gov/states/or/odhs/tanf/age_threshold/minor_child.yaml +12 -0
  43. policyengine_us/parameters/gov/states/or/odhs/tanf/income/adjusted_income_limit/additional_person.yaml +12 -0
  44. policyengine_us/parameters/gov/states/or/odhs/tanf/income/adjusted_income_limit/amount.yaml +32 -0
  45. policyengine_us/parameters/gov/states/or/odhs/tanf/income/child_support_disregard/max.yaml +12 -0
  46. policyengine_us/parameters/gov/states/or/odhs/tanf/income/child_support_disregard/per_child.yaml +12 -0
  47. policyengine_us/parameters/gov/states/or/odhs/tanf/income/countable_income_limit/additional_person.yaml +12 -0
  48. policyengine_us/parameters/gov/states/or/odhs/tanf/income/countable_income_limit/amount.yaml +32 -0
  49. policyengine_us/parameters/gov/states/or/odhs/tanf/income/earned_income_disregard_rate.yaml +12 -0
  50. policyengine_us/parameters/gov/states/or/odhs/tanf/income/eli_multiplier.yaml +12 -0
  51. policyengine_us/parameters/gov/states/or/odhs/tanf/maximum_need_group_size.yaml +12 -0
  52. policyengine_us/parameters/gov/states/or/odhs/tanf/minimum_benefit.yaml +12 -0
  53. policyengine_us/parameters/gov/states/or/odhs/tanf/payment_standard/additional_person.yaml +12 -0
  54. policyengine_us/parameters/gov/states/or/odhs/tanf/payment_standard/amount.yaml +32 -0
  55. policyengine_us/parameters/gov/states/or/odhs/tanf/resources/limit/amount.yaml +12 -0
  56. policyengine_us/tests/microsimulation/test_microsim.py +46 -0
  57. policyengine_us/tests/policy/baseline/gov/hhs/medicaid/emergency_medicaid/integration.yaml +667 -0
  58. policyengine_us/tests/policy/baseline/gov/hhs/medicaid/emergency_medicaid/is_emergency_medicaid_eligible.yaml +376 -0
  59. policyengine_us/tests/policy/baseline/gov/ssa/revenue/employer_medicare_tax_income_tax_revenue.yaml +86 -0
  60. policyengine_us/tests/policy/baseline/gov/ssa/revenue/employer_ss_tax_income_tax_revenue.yaml +85 -0
  61. policyengine_us/tests/policy/baseline/gov/ssa/revenue/tob_revenue_medicare_hi.yaml +40 -21
  62. policyengine_us/tests/policy/baseline/gov/ssa/revenue/tob_revenue_oasdi.yaml +57 -14
  63. policyengine_us/tests/policy/baseline/gov/ssa/revenue/tob_tier_split.yaml +17 -35
  64. policyengine_us/tests/policy/baseline/gov/states/il/isbe/eligibility/il_isbe_income_eligible.yaml +15 -0
  65. policyengine_us/tests/policy/baseline/gov/states/il/isbe/eligibility/il_isbe_was_teen_parent_at_first_birth.yaml +310 -0
  66. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/eligibility/il_pfae_age_eligible_child.yaml +39 -0
  67. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/eligibility/il_pfae_basic_eligible.yaml +26 -0
  68. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/eligibility/il_pfae_eligible.yaml +49 -0
  69. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/integration.yaml +102 -0
  70. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/priority/il_pfae_has_highest_priority_factor.yaml +31 -0
  71. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/priority/il_pfae_is_deep_poverty.yaml +15 -0
  72. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/priority/il_pfae_is_low_income.yaml +15 -0
  73. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pfae/priority/il_pfae_secondary_priority_factor_count.yaml +85 -0
  74. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.yaml +46 -0
  75. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.yaml +48 -0
  76. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_eligible.yaml +38 -0
  77. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.yaml +74 -0
  78. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.yaml +43 -0
  79. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.yaml +43 -0
  80. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.yaml +43 -0
  81. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.yaml +75 -0
  82. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.yaml +74 -0
  83. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.yaml +100 -0
  84. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.yaml +91 -0
  85. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.yaml +102 -0
  86. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.yaml +160 -0
  87. policyengine_us/tests/policy/baseline/gov/states/il/isbe/pi/integration.yaml +187 -0
  88. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_payment_standard.yaml +58 -0
  89. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml +163 -0
  90. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_eligible.yaml +94 -0
  91. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_income_eligible.yaml +74 -0
  92. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml +63 -0
  93. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml +64 -0
  94. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income.yaml +83 -0
  95. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.yaml +112 -0
  96. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_countable_income_for_payment.yaml +71 -0
  97. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml +249 -0
  98. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/in_tanf_countable_resources.yaml +38 -0
  99. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/in_tanf_resources_eligible.yaml +60 -0
  100. policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/resources/integration_with_eligibility.yaml +78 -0
  101. policyengine_us/tests/policy/baseline/gov/states/mo/tax/income/subtractions/mo_agi_subtractions.yaml +176 -0
  102. policyengine_us/tests/policy/baseline/gov/states/mo/tax/income/subtractions/mo_capital_gains_subtraction.yaml +65 -0
  103. policyengine_us/tests/policy/baseline/gov/states/nc/tax/income/deductions/nc_itemized_deductions.yaml +2 -2
  104. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/integration.yaml +152 -0
  105. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_countable_income.yaml +113 -0
  106. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_eligible.yaml +239 -0
  107. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_fpg.yaml +73 -0
  108. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_income_eligible.yaml +80 -0
  109. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_initial_income_eligible.yaml +160 -0
  110. policyengine_us/tests/policy/baseline/gov/states/oh/odjfs/owf/oh_owf_payment_standard.yaml +77 -0
  111. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/integration.yaml +363 -0
  112. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf.yaml +94 -0
  113. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_adjusted_income.yaml +77 -0
  114. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_adjusted_income_eligible.yaml +73 -0
  115. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_child_support_disregard.yaml +272 -0
  116. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_countable_income.yaml +70 -0
  117. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_countable_income_eligible.yaml +73 -0
  118. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_eli_eligible.yaml +47 -0
  119. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_eli_income_eligible.yaml +75 -0
  120. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_eligible.yaml +68 -0
  121. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_income_eligible.yaml +211 -0
  122. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_payment_standard.yaml +68 -0
  123. policyengine_us/tests/policy/baseline/gov/states/or/odhs/tanf/or_tanf_resources_eligible.yaml +37 -0
  124. policyengine_us/tests/run_selective_tests.py +5 -0
  125. policyengine_us/tests/test_batched.py +106 -11
  126. policyengine_us/variables/gov/hhs/medicaid/emergency_medicaid/has_emergency_medical_condition.py +16 -0
  127. policyengine_us/variables/gov/hhs/medicaid/emergency_medicaid/is_emergency_medicaid_eligible.py +33 -0
  128. policyengine_us/variables/gov/ssa/revenue/employer_medicare_tax_income_tax_revenue.py +58 -0
  129. policyengine_us/variables/gov/ssa/revenue/employer_ss_tax_income_tax_revenue.py +60 -0
  130. policyengine_us/variables/gov/ssa/revenue/tob_revenue_medicare_hi.py +51 -15
  131. policyengine_us/variables/gov/ssa/revenue/tob_revenue_oasdi.py +66 -15
  132. policyengine_us/variables/gov/ssa/revenue/tob_revenue_total.py +11 -6
  133. policyengine_us/variables/gov/states/il/isbe/eligibility/il_isbe_income_eligible.py +26 -0
  134. policyengine_us/variables/gov/states/il/isbe/eligibility/il_isbe_was_teen_parent_at_first_birth.py +32 -0
  135. policyengine_us/variables/gov/states/il/isbe/income/il_isbe_countable_income.py +13 -0
  136. policyengine_us/variables/gov/states/il/isbe/pfa/il_pfa.py +15 -0
  137. policyengine_us/variables/gov/states/il/isbe/pfa/il_pfa_eligible.py +18 -0
  138. policyengine_us/variables/gov/states/il/isbe/pfae/eligibility/il_pfae_age_eligible_child.py +23 -0
  139. policyengine_us/variables/gov/states/il/isbe/pfae/eligibility/il_pfae_basic_eligible.py +19 -0
  140. policyengine_us/variables/gov/states/il/isbe/pfae/eligibility/il_pfae_eligible.py +28 -0
  141. policyengine_us/variables/gov/states/il/isbe/pfae/il_pfae.py +19 -0
  142. policyengine_us/variables/gov/states/il/isbe/pfae/priority/il_pfae_has_highest_priority_factor.py +40 -0
  143. policyengine_us/variables/gov/states/il/isbe/pfae/priority/il_pfae_is_deep_poverty.py +23 -0
  144. policyengine_us/variables/gov/states/il/isbe/pfae/priority/il_pfae_is_low_income.py +21 -0
  145. policyengine_us/variables/gov/states/il/isbe/pfae/priority/il_pfae_secondary_priority_factor_count.py +65 -0
  146. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_basic_eligible.py +17 -0
  147. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_demographic_eligible.py +18 -0
  148. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/il_pi_risk_eligible.py +18 -0
  149. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_deep_poverty.py +23 -0
  150. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_low_income.py +21 -0
  151. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/income/il_pi_is_poverty.py +21 -0
  152. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_developmental_delay.py +16 -0
  153. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_has_geriatric_pregnancy.py +20 -0
  154. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_highest_priority_score.py +37 -0
  155. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_is_young_parent_family.py +21 -0
  156. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_lower_priority_score.py +36 -0
  157. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_other_priority_score.py +54 -0
  158. policyengine_us/variables/gov/states/il/isbe/pi/eligibility/priority/il_pi_priority_score.py +19 -0
  159. policyengine_us/variables/gov/states/il/isbe/pi/il_pi.py +15 -0
  160. policyengine_us/variables/gov/states/il/isbe/pi/il_pi_eligible.py +18 -0
  161. policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py +31 -0
  162. policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_eligible.py +36 -0
  163. policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_income_eligible.py +21 -0
  164. policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py +18 -0
  165. policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_resources_eligible.py +25 -0
  166. policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py +21 -0
  167. policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py +19 -0
  168. policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income.py +20 -0
  169. policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_earned_income_for_eligibility.py +33 -0
  170. policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_income_for_eligibility.py +19 -0
  171. policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_countable_income_for_payment.py +13 -0
  172. policyengine_us/variables/gov/states/in/fssa/tanf/resources/in_tanf_countable_resources.py +27 -0
  173. policyengine_us/variables/gov/states/mo/tax/income/adjusted_gross_income/mo_adjusted_gross_income.py +1 -1
  174. policyengine_us/variables/gov/states/mo/tax/income/subtractions/mo_agi_subtractions.py +16 -0
  175. policyengine_us/variables/gov/states/mo/tax/income/subtractions/mo_capital_gains_subtraction.py +20 -0
  176. policyengine_us/variables/gov/states/mo/tax/income/subtractions/mo_capital_gains_subtraction_person.py +28 -0
  177. policyengine_us/variables/gov/states/oh/odjfs/owf/eligibility/oh_owf_eligible.py +39 -0
  178. policyengine_us/variables/gov/states/oh/odjfs/owf/eligibility/oh_owf_income_eligible.py +33 -0
  179. policyengine_us/variables/gov/states/oh/odjfs/owf/eligibility/oh_owf_initial_income_eligible.py +30 -0
  180. policyengine_us/variables/gov/states/oh/odjfs/owf/income/oh_owf_countable_income.py +40 -0
  181. policyengine_us/variables/gov/states/oh/odjfs/owf/oh_owf.py +23 -0
  182. policyengine_us/variables/gov/states/oh/odjfs/owf/oh_owf_fpg.py +32 -0
  183. policyengine_us/variables/gov/states/oh/odjfs/owf/oh_owf_payment_standard.py +26 -0
  184. policyengine_us/variables/gov/states/or/odhs/tanf/benefit/or_tanf_payment_standard.py +23 -0
  185. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_adjusted_income_eligible.py +28 -0
  186. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_countable_income_eligible.py +28 -0
  187. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_eli_eligible.py +16 -0
  188. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_eli_income_eligible.py +20 -0
  189. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_eligible.py +25 -0
  190. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_income_eligible.py +26 -0
  191. policyengine_us/variables/gov/states/or/odhs/tanf/eligibility/or_tanf_resources_eligible.py +19 -0
  192. policyengine_us/variables/gov/states/or/odhs/tanf/income/or_tanf_adjusted_income.py +21 -0
  193. policyengine_us/variables/gov/states/or/odhs/tanf/income/or_tanf_child_support_disregard.py +25 -0
  194. policyengine_us/variables/gov/states/or/odhs/tanf/income/or_tanf_countable_income.py +20 -0
  195. policyengine_us/variables/gov/states/or/odhs/tanf/or_tanf.py +25 -0
  196. policyengine_us/variables/household/demographic/geographic/county/county.py +9 -0
  197. policyengine_us/variables/household/demographic/geographic/is_non_english_speaking_home.py +9 -0
  198. policyengine_us/variables/household/demographic/household/parent_has_less_than_high_school_education.py +9 -0
  199. policyengine_us/variables/household/demographic/person/has_developmental_delay.py +9 -0
  200. policyengine_us/variables/household/demographic/person/has_individualized_education_program.py +9 -0
  201. policyengine_us/variables/household/demographic/person/has_no_prior_formal_early_learning.py +9 -0
  202. policyengine_us/variables/household/demographic/person/is_born_outside_us.py +9 -0
  203. {policyengine_us-1.465.0.dist-info → policyengine_us-1.471.0.dist-info}/METADATA +1 -1
  204. {policyengine_us-1.465.0.dist-info → policyengine_us-1.471.0.dist-info}/RECORD +207 -19
  205. {policyengine_us-1.465.0.dist-info → policyengine_us-1.471.0.dist-info}/WHEEL +0 -0
  206. {policyengine_us-1.465.0.dist-info → policyengine_us-1.471.0.dist-info}/entry_points.txt +0 -0
  207. {policyengine_us-1.465.0.dist-info → policyengine_us-1.471.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,58 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class employer_medicare_tax_income_tax_revenue(Variable):
5
+ value_type = float
6
+ entity = TaxUnit
7
+ definition_period = YEAR
8
+ label = "Income tax revenue from taxing employer Medicare contributions"
9
+ documentation = (
10
+ "Marginal income tax revenue attributable to including employer "
11
+ "Medicare contributions in taxable income. This revenue "
12
+ "is credited to the Medicare HI trust fund."
13
+ )
14
+ unit = USD
15
+
16
+ def formula(tax_unit, period, parameters):
17
+ """
18
+ Calculate Medicare HI trust fund revenue from employer Medicare taxation.
19
+
20
+ Method:
21
+ 1. Get current income_tax (with BOTH SS + Medicare in AGI from reform)
22
+ 2. Branch: Neutralize employer_medicare_tax, recalculate income_tax
23
+ 3. Medicare revenue = current_tax - tax_without_medicare
24
+
25
+ This isolates the marginal tax contribution from employer Medicare by
26
+ neutralizing the source variable, letting the reform formula
27
+ naturally exclude Medicare when calculating gross income.
28
+ """
29
+ sim = tax_unit.simulation
30
+
31
+ # Check if reform is active
32
+ p = parameters(period).gov.contrib.crfb.tax_employer_payroll_tax
33
+ if not p.in_effect:
34
+ return tax_unit.empty_array()
35
+
36
+ # Current tax (with reform - both SS and Medicare in AGI)
37
+ tax_full = tax_unit("income_tax", period)
38
+
39
+ # === Branch: Tax WITHOUT employer Medicare (neutralize source) ===
40
+ branch = sim.get_branch("without_employer_medicare", clone_system=True)
41
+
42
+ # Neutralize the source variable - reform formula will pick up 0 for Medicare
43
+ branch.tax_benefit_system.neutralize_variable("employer_medicare_tax")
44
+
45
+ # Clear cached calculations
46
+ input_vars = set(branch.input_variables)
47
+ for var_name in list(branch.tax_benefit_system.variables.keys()):
48
+ if var_name not in input_vars:
49
+ try:
50
+ branch.delete_arrays(var_name)
51
+ except:
52
+ pass
53
+
54
+ tax_without_medicare = branch.tax_unit("income_tax", period)
55
+ del sim.branches["without_employer_medicare"]
56
+
57
+ # Medicare revenue = tax with full reform - tax without Medicare
58
+ return max_(tax_full - tax_without_medicare, 0)
@@ -0,0 +1,60 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class employer_ss_tax_income_tax_revenue(Variable):
5
+ value_type = float
6
+ entity = TaxUnit
7
+ definition_period = YEAR
8
+ label = "Income tax revenue from taxing employer SS contributions"
9
+ documentation = (
10
+ "Marginal income tax revenue attributable to including employer "
11
+ "Social Security contributions in taxable income. This revenue "
12
+ "is credited to the OASDI trust funds."
13
+ )
14
+ unit = USD
15
+
16
+ def formula(tax_unit, period, parameters):
17
+ """
18
+ Calculate OASDI trust fund revenue from employer SS taxation.
19
+
20
+ Method:
21
+ 1. Get current income_tax (with BOTH SS + Medicare in AGI from reform)
22
+ 2. Branch: Neutralize employer_social_security_tax, recalculate income_tax
23
+ 3. SS revenue = current_tax - tax_without_ss
24
+
25
+ This isolates the marginal tax contribution from employer SS by
26
+ neutralizing the source variable, letting the reform formula
27
+ naturally exclude SS when calculating gross income.
28
+ """
29
+ sim = tax_unit.simulation
30
+
31
+ # Check if reform is active
32
+ p = parameters(period).gov.contrib.crfb.tax_employer_payroll_tax
33
+ if not p.in_effect:
34
+ return tax_unit.empty_array()
35
+
36
+ # Current tax (with reform - both SS and Medicare in AGI)
37
+ tax_full = tax_unit("income_tax", period)
38
+
39
+ # === Branch: Tax WITHOUT employer SS (neutralize source) ===
40
+ branch = sim.get_branch("without_employer_ss", clone_system=True)
41
+
42
+ # Neutralize the source variable - reform formula will pick up 0 for SS
43
+ branch.tax_benefit_system.neutralize_variable(
44
+ "employer_social_security_tax"
45
+ )
46
+
47
+ # Clear cached calculations
48
+ input_vars = set(branch.input_variables)
49
+ for var_name in list(branch.tax_benefit_system.variables.keys()):
50
+ if var_name not in input_vars:
51
+ try:
52
+ branch.delete_arrays(var_name)
53
+ except:
54
+ pass
55
+
56
+ tax_without_ss = branch.tax_unit("income_tax", period)
57
+ del sim.branches["without_employer_ss"]
58
+
59
+ # SS revenue = tax with full reform - tax without SS
60
+ return max_(tax_full - tax_without_ss, 0)
@@ -5,27 +5,63 @@ class tob_revenue_medicare_hi(Variable):
5
5
  value_type = float
6
6
  entity = TaxUnit
7
7
  definition_period = YEAR
8
- label = "Medicare HI trust fund revenue from SS benefit taxation (tier 2)"
9
- documentation = "Tax revenue from tier 2 (50-85%) Social Security benefit taxation credited to Medicare HI trust fund"
8
+ label = "Medicare HI trust fund revenue from SS benefit taxation"
9
+ documentation = (
10
+ "Tax revenue credited to Medicare HI trust fund per 42 U.S.C. 401 note. "
11
+ "Per Section 121(e) as amended by OBRA 1993, HI receives the 'increase "
12
+ "in tax liabilities attributable to' the 1993 amendments. "
13
+ "Calculated using branching to isolate marginal tax impact."
14
+ )
10
15
  unit = USD
16
+ reference = "https://www.law.cornell.edu/uscode/text/42/401"
11
17
 
12
18
  def formula(tax_unit, period, parameters):
13
19
  """
14
- Calculate Medicare HI trust fund revenue from tier 2 SS taxation.
20
+ Calculate Medicare HI trust fund revenue using double-branching.
15
21
 
16
- Allocates total TOB revenue to Medicare HI based on tier 2's proportion
17
- of total taxable SS.
22
+ HI gets the marginal tax impact of adding the portion of taxable SS
23
+ above 50% of gross (the 1993 amendment increment).
24
+
25
+ Method:
26
+ 1. Calculate tax with 50% of gross SS taxable (capped)
27
+ 2. Calculate tax with FULL taxable SS (current law)
28
+ 3. HI revenue = (2) - (1)
18
29
  """
19
- # Get total TOB revenue
20
- total_tob = tax_unit("tob_revenue_total", period)
30
+ sim = tax_unit.simulation
31
+ p = parameters(period).gov.ssa.revenue
32
+
33
+ # Get current values
34
+ gross_ss = tax_unit("tax_unit_social_security", period)
35
+ taxable_ss = tax_unit("tax_unit_taxable_social_security", period)
36
+
37
+ # Calculate the OASDI share cap
38
+ oasdi_share = p.oasdi_share_of_gross_ss * gross_ss
39
+ capped_taxable_ss = min_(taxable_ss, oasdi_share)
40
+
41
+ # === Current tax (with full taxable SS) ===
42
+ tax_full_ss = tax_unit("income_tax", period)
43
+
44
+ # === Branch: Tax with CAPPED taxable SS (50% of gross) ===
45
+ branch_capped = sim.get_branch("hi_capped", clone_system=True)
46
+
47
+ # Clear only non-input cached calculations before setting new value
48
+ input_vars = set(branch_capped.input_variables)
49
+ for var_name in list(
50
+ branch_capped.tax_benefit_system.variables.keys()
51
+ ):
52
+ if var_name not in input_vars:
53
+ try:
54
+ branch_capped.delete_arrays(var_name)
55
+ except:
56
+ pass
21
57
 
22
- # Get tier amounts
23
- tier1 = tax_unit("taxable_social_security_tier_1", period)
24
- tier2 = tax_unit("taxable_social_security_tier_2", period)
25
- total_taxable = tier1 + tier2
58
+ # Set taxable SS to the capped amount using holder
59
+ tax_unit_pop = branch_capped.populations["tax_unit"]
60
+ holder = tax_unit_pop.get_holder("tax_unit_taxable_social_security")
61
+ holder.set_input(period, capped_taxable_ss)
26
62
 
27
- # Allocate total TOB based on tier 2 proportion
28
- # Use where to handle division by zero
29
- medicare_share = where(total_taxable > 0, tier2 / total_taxable, 0)
63
+ tax_capped_ss = branch_capped.tax_unit("income_tax", period)
64
+ del sim.branches["hi_capped"]
30
65
 
31
- return total_tob * medicare_share
66
+ # HI revenue = tax with full SS - tax with 50% cap
67
+ return max_(tax_full_ss - tax_capped_ss, 0)
@@ -5,27 +5,78 @@ class tob_revenue_oasdi(Variable):
5
5
  value_type = float
6
6
  entity = TaxUnit
7
7
  definition_period = YEAR
8
- label = "OASDI trust fund revenue from SS benefit taxation (tier 1)"
9
- documentation = "Tax revenue from tier 1 (0-50%) Social Security benefit taxation credited to OASDI trust funds"
8
+ label = "OASDI trust fund revenue from SS benefit taxation"
9
+ documentation = (
10
+ "Tax revenue credited to OASDI trust funds per 42 U.S.C. 401 note. "
11
+ "Per Section 121(e) of PL 98-21, OASDI receives the 'increase in tax "
12
+ "liabilities attributable to' section 86 LESS the 1993 amendments. "
13
+ "Calculated using branching to isolate marginal tax impact."
14
+ )
10
15
  unit = USD
16
+ reference = "https://www.law.cornell.edu/uscode/text/42/401"
11
17
 
12
18
  def formula(tax_unit, period, parameters):
13
19
  """
14
- Calculate OASDI trust fund revenue from tier 1 SS taxation.
20
+ Calculate OASDI trust fund revenue using double-branching.
15
21
 
16
- Allocates total TOB revenue to OASDI based on tier 1's proportion
17
- of total taxable SS.
22
+ OASDI gets the marginal tax impact of adding the first 50% of
23
+ gross SS benefits to taxable income.
24
+
25
+ Method:
26
+ 1. Calculate tax with NO taxable SS
27
+ 2. Calculate tax with 50% of gross SS taxable (capped)
28
+ 3. OASDI revenue = (2) - (1)
18
29
  """
19
- # Get total TOB revenue
20
- total_tob = tax_unit("tob_revenue_total", period)
30
+ sim = tax_unit.simulation
31
+ p = parameters(period).gov.ssa.revenue
32
+
33
+ # Get current values
34
+ gross_ss = tax_unit("tax_unit_social_security", period)
35
+ taxable_ss = tax_unit("tax_unit_taxable_social_security", period)
36
+
37
+ # Calculate the OASDI share cap - the original 1983 tier
38
+ oasdi_share = p.oasdi_share_of_gross_ss * gross_ss
39
+ capped_taxable_ss = min_(taxable_ss, oasdi_share)
40
+
41
+ # === Branch 1: Tax with NO taxable SS ===
42
+ branch_no_ss = sim.get_branch("oasdi_no_ss", clone_system=True)
43
+ branch_no_ss.tax_benefit_system.neutralize_variable(
44
+ "tax_unit_taxable_social_security"
45
+ )
46
+
47
+ # Clear only non-input cached calculations
48
+ input_vars = set(branch_no_ss.input_variables)
49
+ for var_name in list(branch_no_ss.tax_benefit_system.variables.keys()):
50
+ if var_name not in input_vars:
51
+ try:
52
+ branch_no_ss.delete_arrays(var_name)
53
+ except:
54
+ pass
55
+
56
+ tax_no_ss = branch_no_ss.tax_unit("income_tax", period)
57
+ del sim.branches["oasdi_no_ss"]
58
+
59
+ # === Branch 2: Tax with CAPPED taxable SS (50% of gross) ===
60
+ branch_capped = sim.get_branch("oasdi_capped", clone_system=True)
61
+
62
+ # Clear only non-input cached calculations before setting new value
63
+ input_vars = set(branch_capped.input_variables)
64
+ for var_name in list(
65
+ branch_capped.tax_benefit_system.variables.keys()
66
+ ):
67
+ if var_name not in input_vars:
68
+ try:
69
+ branch_capped.delete_arrays(var_name)
70
+ except:
71
+ pass
21
72
 
22
- # Get tier amounts
23
- tier1 = tax_unit("taxable_social_security_tier_1", period)
24
- tier2 = tax_unit("taxable_social_security_tier_2", period)
25
- total_taxable = tier1 + tier2
73
+ # Set taxable SS to the capped amount using holder
74
+ tax_unit_pop = branch_capped.populations["tax_unit"]
75
+ holder = tax_unit_pop.get_holder("tax_unit_taxable_social_security")
76
+ holder.set_input(period, capped_taxable_ss)
26
77
 
27
- # Allocate total TOB based on tier 1 proportion
28
- # Use where to handle division by zero
29
- oasdi_share = where(total_taxable > 0, tier1 / total_taxable, 0)
78
+ tax_capped_ss = branch_capped.tax_unit("income_tax", period)
79
+ del sim.branches["oasdi_capped"]
30
80
 
31
- return total_tob * oasdi_share
81
+ # OASDI revenue = tax with 50% cap - tax with no SS
82
+ return max_(tax_capped_ss - tax_no_ss, 0)
@@ -6,15 +6,19 @@ class tob_revenue_total(Variable):
6
6
  entity = TaxUnit
7
7
  definition_period = YEAR
8
8
  label = "Total trust fund revenue from SS benefit taxation"
9
- documentation = "Tax revenue from taxation of Social Security benefits using branching methodology"
9
+ documentation = (
10
+ "Tax revenue from taxation of Social Security benefits using "
11
+ "branching methodology per 42 U.S.C. 401 note."
12
+ )
10
13
  unit = USD
14
+ reference = "https://www.law.cornell.edu/uscode/text/42/401"
11
15
 
12
16
  def formula(tax_unit, period, parameters):
13
17
  """
14
- Calculate trust fund revenue using branching + neutralization.
18
+ Calculate total trust fund revenue using branching + neutralization.
15
19
 
16
- This is the CORRECT way to isolate TOB revenue, superior to the
17
- average effective tax rate approximation.
20
+ This isolates the tax impact of including taxable SS in AGI by
21
+ comparing tax with and without taxable SS.
18
22
  """
19
23
  sim = tax_unit.simulation
20
24
 
@@ -27,9 +31,10 @@ class tob_revenue_total(Variable):
27
31
  "tax_unit_taxable_social_security"
28
32
  )
29
33
 
30
- # Delete all calculated variables to force recalculation
34
+ # Delete non-input cached variables to force recalculation
35
+ input_vars = set(branch.input_variables)
31
36
  for var_name in list(branch.tax_benefit_system.variables.keys()):
32
- if var_name not in branch.input_variables:
37
+ if var_name not in input_vars:
33
38
  try:
34
39
  branch.delete_arrays(var_name)
35
40
  except:
@@ -0,0 +1,26 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_isbe_income_eligible(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = (
8
+ "Meets income requirements for Illinois ISBE early childhood programs"
9
+ )
10
+ definition_period = YEAR
11
+ reference = (
12
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
13
+ "https://law.onecle.com/illinois/105ilcs5/2-3.71.html",
14
+ )
15
+ defined_for = StateCode.IL
16
+
17
+ def formula(person, period, parameters):
18
+ # Income must be at or below 400% FPL for program eligibility.
19
+ # 105 ILCS 5/2-3.71 establishes "4 times the poverty guidelines" as the
20
+ # maximum income threshold for preschool program eligibility.
21
+ p = parameters(period).gov.states.il.isbe.income
22
+ spm_unit = person.spm_unit
23
+ fpg = spm_unit("spm_unit_fpg", period)
24
+ income = spm_unit("il_isbe_countable_income", period)
25
+ threshold = fpg * p.income_limit_rate
26
+ return income <= threshold
@@ -0,0 +1,32 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_isbe_was_teen_parent_at_first_birth(Variable):
5
+ value_type = bool
6
+ entity = SPMUnit
7
+ label = "Parent was a teen at birth of first child"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf"
11
+ )
12
+ defined_for = StateCode.IL
13
+
14
+ def formula(spm_unit, period, parameters):
15
+ person = spm_unit.members
16
+ age = person("age", period.this_year)
17
+ is_child = person("is_child", period.this_year)
18
+
19
+ # Find oldest child using get_rank (rank 0 = oldest when using -age)
20
+ is_oldest_child = person.get_rank(spm_unit, -age, is_child) == 0
21
+
22
+ # Get ages
23
+ head_age = spm_unit.max(age * person("is_tax_unit_head", period))
24
+ oldest_child_age = spm_unit.max(age * is_oldest_child)
25
+
26
+ # Calculate parent's age at first birth
27
+ age_at_first_birth = head_age - oldest_child_age
28
+
29
+ # Check if parent was under threshold age at birth and has children
30
+ p = parameters(period).gov.states.il.isbe.age_threshold
31
+ has_children = spm_unit.any(is_child)
32
+ return has_children & (age_at_first_birth < p.teen_parent)
@@ -0,0 +1,13 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_isbe_countable_income(Variable):
5
+ value_type = float
6
+ entity = SPMUnit
7
+ label = "Illinois ISBE countable income"
8
+ unit = USD
9
+ definition_period = YEAR
10
+ reference = "https://www.isbe.net/Documents/Income-Verification-FAQ.pdf"
11
+ defined_for = StateCode.IL
12
+
13
+ adds = "gov.states.il.isbe.income.countable_sources"
@@ -0,0 +1,15 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfa(Variable):
5
+ value_type = float
6
+ entity = Person
7
+ label = "Illinois Preschool For All (PFA) benefit"
8
+ definition_period = YEAR
9
+ unit = USD
10
+ reference = (
11
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
12
+ "https://gov-pritzker-newsroom.prezly.com/gov-pritzker-announces-5150-new-preschool-seats-through-smart-start-initiative",
13
+ )
14
+ defined_for = "il_pfa_eligible"
15
+ adds = ["gov.states.il.isbe.pfa.benefit.amount"]
@@ -0,0 +1,18 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfa_eligible(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Eligible for Illinois Preschool For All (PFA)"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf",
12
+ )
13
+ defined_for = StateCode.IL
14
+ # PFA and PFAE share identical eligibility criteria. The difference is
15
+ # service level: PFA provides half-day, PFAE provides full-day programs.
16
+ # A child receives one or the other based on local program availability,
17
+ # not both simultaneously.
18
+ adds = ["il_pfae_eligible"]
@@ -0,0 +1,23 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_age_eligible_child(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Child meets age requirements for Illinois PFAE"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf",
12
+ )
13
+ defined_for = StateCode.IL
14
+
15
+ def formula(person, period, parameters):
16
+ # PFA/PFAE serves children ages 3-4, plus 5-year-olds not yet
17
+ # kindergarten eligible. Per 105 ILCS 5/10-20.12, children who
18
+ # turn 5 on or before September 1 are kindergarten eligible.
19
+ # Since PolicyEngine uses age in whole years without birth month,
20
+ # we include all 5-year-olds as a simplification (some are eligible).
21
+ p = parameters(period).gov.states.il.isbe.pfae.eligibility
22
+ age = person("age", period)
23
+ return p.age_range.calc(age)
@@ -0,0 +1,19 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_basic_eligible(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Meets basic eligibility for Illinois PFAE (age and income)"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf",
12
+ )
13
+ defined_for = StateCode.IL
14
+
15
+ def formula(person, period, parameters):
16
+ # Basic eligibility: age 3-5 and income <= 400% FPL
17
+ age_eligible = person("il_pfae_age_eligible_child", period)
18
+ income_eligible = person("il_isbe_income_eligible", period)
19
+ return age_eligible & income_eligible
@@ -0,0 +1,28 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_eligible(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Eligible for Illinois Preschool For All Expansion (PFAE)"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf#page=2",
12
+ )
13
+ defined_for = StateCode.IL
14
+
15
+ def formula(person, period, parameters):
16
+ # PFAE eligibility requires:
17
+ # - Basic eligibility (age 3-5, income <= 400% FPL)
18
+ # - AND either:
19
+ # - Any highest priority factor (direct enrollment), OR
20
+ # - 2+ secondary priority factors
21
+ basic_eligible = person("il_pfae_basic_eligible", period)
22
+ has_highest_priority = person(
23
+ "il_pfae_has_highest_priority_factor", period
24
+ )
25
+ secondary_count = person(
26
+ "il_pfae_secondary_priority_factor_count", period
27
+ )
28
+ return basic_eligible & (has_highest_priority | (secondary_count >= 2))
@@ -0,0 +1,19 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae(Variable):
5
+ value_type = float
6
+ entity = Person
7
+ label = "Illinois Preschool For All Expansion (PFAE) benefit"
8
+ definition_period = YEAR
9
+ unit = USD
10
+ reference = (
11
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
12
+ "https://gov-pritzker-newsroom.prezly.com/gov-pritzker-announces-5150-new-preschool-seats-through-smart-start-initiative",
13
+ )
14
+ defined_for = "il_pfae_eligible"
15
+ # PFA and PFAE share identical eligibility criteria. The difference is
16
+ # service level: PFA provides half-day, PFAE provides full-day programs.
17
+ # A child receives one or the other based on local program availability,
18
+ # not both simultaneously.
19
+ adds = ["gov.states.il.isbe.pfae.benefit.amount"]
@@ -0,0 +1,40 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_has_highest_priority_factor(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Has highest priority selection factor for Illinois PFAE"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf#page=2",
12
+ )
13
+ defined_for = StateCode.IL
14
+
15
+ def formula(person, period, parameters):
16
+ # Highest priority selection factors (50 points each):
17
+ # 1. Homeless (McKinney-Vento)
18
+ # 2. Child welfare involvement (foster care, Ward of State)
19
+ # 3. Has IEP or referred for special education evaluation
20
+ # 4. Family income at or below 50% FPL and/or receiving TANF
21
+ # Factor 1: Homeless
22
+ is_homeless = person.household("is_homeless", period)
23
+
24
+ # Factor 2: Child welfare involvement (foster care)
25
+ is_in_foster_care = person("is_in_foster_care", period)
26
+
27
+ # Factor 3: Has IEP
28
+ has_iep = person("has_individualized_education_program", period)
29
+
30
+ # Factor 4: Income <= 50% FPL OR receiving TANF
31
+ is_deep_poverty = person("il_pfae_is_deep_poverty", period)
32
+ receives_tanf = person.spm_unit("il_tanf", period) > 0
33
+
34
+ return (
35
+ is_homeless
36
+ | is_in_foster_care
37
+ | has_iep
38
+ | is_deep_poverty
39
+ | receives_tanf
40
+ )
@@ -0,0 +1,23 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_is_deep_poverty(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Family income at or below 50% FPL (50-point factor for IL PFAE)"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf#page=2",
11
+ )
12
+ defined_for = StateCode.IL
13
+
14
+ def formula(person, period, parameters):
15
+ # Deep poverty (income <= 50% FPL) is a highest priority factor.
16
+ # Per the ISBE PDG enrollment form, Factor 4 includes "Family income at
17
+ # or below 50% of the federal poverty guidelines."
18
+ p = parameters(period).gov.states.il.isbe.pfae.eligibility.income
19
+ spm_unit = person.spm_unit
20
+ fpg = spm_unit("spm_unit_fpg", period)
21
+ income = spm_unit("il_isbe_countable_income", period)
22
+ threshold = fpg * p.deep_poverty_rate
23
+ return income <= threshold
@@ -0,0 +1,21 @@
1
+ from policyengine_us.model_api import *
2
+
3
+
4
+ class il_pfae_is_low_income(Variable):
5
+ value_type = bool
6
+ entity = Person
7
+ label = "Family income at or below 100% FPL (secondary priority factor)"
8
+ definition_period = YEAR
9
+ reference = (
10
+ "https://www.isbe.net/pages/preschool-for-all.aspx",
11
+ "https://www.isbe.net/Documents/pdg-eg-grant-enrollment-form.pdf#page=2",
12
+ )
13
+ defined_for = StateCode.IL
14
+
15
+ def formula(person, period, parameters):
16
+ p = parameters(period).gov.states.il.isbe.pfae.eligibility.income
17
+ spm_unit = person.spm_unit
18
+ fpg = spm_unit("spm_unit_fpg", period)
19
+ income = spm_unit("il_isbe_countable_income", period)
20
+ threshold = fpg * p.low_income_rate
21
+ return income <= threshold