policyengine-us 1.426.0__py3-none-any.whl → 1.439.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 (124) hide show
  1. policyengine_us/parameters/gov/aca/state_rating_area_cost.yaml +511 -12
  2. policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/min_age.yaml +1 -1
  3. policyengine_us/parameters/gov/contrib/states/ri/ctc/young_child_boost/age_limit.yaml +9 -0
  4. policyengine_us/parameters/gov/contrib/states/ri/ctc/young_child_boost/amount.yaml +9 -0
  5. policyengine_us/parameters/gov/contrib/states/ri/dependent_exemption/amount.yaml +2 -2
  6. policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/limit/couple.yaml +60 -51
  7. policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/limit/individual.yaml +60 -51
  8. policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/earned.yaml +13 -0
  9. policyengine_us/parameters/gov/hhs/tanf/cash/income/sources/unearned.yaml +23 -0
  10. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/README.md +1 -206
  11. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/{income/all.yaml → income.yaml} +1 -1
  12. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution.yaml +70 -0
  13. policyengine_us/parameters/gov/states/co/tax/income/credits/care_worker/amount/joint.yaml +10 -0
  14. policyengine_us/parameters/gov/states/co/tax/income/credits/care_worker/amount/single.yaml +10 -0
  15. policyengine_us/parameters/gov/states/co/tax/income/credits/care_worker/income_limit/joint.yaml +10 -0
  16. policyengine_us/parameters/gov/states/co/tax/income/credits/care_worker/income_limit/single.yaml +10 -0
  17. policyengine_us/parameters/gov/states/co/tax/income/credits/refundable.yaml +10 -0
  18. policyengine_us/parameters/gov/states/ga/tax/income/credits/itemizer/amount.yaml +14 -0
  19. policyengine_us/parameters/gov/states/ga/tax/income/credits/non_refundable.yaml +9 -0
  20. policyengine_us/parameters/gov/states/hi/tax/income/alternative_tax/availability.yaml +2 -3
  21. policyengine_us/parameters/gov/states/pa/tax/income/credits/eitc/match.yaml +10 -0
  22. policyengine_us/parameters/gov/states/pa/tax/income/credits/refundable.yaml +6 -0
  23. policyengine_us/parameters/gov/states/va/tax/income/credits/non_refundable.yaml +1 -1
  24. policyengine_us/parameters/gov/territories/pr/tax/income/credits/refundable.yaml +2 -0
  25. policyengine_us/parameters/gov/territories/pr/tax/income/tax_rate/amount.yaml +35 -0
  26. policyengine_us/parameters/gov/usda/snap/work_requirements/general/age_threshold/caring_dependent_child.yaml +1 -1
  27. policyengine_us/parameters/gov/usda/snap/work_requirements/general/age_threshold/exempted.yaml +1 -1
  28. policyengine_us/parameters/gov/usda/snap/work_requirements/general/weekly_hours_threshold.yaml +1 -1
  29. policyengine_us/reforms/congress/tlaib/__init__.py +4 -3
  30. policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/__init__.py +9 -0
  31. policyengine_us/reforms/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.py +237 -0
  32. policyengine_us/reforms/reforms.py +5 -4
  33. policyengine_us/reforms/states/ri/ctc/ri_ctc_reform.py +32 -1
  34. policyengine_us/reforms/states/ri/exemption/ri_exemption_reform.py +26 -5
  35. policyengine_us/tests/policy/baseline/gov/ed/pell_grant/pell_grant_simplified_formula_applies.yaml +1 -1
  36. policyengine_us/tests/policy/baseline/gov/hhs/tanf/tanf_fpg.yaml +53 -0
  37. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/income_elasticity.yaml +6 -12
  38. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/labor_supply_behavioral_response.yaml +24 -2
  39. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/substitution_elasticity.yaml +35 -10
  40. policyengine_us/tests/policy/baseline/gov/ssa/ssi/integration_tests.yaml +150 -4
  41. policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit.yaml +64 -0
  42. policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit_eligible.yaml +122 -0
  43. policyengine_us/tests/policy/baseline/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit_eligible_care_worker_count.yaml +65 -0
  44. policyengine_us/tests/policy/baseline/gov/states/ga/tax/income/credits/ga_itemizer_credit.yaml +44 -0
  45. policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/alternative_tax/hi_alternative_tax_on_capital_gains_eligible.yaml +0 -8
  46. policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.yaml +4 -0
  47. policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.yaml +15 -0
  48. policyengine_us/tests/policy/baseline/gov/states/hi/tax/income/integration.yaml +96 -0
  49. policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.yaml +8 -8
  50. policyengine_us/tests/policy/baseline/gov/states/nj/tax/income/integation.yaml +57 -0
  51. policyengine_us/tests/policy/baseline/gov/states/oh/tax/income/credits/oh_cdcc.yaml +4 -4
  52. policyengine_us/tests/policy/baseline/gov/states/oh/tax/income/integration.yaml +59 -0
  53. policyengine_us/tests/policy/baseline/gov/states/pa/tax/income/credits/pa_eitc.yaml +26 -0
  54. policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_normal_tax.yaml +31 -0
  55. policyengine_us/tests/policy/baseline/gov/test_categorical_eligibility_vectorization.yaml +41 -0
  56. policyengine_us/tests/policy/contrib/congress/tlaib/economic_dignity_for_all_agenda/edaa_end_child_poverty_act.yaml +198 -0
  57. policyengine_us/tests/policy/contrib/states/ri/ctc_reform_test.yaml +144 -0
  58. policyengine_us/tests/policy/contrib/states/ri/exemption_reform_test.yaml +2 -2
  59. policyengine_us/variables/gov/ed/pell_grant/efc/pell_grant_simplified_formula_applies.py +1 -2
  60. policyengine_us/variables/gov/fcc/lifeline/is_lifeline_eligible.py +2 -2
  61. policyengine_us/variables/gov/hhs/head_start/early_head_start.py +2 -1
  62. policyengine_us/variables/gov/hhs/head_start/head_start.py +2 -1
  63. policyengine_us/variables/gov/hhs/head_start/is_head_start_categorically_eligible.py +1 -3
  64. policyengine_us/variables/gov/hhs/tanf/cash/income/tanf_gross_earned_income.py +13 -0
  65. policyengine_us/variables/gov/hhs/tanf/cash/income/tanf_gross_unearned_income.py +13 -0
  66. policyengine_us/variables/gov/hhs/tanf/tanf_fpg.py +28 -0
  67. policyengine_us/variables/gov/simulation/labor_supply_response/income_elasticity.py +1 -27
  68. policyengine_us/variables/gov/simulation/labor_supply_response/substitution_elasticity.py +18 -43
  69. policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/is_ssi_spousal_deeming_applies.py +41 -0
  70. policyengine_us/variables/gov/ssa/ssi/eligibility/income/deemed/from_ineligible_spouse/ssi_income_deemed_from_ineligible_spouse.py +20 -20
  71. policyengine_us/variables/gov/ssa/ssi/ssi.py +22 -1
  72. policyengine_us/variables/gov/ssa/ssi/ssi_amount_if_eligible.py +26 -4
  73. policyengine_us/variables/gov/states/ca/cpuc/care/eligibility/ca_care_categorically_eligible.py +2 -2
  74. policyengine_us/variables/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit.py +26 -0
  75. policyengine_us/variables/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit_eligible.py +27 -0
  76. policyengine_us/variables/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit_eligible_care_worker.py +10 -0
  77. policyengine_us/variables/gov/states/co/tax/income/credits/care_worker/co_care_worker_credit_eligible_care_worker_count.py +18 -0
  78. policyengine_us/variables/gov/states/ga/tax/income/credits/ga_itemizer_credit.py +19 -0
  79. policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc.py +1 -1
  80. policyengine_us/variables/gov/states/hi/tax/income/credits/cdcc/hi_cdcc_eligible.py +14 -0
  81. policyengine_us/variables/gov/states/nj/tax/income/credits/cdcc/nj_cdcc.py +2 -2
  82. policyengine_us/variables/gov/states/oh/tax/income/credits/oh_cdcc.py +2 -2
  83. policyengine_us/variables/gov/states/pa/tax/income/credits/pa_eitc.py +16 -0
  84. policyengine_us/variables/gov/territories/pr/tax/income/pr_income_tax.py +14 -0
  85. policyengine_us/variables/gov/territories/pr/tax/income/pr_normal_tax.py +16 -0
  86. policyengine_us/variables/gov/territories/pr/tax/income/pr_regular_tax_before_credits.py +11 -0
  87. policyengine_us/variables/gov/territories/pr/tax/income/taxable_income/pr_net_taxable_income.py +11 -0
  88. {policyengine_us-1.426.0.dist-info → policyengine_us-1.439.0.dist-info}/METADATA +1 -1
  89. {policyengine_us-1.426.0.dist-info → policyengine_us-1.439.0.dist-info}/RECORD +100 -84
  90. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/age_limit.yaml +0 -8
  91. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/amount.yaml +0 -13
  92. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/in_effect.yaml +0 -8
  93. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/baby_bonus_act/min_birth_year.yaml +0 -8
  94. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/amount.yaml +0 -13
  95. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/in_effect.yaml +0 -8
  96. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/max_age.yaml +0 -8
  97. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/min_age.yaml +0 -8
  98. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/rate.yaml +0 -8
  99. policyengine_us/parameters/gov/contrib/congress/tlaib/income_security_package/boost_act/tax/threshold.yaml +0 -24
  100. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_multiplier_over_threshold.yaml +0 -11
  101. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/age_threshold.yaml +0 -9
  102. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/income/base.yaml +0 -11
  103. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_multiplier_over_threshold.yaml +0 -11
  104. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/age_threshold.yaml +0 -9
  105. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/all.yaml +0 -6
  106. policyengine_us/parameters/gov/simulation/labor_supply_responses/elasticities/substitution/by_position_and_decile.yaml +0 -71
  107. policyengine_us/reforms/congress/tlaib/income_security_package/__init__.py +0 -17
  108. policyengine_us/reforms/congress/tlaib/income_security_package/income_security_package.py +0 -402
  109. policyengine_us/tests/policy/baseline/gov/simulation/labor_supply_response/integration.yaml +0 -45
  110. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/integration.yaml +0 -154
  111. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/state_integration.yaml +0 -110
  112. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/test_individual_acts.yaml +0 -149
  113. policyengine_us/tests/policy/contrib/congress/tlaib/income_security/unit_tests.yaml +0 -272
  114. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/adult_dependent_credit/amount.yaml +0 -0
  115. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/child_benefit/age_limit.yaml +0 -0
  116. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/amount.yaml +0 -0
  117. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/max_age.yaml +0 -0
  118. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/eligibility/min_age.yaml +0 -0
  119. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/rate.yaml +0 -0
  120. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/filer_credit/phase_out/start.yaml +0 -0
  121. /policyengine_us/parameters/gov/contrib/congress/tlaib/{income_security_package → economic_dignity_for_all_agenda}/end_child_poverty_act/in_effect.yaml +0 -0
  122. {policyengine_us-1.426.0.dist-info → policyengine_us-1.439.0.dist-info}/WHEEL +0 -0
  123. {policyengine_us-1.426.0.dist-info → policyengine_us-1.439.0.dist-info}/entry_points.txt +0 -0
  124. {policyengine_us-1.426.0.dist-info → policyengine_us-1.439.0.dist-info}/licenses/LICENSE +0 -0
@@ -68,13 +68,29 @@ def create_ri_exemption_reform() -> Reform:
68
68
  defined_for = StateCode.RI
69
69
 
70
70
  def formula(tax_unit, period, parameters):
71
- p = parameters(period).gov.contrib.states.ri.dependent_exemption
72
71
 
73
72
  maximum = tax_unit("ri_dependent_exemption_maximum", period)
74
73
  phaseout = tax_unit("ri_dependent_exemption_phaseout", period)
75
74
 
76
75
  return max_(maximum - phaseout, 0)
77
76
 
77
+ class ri_older_dependents_count(Variable):
78
+ value_type = float
79
+ entity = TaxUnit
80
+ label = "Rhode Island older dependents count"
81
+ unit = USD
82
+ definition_period = YEAR
83
+ defined_for = StateCode.RI
84
+
85
+ def formula(tax_unit, period, parameters):
86
+ person = tax_unit.members
87
+ is_dependent = person("is_tax_unit_dependent", period)
88
+ total_dependents = tax_unit.sum(is_dependent)
89
+ eligible_dependent_exemptions = tax_unit(
90
+ "ri_eligible_dependents_count", period
91
+ )
92
+ return max_(0, total_dependents - eligible_dependent_exemptions)
93
+
78
94
  class ri_exemptions(Variable):
79
95
  value_type = float
80
96
  entity = TaxUnit
@@ -88,10 +104,14 @@ def create_ri_exemption_reform() -> Reform:
88
104
 
89
105
  # Calculate personal exemptions base amount
90
106
  filing_status = tax_unit("filing_status", period)
91
- personal_exemptions = where(
92
- filing_status == filing_status.possible_values.JOINT,
93
- 2,
94
- 1,
107
+ older_dependents = tax_unit("ri_older_dependents_count", period)
108
+ personal_exemptions = (
109
+ where(
110
+ filing_status == filing_status.possible_values.JOINT,
111
+ 2,
112
+ 1,
113
+ )
114
+ + older_dependents
95
115
  )
96
116
  personal_exemption_base = personal_exemptions * p_base.amount
97
117
 
@@ -118,6 +138,7 @@ def create_ri_exemption_reform() -> Reform:
118
138
  self.update_variable(ri_dependent_exemption_phaseout)
119
139
  self.update_variable(ri_dependent_exemption)
120
140
  self.update_variable(ri_exemptions)
141
+ self.update_variable(ri_older_dependents_count)
121
142
 
122
143
  return reform
123
144
 
@@ -135,7 +135,7 @@
135
135
  tanf: 0
136
136
  spm_unit_wic: 0
137
137
  output:
138
- pell_grant_simplified_formula_applies: true
138
+ pell_grant_simplified_formula_applies: [false, true] # main has no benefits, other has medicaid
139
139
 
140
140
  - name: Too much income
141
141
  period: 2023
@@ -0,0 +1,53 @@
1
+ - name: TANF FPG for household of 1 in 2025
2
+ period: 2025-01
3
+ absolute_error_margin: 0.01
4
+ input:
5
+ spm_unit_size: 1
6
+ state_group_str: CONTIGUOUS_US
7
+ output:
8
+ tanf_fpg: 15_060 / 12
9
+
10
+ - name: TANF FPG for household of 2 in 2025
11
+ period: 2025-01
12
+ absolute_error_margin: 0.01
13
+ input:
14
+ spm_unit_size: 2
15
+ state_group_str: CONTIGUOUS_US
16
+ output:
17
+ tanf_fpg: (15_060 + 5_380) / 12
18
+
19
+ - name: TANF FPG for household of 3 in 2025
20
+ period: 2025-01
21
+ absolute_error_margin: 0.01
22
+ input:
23
+ spm_unit_size: 3
24
+ state_group_str: CONTIGUOUS_US
25
+ output:
26
+ tanf_fpg: (15_060 + 5_380 * 2) / 12
27
+
28
+ - name: TANF FPG for household of 4 in 2025
29
+ period: 2025-01
30
+ absolute_error_margin: 0.01
31
+ input:
32
+ spm_unit_size: 4
33
+ state_group_str: CONTIGUOUS_US
34
+ output:
35
+ tanf_fpg: (15_060 + 5_380 * 3) / 12
36
+
37
+ - name: TANF FPG in 2024
38
+ period: 2024-01
39
+ absolute_error_margin: 0.01
40
+ input:
41
+ spm_unit_size: 3
42
+ state_group_str: CONTIGUOUS_US
43
+ output:
44
+ tanf_fpg: (14_580 + 5_140 * 2) / 12
45
+
46
+ - name: TANF FPG in 2023
47
+ period: 2023-01
48
+ absolute_error_margin: 0.01
49
+ input:
50
+ spm_unit_size: 3
51
+ state_group_str: CONTIGUOUS_US
52
+ output:
53
+ tanf_fpg: (13_590 + 4_720 * 2) / 12
@@ -1,19 +1,13 @@
1
- - name: Income elasticity for person under 65 uses base
1
+ - name: Default income elasticity is zero
2
2
  period: 2023
3
3
  input:
4
- age: 50
5
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
6
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
7
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.0
4
+ gov.simulation.labor_supply_responses.elasticities.income: 0
8
5
  output:
9
- income_elasticity: -0.04
6
+ income_elasticity: 0
10
7
 
11
- - name: Income elasticity for person 65+ applies multiplier
8
+ - name: Custom income elasticity value
12
9
  period: 2023
13
10
  input:
14
- age: 70
15
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
16
- gov.simulation.labor_supply_responses.elasticities.income.base: -0.04
17
- gov.simulation.labor_supply_responses.elasticities.income.age_multiplier_over_threshold: 2.0
11
+ gov.simulation.labor_supply_responses.elasticities.income: -0.2
18
12
  output:
19
- income_elasticity: -0.08
13
+ income_elasticity: -0.2
@@ -1,9 +1,31 @@
1
+ - name: No elasticities means no response
2
+ period: 2023
3
+ input:
4
+ employment_income_before_lsr: 50_000
5
+ self_employment_income_before_lsr: 10_000
6
+ gov.simulation.labor_supply_responses.elasticities.income: 0
7
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
+ output:
9
+ labor_supply_behavioral_response: 0
10
+
11
+ - name: Zero income and substitution elasticities
12
+ period: 2023
13
+ input:
14
+ employment_income_before_lsr: 50_000
15
+ self_employment_income_before_lsr: 10_000
16
+ income_elasticity_lsr: 0
17
+ substitution_elasticity_lsr: 0
18
+ gov.simulation.labor_supply_responses.elasticities.income: 0
19
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
20
+ output:
21
+ labor_supply_behavioral_response: 0
22
+
1
23
  - name: Negative total earnings with elasticities off
2
24
  period: 2023
3
25
  input:
4
26
  employment_income_before_lsr: 30_000
5
27
  self_employment_income_before_lsr: -40_000 # Net negative earnings
6
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
28
+ gov.simulation.labor_supply_responses.elasticities.income: 0
7
29
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
30
  output:
9
31
  labor_supply_behavioral_response: 0
@@ -13,7 +35,7 @@
13
35
  input:
14
36
  employment_income_before_lsr: 50_000
15
37
  self_employment_income_before_lsr: -10_000 # Net positive earnings = 40_000
16
- gov.simulation.labor_supply_responses.elasticities.income.all: 0
38
+ gov.simulation.labor_supply_responses.elasticities.income: 0
17
39
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
18
40
  output:
19
41
  labor_supply_behavioral_response: 0
@@ -1,23 +1,48 @@
1
- - name: Primary earner under 65 in decile 5 with base elasticity
1
+ - name: Default substitution elasticity is zero
2
2
  period: 2023
3
3
  input:
4
- age: 50
5
4
  employment_income_before_lsr: 50_000
6
5
  self_employment_income_before_lsr: 0
7
6
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
8
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15
9
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
10
7
  output:
11
- substitution_elasticity: 0.15
8
+ substitution_elasticity: 0
12
9
 
13
- - name: Primary earner 65+ in decile 5 with multiplier effect
10
+ - name: Global substitution elasticity override
14
11
  period: 2023
15
12
  input:
16
- age: 70
17
13
  employment_income_before_lsr: 50_000
18
14
  self_employment_income_before_lsr: 0
15
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0.25
16
+ output:
17
+ substitution_elasticity: 0.25
18
+
19
+ - name: Primary earner in decile 1 with default parameters
20
+ period: 2023
21
+ input:
22
+ employment_income_before_lsr: 10_000
23
+ self_employment_income_before_lsr: 0
19
24
  gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
20
- gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15
21
- gov.simulation.labor_supply_responses.elasticities.substitution.age_multiplier_over_threshold: 2.0
25
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.1: 0.1
26
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.secondary: 0.2
22
27
  output:
23
- substitution_elasticity: 0.30
28
+ substitution_elasticity: 0 # TODO: Debug why single person isn't getting primary earner elasticity
29
+
30
+ - name: Negative total earnings should have zero elasticity
31
+ period: 2023
32
+ input:
33
+ employment_income_before_lsr: 50_000
34
+ self_employment_income_before_lsr: -60_000 # Net negative earnings
35
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
36
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.1: 0.2
37
+ output:
38
+ substitution_elasticity: 0 # max_(earnings, 0) = 0, so elasticity = 0
39
+
40
+ - name: Positive net earnings after self-employment loss
41
+ period: 2023
42
+ input:
43
+ employment_income_before_lsr: 50_000
44
+ self_employment_income_before_lsr: -5_000 # Net positive earnings = 45_000
45
+ gov.simulation.labor_supply_responses.elasticities.substitution.all: 0
46
+ gov.simulation.labor_supply_responses.elasticities.substitution.by_position_and_decile.primary.5: 0.15 # 45k falls in decile 5
47
+ output:
48
+ substitution_elasticity: 0.15
@@ -68,10 +68,12 @@
68
68
  output:
69
69
  is_ssi_eligible: [true, false, true]
70
70
  # Spouse's countable: $2,000 - $20 - $65 - $957.50 = $957.50/month = $11,490/year
71
- # PolicyEngine deems all of spouse's countable income (doesn't subtract spouse allowance)
71
+ # Since $11,490 > $5,796 (couple - individual FBR diff), deeming applies
72
+ # With deeming, use couple FBR: $1,450/month = $17,400/year
72
73
  ssi_income_deemed_from_ineligible_spouse: [11_490, 0, 0]
73
74
  ssi_countable_income: [11_490, 0, 0]
74
- ssi: [114, 0, 11_604] # Adult1: $11,604 - $11,490 = $114; Child gets full FBR
75
+ # Adult1 SSI: $17,400 (couple FBR) - $11,490 (countable) = $5,910
76
+ ssi: [5_910, 0, 11_604] # Adult1: $5,910 with couple rate; Child gets full FBR
75
77
 
76
78
  - name: Case 3 - Both adults healthy with income + disabled child
77
79
  period: 2025
@@ -217,12 +219,14 @@
217
219
  output:
218
220
  is_ssi_eligible: [true, false, true]
219
221
  # Spouse's countable: $5,000 - $20 - $65 - $2,457.50 = $2,457.50/month = $29,490/year
220
- # PolicyEngine deems all countable income without subtracting spouse allowance
222
+ # Since $29,490 > $5,796 (couple - individual FBR diff), deeming applies
223
+ # With deeming, use couple FBR: $1,450/month = $17,400/year
224
+ # Adult1 SSI: $17,400 (couple FBR) - $29,490 (countable) = -$12,090, capped at $0
221
225
  ssi_income_deemed_from_ineligible_spouse: [29_490, 0, 0]
222
226
  # Parent income deeming to child also gets high amount
223
227
  ssi_unearned_income_deemed_from_ineligible_parent: [0, 0, 17_886]
224
228
  ssi_countable_income: [29_490, 0, 17_646]
225
- ssi: [0, 0, 0] # Both disabled members have too much deemed income
229
+ ssi: [0, 0, 0] # Both disabled members have countable income exceeding FBR
226
230
 
227
231
  - name: Case 7 - Illinois single parent with $9,600 income + healthy child
228
232
  period: 2024-01
@@ -254,3 +258,145 @@
254
258
  ssi_countable_income: [357.50, 0]
255
259
  ssi_amount_if_eligible: [943, 943]
256
260
  ssi: [585.50, 0]
261
+
262
+ - name: Case 8 - Deeming applies, benefit capped at individual FBR
263
+ period: 2025-01
264
+ input:
265
+ people:
266
+ adult1:
267
+ age: 55
268
+ is_disabled: false
269
+ employment_income: 967 * 12 # $967/month
270
+ adult2:
271
+ age: 60
272
+ is_disabled: true
273
+ employment_income: 0
274
+ tax_units:
275
+ tax_unit:
276
+ members: [adult1, adult2]
277
+ marital_units:
278
+ marital_unit:
279
+ members: [adult1, adult2]
280
+ households:
281
+ household:
282
+ members: [adult1, adult2]
283
+ state_code: NC
284
+ output:
285
+ is_ssi_eligible: [false, true]
286
+ # Step 1: Check if deeming applies
287
+ # Adult1 gross income: $967/month > $483 threshold → Deeming applies
288
+ #
289
+ # Step 2: Calculate deemed income
290
+ # Combined income: $967/month earned
291
+ # Apply exclusions: $967 - $20 (general) - $65 (earned) = $882
292
+ # Take half: $882 / 2 = $441/month
293
+ # Adult2 alone countable: $0
294
+ # Deemed income = $441 - $0 = $441/month
295
+ ssi_income_deemed_from_ineligible_spouse: [0, 441]
296
+ ssi_countable_income: [0, 441]
297
+ #
298
+ # Step 3: Calculate benefit
299
+ # Use couple FBR (deeming applies): $1,450/month
300
+ # Benefit before cap: $1,450 - $441 = $1,009/month
301
+ # Cap at individual FBR: min($1,009, $967) = $967/month
302
+ # Note: This demonstrates the cap is necessary when spouse's gross income
303
+ # is just above $483, resulting in low countable income after exclusions
304
+ ssi: [0, 967]
305
+
306
+ - name: Case 9 - Deeming applies without child
307
+ period: 2025-01
308
+ input:
309
+ people:
310
+ adult1:
311
+ age: 41
312
+ is_disabled: false
313
+ employment_income: 3_000 * 12 # $3,000/month
314
+ adult2:
315
+ age: 40
316
+ is_disabled: true
317
+ employment_income: 0
318
+ tax_units:
319
+ tax_unit:
320
+ members: [adult1, adult2]
321
+ marital_units:
322
+ marital_unit:
323
+ members: [adult1, adult2]
324
+ households:
325
+ household:
326
+ members: [adult1, adult2]
327
+ state_code: NC
328
+ output:
329
+ is_ssi_eligible: [false, true]
330
+ # Step 1: No child allocation (no child present)
331
+ # Adult1 gross income: $3,000/month (no reduction)
332
+ #
333
+ # Step 2: Check if deeming applies
334
+ # Adult1 gross income: $3,000 > $483 threshold → Deeming applies
335
+ #
336
+ # Step 3: Calculate deemed income
337
+ # Combined income: $3,000/month earned
338
+ # Apply exclusions: $3,000 - $20 (general) - $65 (earned) = $2,915
339
+ # Take half: $2,915 / 2 = $1,457.50/month
340
+ # Adult2 alone countable: $0
341
+ # Deemed income = $1,457.50 - $0 = $1,457.50/month
342
+ ssi_income_deemed_from_ineligible_spouse: [0, 1_457.50]
343
+ ssi_countable_income: [0, 1_457.50]
344
+ #
345
+ # Step 4: Calculate benefit
346
+ # Use couple FBR (deeming applies): $1,450/month
347
+ # Benefit before cap: $1,450 - $1,457.50 = -$7.50 (negative)
348
+ # Benefit capped at $0 (cannot be negative)
349
+ ssi: [0, 0]
350
+
351
+ - name: Case 10 - Deeming applies with child allocation (compare to Case 9)
352
+ period: 2025-01
353
+ input:
354
+ people:
355
+ adult1:
356
+ age: 41
357
+ is_disabled: false
358
+ employment_income: 3_000 * 12 # $3,000/month
359
+ adult2:
360
+ age: 40
361
+ is_disabled: true
362
+ employment_income: 0
363
+ child:
364
+ age: 12
365
+ is_disabled: false
366
+ employment_income: 0
367
+ tax_units:
368
+ tax_unit:
369
+ members: [adult1, adult2, child]
370
+ marital_units:
371
+ marital_unit:
372
+ members: [adult1, adult2, child]
373
+ households:
374
+ household:
375
+ members: [adult1, adult2, child]
376
+ state_code: NC
377
+ output:
378
+ is_ssi_eligible: [false, true, false]
379
+ # Step 1: Apply child allocation
380
+ # Child allocation: $1,450 (couple FBR) - $967 (individual FBR) = $483/month
381
+ # Child has $0 income, so full $483 allocation applies
382
+ # Adult1 earned after child allocation: $3,000 - $483 = $2,517/month
383
+ #
384
+ # Step 2: Check if deeming applies
385
+ # Adult1 income after child allocation: $2,517 > $483 threshold → Deeming applies
386
+ #
387
+ # Step 3: Calculate deemed income
388
+ # Combined income: $2,517/month earned (after child allocation)
389
+ # Apply exclusions: $2,517 - $20 (general) - $65 (earned) = $2,432
390
+ # Take half: $2,432 / 2 = $1,216/month
391
+ # Adult2 alone countable: $0
392
+ # Deemed income = $1,216 - $0 = $1,216/month
393
+ ssi_income_deemed_from_ineligible_spouse: [0, 1_216, 0]
394
+ ssi_countable_income: [0, 1_216, 0]
395
+ #
396
+ # Step 4: Calculate benefit
397
+ # Use couple FBR (deeming applies): $1,450/month
398
+ # Benefit before cap: $1,450 - $1,216 = $234/month
399
+ # Cap at individual FBR: min($234, $967) = $234 (no cap needed)
400
+ # Note: Compare to Case 9 - child allocation ($483) reduces deemed income,
401
+ # changing result from $0 to $234/month
402
+ ssi: [0, 234, 0]
@@ -0,0 +1,64 @@
1
+ - name: Joint with one eligible care worker, lower amount
2
+ period: 2026
3
+ input:
4
+ people:
5
+ person1:
6
+ age: 35
7
+ co_care_worker_credit_eligible_care_worker: true
8
+ is_tax_unit_head: true
9
+ person2:
10
+ age: 35
11
+ co_care_worker_credit_eligible_care_worker: false
12
+ is_tax_unit_spouse: true
13
+ tax_units:
14
+ tax_unit:
15
+ members: [person1, person2]
16
+ tax_unit_is_joint: true
17
+ co_care_worker_credit_eligible: true
18
+ households:
19
+ household:
20
+ members: [person1, person2]
21
+ state_code: CO
22
+ output:
23
+ co_care_worker_credit: 1_200
24
+
25
+ - name: Joint with two eligible care workers, higher amount
26
+ period: 2026
27
+ input:
28
+ people:
29
+ person1:
30
+ co_care_worker_credit_eligible_care_worker: true
31
+ is_tax_unit_head: true
32
+ person2:
33
+ co_care_worker_credit_eligible_care_worker: true
34
+ is_tax_unit_spouse: true
35
+ tax_units:
36
+ tax_unit:
37
+ members: [person1, person2]
38
+ tax_unit_is_joint: true
39
+ co_care_worker_credit_eligible: true
40
+ households:
41
+ household:
42
+ members: [person1, person2]
43
+ state_code: CO
44
+ output:
45
+ co_care_worker_credit: 2_400
46
+
47
+ - name: Single person
48
+ period: 2026
49
+ input:
50
+ people:
51
+ person1:
52
+ age: 35
53
+ co_care_worker_credit_eligible_care_worker: true
54
+ tax_units:
55
+ tax_unit:
56
+ members: [person1]
57
+ tax_unit_is_joint: true
58
+ co_care_worker_credit_eligible: true
59
+ households:
60
+ household:
61
+ members: [person1]
62
+ state_code: CO
63
+ output:
64
+ co_care_worker_credit: 1_200
@@ -0,0 +1,122 @@
1
+ - name: Joint with one eligible care worker, higher threshold applies
2
+ period: 2026
3
+ input:
4
+ people:
5
+ person1:
6
+ age: 35
7
+ co_care_worker_credit_eligible_care_worker: true
8
+ person2:
9
+ age: 35
10
+ co_care_worker_credit_eligible_care_worker: false
11
+ tax_units:
12
+ tax_unit:
13
+ members: [person1, person2]
14
+ adjusted_gross_income: 100_000
15
+ tax_unit_is_joint: true
16
+ households:
17
+ household:
18
+ members: [person1, person2]
19
+ state_code: CO
20
+ output:
21
+ co_care_worker_credit_eligible: true
22
+
23
+ - name: Joint with one eligible care worker, higher threshold applies, ineligible
24
+ period: 2026
25
+ input:
26
+ people:
27
+ person1:
28
+ age: 35
29
+ co_care_worker_credit_eligible_care_worker: true
30
+ person2:
31
+ age: 35
32
+ co_care_worker_credit_eligible_care_worker: false
33
+ tax_units:
34
+ tax_unit:
35
+ members: [person1, person2]
36
+ adjusted_gross_income: 100_001
37
+ tax_unit_is_joint: true
38
+ households:
39
+ household:
40
+ members: [person1, person2]
41
+ state_code: CO
42
+ output:
43
+ co_care_worker_credit_eligible: false
44
+
45
+ - name: Single with one eligible care worker
46
+ period: 2026
47
+ input:
48
+ people:
49
+ person1:
50
+ age: 35
51
+ co_care_worker_credit_eligible_care_worker: true
52
+ tax_units:
53
+ tax_unit:
54
+ members: [person1]
55
+ adjusted_gross_income: 75_000
56
+ tax_unit_is_joint: false
57
+ households:
58
+ household:
59
+ members: [person1]
60
+ state_code: CO
61
+ output:
62
+ co_care_worker_credit_eligible: true
63
+
64
+ - name: Single with one eligible care worker, ineligible
65
+ period: 2026
66
+ input:
67
+ people:
68
+ person1:
69
+ age: 35
70
+ co_care_worker_credit_eligible_care_worker: true
71
+ tax_units:
72
+ tax_unit:
73
+ members: [person1]
74
+ adjusted_gross_income: 75_001
75
+ tax_unit_is_joint: false
76
+ households:
77
+ household:
78
+ members: [person1]
79
+ state_code: CO
80
+ output:
81
+ co_care_worker_credit_eligible: false
82
+
83
+ - name: Single without eligible care worker
84
+ period: 2026
85
+ input:
86
+ people:
87
+ person1:
88
+ age: 35
89
+ co_care_worker_credit_eligible_care_worker: false
90
+ tax_units:
91
+ tax_unit:
92
+ members: [person1]
93
+ adjusted_gross_income: 25_000
94
+ tax_unit_is_joint: false
95
+ households:
96
+ household:
97
+ members: [person1]
98
+ state_code: CO
99
+ output:
100
+ co_care_worker_credit_eligible: false
101
+
102
+ - name: Joint without eligible care worker
103
+ period: 2026
104
+ input:
105
+ people:
106
+ person1:
107
+ age: 35
108
+ co_care_worker_credit_eligible_care_worker: false
109
+ person2:
110
+ age: 35
111
+ co_care_worker_credit_eligible_care_worker: false
112
+ tax_units:
113
+ tax_unit:
114
+ members: [person1, person2]
115
+ adjusted_gross_income: 30_000
116
+ tax_unit_is_joint: true
117
+ households:
118
+ household:
119
+ members: [person1, person2]
120
+ state_code: CO
121
+ output:
122
+ co_care_worker_credit_eligible: false
@@ -0,0 +1,65 @@
1
+ - name: One eligible spouse
2
+ period: 2026
3
+ input:
4
+ people:
5
+ person1:
6
+ is_tax_unit_head: true
7
+ co_care_worker_credit_eligible_care_worker: true
8
+ person2:
9
+ is_tax_unit_spouse: true
10
+ co_care_worker_credit_eligible_care_worker: false
11
+ tax_units:
12
+ tax_unit:
13
+ members: [person1, person2]
14
+ adjusted_gross_income: 100_000
15
+ tax_unit_is_joint: true
16
+ households:
17
+ household:
18
+ members: [person1, person2]
19
+ state_code: CO
20
+ output:
21
+ co_care_worker_credit_eligible_care_worker_count: 1
22
+
23
+ - name: Two eligible spouses
24
+ period: 2026
25
+ input:
26
+ people:
27
+ person1:
28
+ is_tax_unit_head: true
29
+ co_care_worker_credit_eligible_care_worker: true
30
+ person2:
31
+ is_tax_unit_spouse: true
32
+ co_care_worker_credit_eligible_care_worker: true
33
+ tax_units:
34
+ tax_unit:
35
+ members: [person1, person2]
36
+ adjusted_gross_income: 100_000
37
+ tax_unit_is_joint: true
38
+ households:
39
+ household:
40
+ members: [person1, person2]
41
+ state_code: CO
42
+ output:
43
+ co_care_worker_credit_eligible_care_worker_count: 2
44
+
45
+ - name: No eligible spouses
46
+ period: 2026
47
+ input:
48
+ people:
49
+ person1:
50
+ is_tax_unit_head: true
51
+ co_care_worker_credit_eligible_care_worker: false
52
+ person2:
53
+ is_tax_unit_spouse: false
54
+ co_care_worker_credit_eligible_care_worker: true
55
+ tax_units:
56
+ tax_unit:
57
+ members: [person1, person2]
58
+ adjusted_gross_income: 100_000
59
+ tax_unit_is_joint: true
60
+ households:
61
+ household:
62
+ members: [person1, person2]
63
+ state_code: CO
64
+ output:
65
+ co_care_worker_credit_eligible_care_worker_count: 0