policyengine-us 1.410.0__py3-none-any.whl → 1.411.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.
Potentially problematic release.
This version of policyengine-us might be problematic. Click here for more details.
- policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/brackets.yaml +42 -0
- policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/in_effect.yaml +10 -0
- policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/income_eligibility.yaml +28 -0
- policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/brackets.yaml +28 -0
- policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/in_effect.yaml +10 -0
- policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/income_eligibility.yaml +28 -0
- policyengine_us/reforms/aca/__init__.py +6 -0
- policyengine_us/reforms/aca/aca_ptc_additional_bracket.py +126 -0
- policyengine_us/reforms/aca/aca_ptc_simplified_bracket.py +127 -0
- policyengine_us/reforms/reforms.py +12 -0
- policyengine_us/tests/policy/contrib/aca/ptc_additional_bracket.yaml +117 -0
- policyengine_us/tests/policy/contrib/aca/ptc_simplified_bracket.yaml +117 -0
- {policyengine_us-1.410.0.dist-info → policyengine_us-1.411.0.dist-info}/METADATA +1 -1
- {policyengine_us-1.410.0.dist-info → policyengine_us-1.411.0.dist-info}/RECORD +17 -6
- {policyengine_us-1.410.0.dist-info → policyengine_us-1.411.0.dist-info}/WHEEL +0 -0
- {policyengine_us-1.410.0.dist-info → policyengine_us-1.411.0.dist-info}/entry_points.txt +0 -0
- {policyengine_us-1.410.0.dist-info → policyengine_us-1.411.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Linear progression: above 300% FPL, contribution percentage increases
|
|
2
|
+
# by 4 percentage points per 100% FPL increment.
|
|
3
|
+
# Examples: 400% FPL = 10%, 600% FPL = 18%, 1000% FPL = 34%
|
|
4
|
+
|
|
5
|
+
description: Custom ACA PTC contribution percentages by household income.
|
|
6
|
+
|
|
7
|
+
metadata:
|
|
8
|
+
type: single_amount
|
|
9
|
+
threshold_unit: /1
|
|
10
|
+
rate_unit: /1
|
|
11
|
+
label: ACA PTC contribution rate brackets
|
|
12
|
+
reference:
|
|
13
|
+
- title: 26 U.S. Code § 36B(b)(3)(A)
|
|
14
|
+
href: https://www.law.cornell.edu/uscode/text/26/36B#b_3_A
|
|
15
|
+
- title: American Rescue Plan Act of 2021
|
|
16
|
+
href: https://www.congress.gov/bill/117th-congress/house-bill/1319
|
|
17
|
+
|
|
18
|
+
brackets:
|
|
19
|
+
- threshold:
|
|
20
|
+
2026-01-01: 0
|
|
21
|
+
amount:
|
|
22
|
+
2026-01-01: 0
|
|
23
|
+
- threshold:
|
|
24
|
+
2026-01-01: 1.5
|
|
25
|
+
amount:
|
|
26
|
+
2026-01-01: 0
|
|
27
|
+
- threshold:
|
|
28
|
+
2026-01-01: 2.0
|
|
29
|
+
amount:
|
|
30
|
+
2026-01-01: 0.02
|
|
31
|
+
- threshold:
|
|
32
|
+
2026-01-01: 2.5
|
|
33
|
+
amount:
|
|
34
|
+
2026-01-01: 0.04
|
|
35
|
+
- threshold:
|
|
36
|
+
2026-01-01: 3.0
|
|
37
|
+
amount:
|
|
38
|
+
2026-01-01: 0.06
|
|
39
|
+
- threshold:
|
|
40
|
+
2026-01-01: 100.0
|
|
41
|
+
amount:
|
|
42
|
+
2026-01-01: 3.94
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Extended income eligibility for ACA PTC beyond 400% FPL.
|
|
2
|
+
# Allows subsidies to continue at higher income levels with gradual phase-out.
|
|
3
|
+
|
|
4
|
+
description: Eligibility for ACA Premium Tax Credit by percent of modified AGI to federal poverty line.
|
|
5
|
+
|
|
6
|
+
metadata:
|
|
7
|
+
type: single_amount
|
|
8
|
+
period: year
|
|
9
|
+
threshold_unit: /1
|
|
10
|
+
amount_unit: bool
|
|
11
|
+
label: ACA PTC income eligibility conditions (extended)
|
|
12
|
+
reference:
|
|
13
|
+
- title: 26 U.S. Code § 36B(c)(1)
|
|
14
|
+
href: https://www.law.cornell.edu/uscode/text/26/36B#c_1
|
|
15
|
+
|
|
16
|
+
brackets:
|
|
17
|
+
- threshold:
|
|
18
|
+
2026-01-01: 0
|
|
19
|
+
amount:
|
|
20
|
+
2026-01-01: false
|
|
21
|
+
- threshold:
|
|
22
|
+
2026-01-01: 1.00
|
|
23
|
+
amount:
|
|
24
|
+
2026-01-01: true
|
|
25
|
+
- threshold:
|
|
26
|
+
2026-01-01: 100.0
|
|
27
|
+
amount:
|
|
28
|
+
2026-01-01: false
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Linear progression: above 100% FPL, contribution percentage increases
|
|
2
|
+
# by 4 percentage points per 100% FPL increment.
|
|
3
|
+
# Examples: 200% FPL = 4%, 400% FPL = 12%, 600% FPL = 20%
|
|
4
|
+
|
|
5
|
+
description: Simplified ACA PTC contribution percentages with linear phase-out.
|
|
6
|
+
|
|
7
|
+
metadata:
|
|
8
|
+
type: single_amount
|
|
9
|
+
threshold_unit: /1
|
|
10
|
+
rate_unit: /1
|
|
11
|
+
label: ACA PTC simplified contribution rate brackets
|
|
12
|
+
reference:
|
|
13
|
+
- title: 26 U.S. Code § 36B(b)(3)(A)
|
|
14
|
+
href: https://www.law.cornell.edu/uscode/text/26/36B#b_3_A
|
|
15
|
+
|
|
16
|
+
brackets:
|
|
17
|
+
- threshold:
|
|
18
|
+
2028-01-01: 0
|
|
19
|
+
amount:
|
|
20
|
+
2028-01-01: 0
|
|
21
|
+
- threshold:
|
|
22
|
+
2028-01-01: 1.0
|
|
23
|
+
amount:
|
|
24
|
+
2028-01-01: 0
|
|
25
|
+
- threshold:
|
|
26
|
+
2028-01-01: 100.0
|
|
27
|
+
amount:
|
|
28
|
+
2028-01-01: 3.96
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Extended income eligibility for ACA PTC beyond 400% FPL.
|
|
2
|
+
# Allows subsidies to continue at higher income levels with gradual phase-out.
|
|
3
|
+
|
|
4
|
+
description: Eligibility for ACA Premium Tax Credit by percent of modified AGI to federal poverty line.
|
|
5
|
+
|
|
6
|
+
metadata:
|
|
7
|
+
type: single_amount
|
|
8
|
+
period: year
|
|
9
|
+
threshold_unit: /1
|
|
10
|
+
amount_unit: bool
|
|
11
|
+
label: ACA PTC income eligibility conditions (simplified)
|
|
12
|
+
reference:
|
|
13
|
+
- title: 26 U.S. Code § 36B(c)(1)
|
|
14
|
+
href: https://www.law.cornell.edu/uscode/text/26/36B#c_1
|
|
15
|
+
|
|
16
|
+
brackets:
|
|
17
|
+
- threshold:
|
|
18
|
+
2028-01-01: 0
|
|
19
|
+
amount:
|
|
20
|
+
2028-01-01: false
|
|
21
|
+
- threshold:
|
|
22
|
+
2028-01-01: 1.00
|
|
23
|
+
amount:
|
|
24
|
+
2028-01-01: true
|
|
25
|
+
- threshold:
|
|
26
|
+
2028-01-01: 100.0
|
|
27
|
+
amount:
|
|
28
|
+
2028-01-01: false
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
from policyengine_core.periods import period as period_
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def create_aca_ptc_additional_bracket() -> Reform:
|
|
6
|
+
class aca_ptc_phase_out_rate(Variable):
|
|
7
|
+
"""
|
|
8
|
+
ACA Premium Tax Credit phase-out rate with linear bracket extension.
|
|
9
|
+
|
|
10
|
+
This reform extends premium subsidies beyond the standard 400% FPL cliff
|
|
11
|
+
using a linear formula. Above the transition threshold (typically 300% FPL),
|
|
12
|
+
the contribution percentage increases linearly based on the increment rate
|
|
13
|
+
(typically 4 percentage points per 100% FPL).
|
|
14
|
+
|
|
15
|
+
The reform creates a more gradual phase-out of subsidies, reducing the
|
|
16
|
+
cliff effect where households just above 400% FPL lose all subsidies.
|
|
17
|
+
|
|
18
|
+
Related issue: https://github.com/PolicyEngine/policyengine-us/issues/6629
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
value_type = float
|
|
22
|
+
entity = TaxUnit
|
|
23
|
+
label = "ACA PTC phase-out rate with additional bracket (i.e., IRS Form 8962 'applicable figure')"
|
|
24
|
+
unit = "/1"
|
|
25
|
+
definition_period = YEAR
|
|
26
|
+
reference = [
|
|
27
|
+
"26 U.S. Code § 36B(b)(3)(A) - Refundable credit for coverage under a qualified health plan",
|
|
28
|
+
"https://www.law.cornell.edu/uscode/text/26/36B#b_3_A",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
def formula(tax_unit, period, parameters):
|
|
32
|
+
magi_frac = tax_unit("aca_magi_fraction", period)
|
|
33
|
+
p = parameters(
|
|
34
|
+
period
|
|
35
|
+
).gov.contrib.aca.ptc_additional_bracket.brackets
|
|
36
|
+
return np.interp(magi_frac, p.thresholds, p.amounts)
|
|
37
|
+
|
|
38
|
+
class is_aca_ptc_eligible(Variable):
|
|
39
|
+
"""
|
|
40
|
+
Extended ACA PTC eligibility beyond 400% FPL.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
value_type = bool
|
|
44
|
+
entity = Person
|
|
45
|
+
label = "Person is eligible for ACA premium tax credit and pays ACA premium"
|
|
46
|
+
definition_period = YEAR
|
|
47
|
+
|
|
48
|
+
def formula(person, period, parameters):
|
|
49
|
+
# determine status eligibility for ACA PTC
|
|
50
|
+
fstatus = person.tax_unit("filing_status", period)
|
|
51
|
+
separate = fstatus == fstatus.possible_values.SEPARATE
|
|
52
|
+
immigration_eligible = person(
|
|
53
|
+
"is_aca_ptc_immigration_status_eligible", period
|
|
54
|
+
)
|
|
55
|
+
taxpayer_has_itin = person.tax_unit("taxpayer_has_itin", period)
|
|
56
|
+
is_status_eligible = (
|
|
57
|
+
taxpayer_has_itin & ~separate & immigration_eligible
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
# determine coverage eligibility for ACA plan
|
|
61
|
+
INELIGIBLE_COVERAGE = [
|
|
62
|
+
"is_medicaid_eligible",
|
|
63
|
+
"is_chip_eligible",
|
|
64
|
+
"is_aca_eshi_eligible",
|
|
65
|
+
"is_medicare_eligible",
|
|
66
|
+
]
|
|
67
|
+
is_coverage_eligible = (
|
|
68
|
+
add(person, period, INELIGIBLE_COVERAGE) == 0
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# determine income eligibility for ACA PTC (using reform parameter)
|
|
72
|
+
p = parameters(period).gov.contrib.aca.ptc_additional_bracket
|
|
73
|
+
magi_frac = person.tax_unit("aca_magi_fraction", period)
|
|
74
|
+
is_income_eligible = p.income_eligibility.calc(magi_frac)
|
|
75
|
+
|
|
76
|
+
# determine which people pay an age-based ACA plan premium
|
|
77
|
+
p_aca = parameters(period).gov.aca
|
|
78
|
+
is_aca_adult = person("age", period) > p_aca.slcsp.max_child_age
|
|
79
|
+
child_pays = (
|
|
80
|
+
person("aca_child_index", period) <= p_aca.max_child_count
|
|
81
|
+
)
|
|
82
|
+
pays_aca_premium = is_aca_adult | child_pays
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
is_status_eligible
|
|
86
|
+
& is_coverage_eligible
|
|
87
|
+
& is_income_eligible
|
|
88
|
+
& pays_aca_premium
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
class reform(Reform):
|
|
92
|
+
def apply(self):
|
|
93
|
+
self.update_variable(aca_ptc_phase_out_rate)
|
|
94
|
+
self.update_variable(is_aca_ptc_eligible)
|
|
95
|
+
|
|
96
|
+
return reform
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def create_aca_ptc_additional_bracket_reform(
|
|
100
|
+
parameters, period, bypass: bool = False
|
|
101
|
+
):
|
|
102
|
+
if bypass:
|
|
103
|
+
return create_aca_ptc_additional_bracket()
|
|
104
|
+
|
|
105
|
+
p = parameters.gov.contrib.aca.ptc_additional_bracket
|
|
106
|
+
current_period = period_(period)
|
|
107
|
+
|
|
108
|
+
# Check if reform is active within a 5-year lookahead window
|
|
109
|
+
# This allows the reform to be selected in the web app interface
|
|
110
|
+
# even if it's scheduled to start in a future year
|
|
111
|
+
reform_active = False
|
|
112
|
+
for i in range(5):
|
|
113
|
+
if p(current_period).in_effect:
|
|
114
|
+
reform_active = True
|
|
115
|
+
break
|
|
116
|
+
current_period = current_period.offset(1, "year")
|
|
117
|
+
|
|
118
|
+
if reform_active:
|
|
119
|
+
return create_aca_ptc_additional_bracket()
|
|
120
|
+
else:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
aca_ptc_additional_bracket = create_aca_ptc_additional_bracket_reform(
|
|
125
|
+
None, None, bypass=True
|
|
126
|
+
)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
from policyengine_us.model_api import *
|
|
2
|
+
from policyengine_core.periods import period as period_
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def create_aca_ptc_simplified_bracket() -> Reform:
|
|
6
|
+
class aca_ptc_phase_out_rate(Variable):
|
|
7
|
+
"""
|
|
8
|
+
ACA Premium Tax Credit phase-out rate with simplified linear progression.
|
|
9
|
+
|
|
10
|
+
This reform creates a single linear phase-out starting at 100% FPL,
|
|
11
|
+
where the contribution percentage increases by 4 percentage points
|
|
12
|
+
per 100% FPL increment. This results in a simpler, more aggressive
|
|
13
|
+
phase-out compared to the additional bracket reform.
|
|
14
|
+
|
|
15
|
+
The reform eliminates the standard ACA bracket structure entirely,
|
|
16
|
+
replacing it with one continuous linear progression from 100% FPL
|
|
17
|
+
onwards.
|
|
18
|
+
|
|
19
|
+
Related issue: https://github.com/PolicyEngine/policyengine-us/issues/6629
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
value_type = float
|
|
23
|
+
entity = TaxUnit
|
|
24
|
+
label = "ACA PTC phase-out rate with simplified bracket (i.e., IRS Form 8962 'applicable figure')"
|
|
25
|
+
unit = "/1"
|
|
26
|
+
definition_period = YEAR
|
|
27
|
+
reference = [
|
|
28
|
+
"26 U.S. Code § 36B(b)(3)(A) - Refundable credit for coverage under a qualified health plan",
|
|
29
|
+
"https://www.law.cornell.edu/uscode/text/26/36B#b_3_A",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
def formula(tax_unit, period, parameters):
|
|
33
|
+
magi_frac = tax_unit("aca_magi_fraction", period)
|
|
34
|
+
p = parameters(
|
|
35
|
+
period
|
|
36
|
+
).gov.contrib.aca.ptc_simplified_bracket.brackets
|
|
37
|
+
return np.interp(magi_frac, p.thresholds, p.amounts)
|
|
38
|
+
|
|
39
|
+
class is_aca_ptc_eligible(Variable):
|
|
40
|
+
"""
|
|
41
|
+
Extended ACA PTC eligibility beyond 400% FPL.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
value_type = bool
|
|
45
|
+
entity = Person
|
|
46
|
+
label = "Person is eligible for ACA premium tax credit and pays ACA premium"
|
|
47
|
+
definition_period = YEAR
|
|
48
|
+
|
|
49
|
+
def formula(person, period, parameters):
|
|
50
|
+
# determine status eligibility for ACA PTC
|
|
51
|
+
fstatus = person.tax_unit("filing_status", period)
|
|
52
|
+
separate = fstatus == fstatus.possible_values.SEPARATE
|
|
53
|
+
immigration_eligible = person(
|
|
54
|
+
"is_aca_ptc_immigration_status_eligible", period
|
|
55
|
+
)
|
|
56
|
+
taxpayer_has_itin = person.tax_unit("taxpayer_has_itin", period)
|
|
57
|
+
is_status_eligible = (
|
|
58
|
+
taxpayer_has_itin & ~separate & immigration_eligible
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# determine coverage eligibility for ACA plan
|
|
62
|
+
INELIGIBLE_COVERAGE = [
|
|
63
|
+
"is_medicaid_eligible",
|
|
64
|
+
"is_chip_eligible",
|
|
65
|
+
"is_aca_eshi_eligible",
|
|
66
|
+
"is_medicare_eligible",
|
|
67
|
+
]
|
|
68
|
+
is_coverage_eligible = (
|
|
69
|
+
add(person, period, INELIGIBLE_COVERAGE) == 0
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
# determine income eligibility for ACA PTC (using reform parameter)
|
|
73
|
+
p = parameters(period).gov.contrib.aca.ptc_simplified_bracket
|
|
74
|
+
magi_frac = person.tax_unit("aca_magi_fraction", period)
|
|
75
|
+
is_income_eligible = p.income_eligibility.calc(magi_frac)
|
|
76
|
+
|
|
77
|
+
# determine which people pay an age-based ACA plan premium
|
|
78
|
+
p_aca = parameters(period).gov.aca
|
|
79
|
+
is_aca_adult = person("age", period) > p_aca.slcsp.max_child_age
|
|
80
|
+
child_pays = (
|
|
81
|
+
person("aca_child_index", period) <= p_aca.max_child_count
|
|
82
|
+
)
|
|
83
|
+
pays_aca_premium = is_aca_adult | child_pays
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
is_status_eligible
|
|
87
|
+
& is_coverage_eligible
|
|
88
|
+
& is_income_eligible
|
|
89
|
+
& pays_aca_premium
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
class reform(Reform):
|
|
93
|
+
def apply(self):
|
|
94
|
+
self.update_variable(aca_ptc_phase_out_rate)
|
|
95
|
+
self.update_variable(is_aca_ptc_eligible)
|
|
96
|
+
|
|
97
|
+
return reform
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def create_aca_ptc_simplified_bracket_reform(
|
|
101
|
+
parameters, period, bypass: bool = False
|
|
102
|
+
):
|
|
103
|
+
if bypass:
|
|
104
|
+
return create_aca_ptc_simplified_bracket()
|
|
105
|
+
|
|
106
|
+
p = parameters.gov.contrib.aca.ptc_simplified_bracket
|
|
107
|
+
current_period = period_(period)
|
|
108
|
+
|
|
109
|
+
# Check if reform is active within a 5-year lookahead window
|
|
110
|
+
# This allows the reform to be selected in the web app interface
|
|
111
|
+
# even if it's scheduled to start in a future year
|
|
112
|
+
reform_active = False
|
|
113
|
+
for i in range(5):
|
|
114
|
+
if p(current_period).in_effect:
|
|
115
|
+
reform_active = True
|
|
116
|
+
break
|
|
117
|
+
current_period = current_period.offset(1, "year")
|
|
118
|
+
|
|
119
|
+
if reform_active:
|
|
120
|
+
return create_aca_ptc_simplified_bracket()
|
|
121
|
+
else:
|
|
122
|
+
return None
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
aca_ptc_simplified_bracket = create_aca_ptc_simplified_bracket_reform(
|
|
126
|
+
None, None, bypass=True
|
|
127
|
+
)
|
|
@@ -108,6 +108,10 @@ from .crfb import (
|
|
|
108
108
|
create_non_refundable_ss_credit_reform,
|
|
109
109
|
create_senior_deduction_extension_reform,
|
|
110
110
|
)
|
|
111
|
+
from .aca import (
|
|
112
|
+
create_aca_ptc_additional_bracket_reform,
|
|
113
|
+
create_aca_ptc_simplified_bracket_reform,
|
|
114
|
+
)
|
|
111
115
|
|
|
112
116
|
|
|
113
117
|
from policyengine_core.reforms import Reform
|
|
@@ -248,6 +252,12 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
248
252
|
ctc_minimum_refundable_amount = (
|
|
249
253
|
create_ctc_minimum_refundable_amount_reform(parameters, period)
|
|
250
254
|
)
|
|
255
|
+
aca_ptc_additional_bracket = create_aca_ptc_additional_bracket_reform(
|
|
256
|
+
parameters, period
|
|
257
|
+
)
|
|
258
|
+
aca_ptc_simplified_bracket = create_aca_ptc_simplified_bracket_reform(
|
|
259
|
+
parameters, period
|
|
260
|
+
)
|
|
251
261
|
|
|
252
262
|
reforms = [
|
|
253
263
|
afa_reform,
|
|
@@ -298,6 +308,8 @@ def create_structural_reforms_from_parameters(parameters, period):
|
|
|
298
308
|
ctc_per_child_phase_out,
|
|
299
309
|
ctc_per_child_phase_in,
|
|
300
310
|
ctc_minimum_refundable_amount,
|
|
311
|
+
aca_ptc_additional_bracket,
|
|
312
|
+
aca_ptc_simplified_bracket,
|
|
301
313
|
]
|
|
302
314
|
reforms = tuple(filter(lambda x: x is not None, reforms))
|
|
303
315
|
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
- name: Single filer at 250% FPL - uses baseline value
|
|
2
|
+
period: 2026
|
|
3
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
4
|
+
absolute_error_margin: 0.00001
|
|
5
|
+
input:
|
|
6
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
7
|
+
aca_magi_fraction: 2.5
|
|
8
|
+
output:
|
|
9
|
+
aca_ptc_phase_out_rate: 0.04
|
|
10
|
+
|
|
11
|
+
- name: Single filer at 300% FPL - uses baseline value
|
|
12
|
+
period: 2026
|
|
13
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
14
|
+
absolute_error_margin: 0.00001
|
|
15
|
+
input:
|
|
16
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
17
|
+
aca_magi_fraction: 3.0
|
|
18
|
+
output:
|
|
19
|
+
aca_ptc_phase_out_rate: 0.06
|
|
20
|
+
|
|
21
|
+
- name: Single filer at 400% FPL - linear increase to 10%
|
|
22
|
+
period: 2026
|
|
23
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
24
|
+
absolute_error_margin: 0.00001
|
|
25
|
+
input:
|
|
26
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
27
|
+
aca_magi_fraction: 4.0
|
|
28
|
+
output:
|
|
29
|
+
aca_ptc_phase_out_rate: 0.10
|
|
30
|
+
|
|
31
|
+
- name: Single filer at 500% FPL - linear increase to 14%
|
|
32
|
+
period: 2026
|
|
33
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
34
|
+
absolute_error_margin: 0.00001
|
|
35
|
+
input:
|
|
36
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
37
|
+
aca_magi_fraction: 5.0
|
|
38
|
+
output:
|
|
39
|
+
aca_ptc_phase_out_rate: 0.14
|
|
40
|
+
|
|
41
|
+
- name: Single filer at 600% FPL - linear increase to 18%
|
|
42
|
+
period: 2026
|
|
43
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
44
|
+
absolute_error_margin: 0.00001
|
|
45
|
+
input:
|
|
46
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
47
|
+
aca_magi_fraction: 6.0
|
|
48
|
+
output:
|
|
49
|
+
aca_ptc_phase_out_rate: 0.18
|
|
50
|
+
|
|
51
|
+
- name: Single filer at 350% FPL - interpolated value
|
|
52
|
+
period: 2026
|
|
53
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
54
|
+
absolute_error_margin: 0.00001
|
|
55
|
+
input:
|
|
56
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
57
|
+
aca_magi_fraction: 3.5
|
|
58
|
+
output:
|
|
59
|
+
aca_ptc_phase_out_rate: 0.08
|
|
60
|
+
|
|
61
|
+
- name: Baseline comparison at 400% FPL - shows difference
|
|
62
|
+
period: 2026
|
|
63
|
+
absolute_error_margin: 0.00001
|
|
64
|
+
input:
|
|
65
|
+
aca_magi_fraction: 4.0
|
|
66
|
+
output:
|
|
67
|
+
aca_ptc_phase_out_rate: 0.0996
|
|
68
|
+
|
|
69
|
+
- name: Edge case - Lower boundary at 0% FPL
|
|
70
|
+
period: 2026
|
|
71
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
72
|
+
absolute_error_margin: 0.00001
|
|
73
|
+
input:
|
|
74
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
75
|
+
aca_magi_fraction: 0.0
|
|
76
|
+
output:
|
|
77
|
+
aca_ptc_phase_out_rate: 0.0
|
|
78
|
+
|
|
79
|
+
- name: Edge case - Lower boundary at 150% FPL (first bracket threshold)
|
|
80
|
+
period: 2026
|
|
81
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
82
|
+
absolute_error_margin: 0.00001
|
|
83
|
+
input:
|
|
84
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
85
|
+
aca_magi_fraction: 1.5
|
|
86
|
+
output:
|
|
87
|
+
aca_ptc_phase_out_rate: 0.0
|
|
88
|
+
|
|
89
|
+
- name: Edge case - First positive bracket at 200% FPL
|
|
90
|
+
period: 2026
|
|
91
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
92
|
+
absolute_error_margin: 0.00001
|
|
93
|
+
input:
|
|
94
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
95
|
+
aca_magi_fraction: 2.0
|
|
96
|
+
output:
|
|
97
|
+
aca_ptc_phase_out_rate: 0.02
|
|
98
|
+
|
|
99
|
+
- name: Edge case - Upper boundary at 1000% FPL (highest defined bracket)
|
|
100
|
+
period: 2026
|
|
101
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
102
|
+
absolute_error_margin: 0.00001
|
|
103
|
+
input:
|
|
104
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
105
|
+
aca_magi_fraction: 10.0
|
|
106
|
+
output:
|
|
107
|
+
aca_ptc_phase_out_rate: 0.34
|
|
108
|
+
|
|
109
|
+
- name: Edge case - Interpolation between 1.5 and 2.0 at 175% FPL
|
|
110
|
+
period: 2026
|
|
111
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_additional_bracket.aca_ptc_additional_bracket
|
|
112
|
+
absolute_error_margin: 0.00001
|
|
113
|
+
input:
|
|
114
|
+
gov.contrib.aca.ptc_additional_bracket.in_effect: true
|
|
115
|
+
aca_magi_fraction: 1.75
|
|
116
|
+
output:
|
|
117
|
+
aca_ptc_phase_out_rate: 0.01
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
- name: Single filer at 100% FPL - starts at 0%
|
|
2
|
+
period: 2028
|
|
3
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
4
|
+
absolute_error_margin: 0.00001
|
|
5
|
+
input:
|
|
6
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
7
|
+
aca_magi_fraction: 1.0
|
|
8
|
+
output:
|
|
9
|
+
aca_ptc_phase_out_rate: 0.0
|
|
10
|
+
|
|
11
|
+
- name: Single filer at 200% FPL - linear increase to 4%
|
|
12
|
+
period: 2028
|
|
13
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
14
|
+
absolute_error_margin: 0.00001
|
|
15
|
+
input:
|
|
16
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
17
|
+
aca_magi_fraction: 2.0
|
|
18
|
+
output:
|
|
19
|
+
aca_ptc_phase_out_rate: 0.04
|
|
20
|
+
|
|
21
|
+
- name: Single filer at 300% FPL - linear increase to 8%
|
|
22
|
+
period: 2028
|
|
23
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
24
|
+
absolute_error_margin: 0.00001
|
|
25
|
+
input:
|
|
26
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
27
|
+
aca_magi_fraction: 3.0
|
|
28
|
+
output:
|
|
29
|
+
aca_ptc_phase_out_rate: 0.08
|
|
30
|
+
|
|
31
|
+
- name: Single filer at 400% FPL - linear increase to 12%
|
|
32
|
+
period: 2028
|
|
33
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
34
|
+
absolute_error_margin: 0.00001
|
|
35
|
+
input:
|
|
36
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
37
|
+
aca_magi_fraction: 4.0
|
|
38
|
+
output:
|
|
39
|
+
aca_ptc_phase_out_rate: 0.12
|
|
40
|
+
|
|
41
|
+
- name: Single filer at 500% FPL - linear increase to 16%
|
|
42
|
+
period: 2028
|
|
43
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
44
|
+
absolute_error_margin: 0.00001
|
|
45
|
+
input:
|
|
46
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
47
|
+
aca_magi_fraction: 5.0
|
|
48
|
+
output:
|
|
49
|
+
aca_ptc_phase_out_rate: 0.16
|
|
50
|
+
|
|
51
|
+
- name: Single filer at 600% FPL - linear increase to 20%
|
|
52
|
+
period: 2028
|
|
53
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
54
|
+
absolute_error_margin: 0.00001
|
|
55
|
+
input:
|
|
56
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
57
|
+
aca_magi_fraction: 6.0
|
|
58
|
+
output:
|
|
59
|
+
aca_ptc_phase_out_rate: 0.20
|
|
60
|
+
|
|
61
|
+
- name: Single filer at 150% FPL - interpolated value
|
|
62
|
+
period: 2028
|
|
63
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
64
|
+
absolute_error_margin: 0.00001
|
|
65
|
+
input:
|
|
66
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
67
|
+
aca_magi_fraction: 1.5
|
|
68
|
+
output:
|
|
69
|
+
aca_ptc_phase_out_rate: 0.02
|
|
70
|
+
|
|
71
|
+
- name: Baseline comparison at 400% FPL - shows difference
|
|
72
|
+
period: 2028
|
|
73
|
+
absolute_error_margin: 0.00001
|
|
74
|
+
input:
|
|
75
|
+
aca_magi_fraction: 4.0
|
|
76
|
+
output:
|
|
77
|
+
aca_ptc_phase_out_rate: 0.0996
|
|
78
|
+
|
|
79
|
+
- name: Edge case - Lower boundary at 0% FPL
|
|
80
|
+
period: 2028
|
|
81
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
82
|
+
absolute_error_margin: 0.00001
|
|
83
|
+
input:
|
|
84
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
85
|
+
aca_magi_fraction: 0.0
|
|
86
|
+
output:
|
|
87
|
+
aca_ptc_phase_out_rate: 0.0
|
|
88
|
+
|
|
89
|
+
- name: Edge case - Upper boundary at 1000% FPL
|
|
90
|
+
period: 2028
|
|
91
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
92
|
+
absolute_error_margin: 0.00001
|
|
93
|
+
input:
|
|
94
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
95
|
+
aca_magi_fraction: 10.0
|
|
96
|
+
output:
|
|
97
|
+
aca_ptc_phase_out_rate: 0.36
|
|
98
|
+
|
|
99
|
+
- name: Edge case - Interpolation between 1.0 and 2.0 at 175% FPL
|
|
100
|
+
period: 2028
|
|
101
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
102
|
+
absolute_error_margin: 0.00001
|
|
103
|
+
input:
|
|
104
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
105
|
+
aca_magi_fraction: 1.75
|
|
106
|
+
output:
|
|
107
|
+
aca_ptc_phase_out_rate: 0.03
|
|
108
|
+
|
|
109
|
+
- name: Comparison with additional bracket reform at 600% FPL
|
|
110
|
+
period: 2028
|
|
111
|
+
reforms: policyengine_us.reforms.aca.aca_ptc_simplified_bracket.aca_ptc_simplified_bracket
|
|
112
|
+
absolute_error_margin: 0.00001
|
|
113
|
+
input:
|
|
114
|
+
gov.contrib.aca.ptc_simplified_bracket.in_effect: true
|
|
115
|
+
aca_magi_fraction: 6.0
|
|
116
|
+
output:
|
|
117
|
+
aca_ptc_phase_out_rate: 0.20
|
|
@@ -113,6 +113,12 @@ policyengine_us/parameters/gov/bls/cpi/cpi_u.yaml,sha256=tpi1qDrQC-Kl8tkQzn5gj17
|
|
|
113
113
|
policyengine_us/parameters/gov/bls/cpi/cpi_w.yaml,sha256=Aiv9SIifEtIXEtNpNMWOFz3ELZ0nAJ4dsyaZE3oGmO4,29153
|
|
114
114
|
policyengine_us/parameters/gov/contrib/README.md,sha256=6ug3-8sV30Mlz4uVQbO2nsQ3X0BfLRGpjRPXuD4aUkM,14
|
|
115
115
|
policyengine_us/parameters/gov/contrib/dc_tax_threshold_joint_ratio.yaml,sha256=t-x2bZHeltkqwVZJXrMCOrqCSrRRzUunDOXBIgqAw6w,164
|
|
116
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/brackets.yaml,sha256=5sPFH73irieCa6AzDHXpYIiIm5xlAizvMs3pSre1Cjc,1046
|
|
117
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/in_effect.yaml,sha256=DMUOdpORwfAYaXa0jjozpsV_qAljum85x1wkH-mAmZ0,191
|
|
118
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/income_eligibility.yaml,sha256=rudQMr_grXoMjWPJDtRx3T93Ot30DZrcag0MnQzvoFc,735
|
|
119
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/brackets.yaml,sha256=dNGvbl9T2UAQNmCLRdrIBndms7_Io_TWGzoH-uhU4fc,726
|
|
120
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/in_effect.yaml,sha256=pYmYrGrpoGUyTW5Ved9WoYkGMVppP1sWGnGMY8tw22o,193
|
|
121
|
+
policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/income_eligibility.yaml,sha256=KeCo--rQbu0uxJi_-CrHgB5NkolZSW0aEch-xnuK2tI,737
|
|
116
122
|
policyengine_us/parameters/gov/contrib/additional_tax_bracket/bracket.yaml,sha256=QWzfPBK2MwVkNTaH_6q5ebdqanPdIB56iQepvKbKT5A,23686
|
|
117
123
|
policyengine_us/parameters/gov/contrib/additional_tax_bracket/in_effect.yaml,sha256=PyUoeJqg8VJaWx6RXuuFj0DgFBJ2Q2AwKRBkkKqLGDw,185
|
|
118
124
|
policyengine_us/parameters/gov/contrib/biden/budget_2025/capital_gains/README.md,sha256=_saI6Jwq9tHN5Mzho5WIHNH4tPVKv1EpCGh5fbUCGXk,46
|
|
@@ -3170,9 +3176,12 @@ policyengine_us/params_on_demand/gov/hhs/medicaid/geography/medicaid_rating_area
|
|
|
3170
3176
|
policyengine_us/reforms/__init__.py,sha256=FPV8k2633kzUhbKUK8jC6yJONbnZ5n9zLAq2UL57KH4,113
|
|
3171
3177
|
policyengine_us/reforms/dc_kccatc.py,sha256=LyGMfEKe-0TgQ-2vCYGOD8W-EGEW8_DgIqCQP89qDyg,4283
|
|
3172
3178
|
policyengine_us/reforms/dc_tax_threshold_joint_ratio.py,sha256=G-5E1EJFGZ3VeUl_fuyj82nMIttHRNRdlT-x98koJrk,1633
|
|
3173
|
-
policyengine_us/reforms/reforms.py,sha256=
|
|
3179
|
+
policyengine_us/reforms/reforms.py,sha256=F2YzW5JCmqfKfbEWbCsAxnN7FlDaeU0jCNbJDX7OBMU,10854
|
|
3174
3180
|
policyengine_us/reforms/taxsim.py,sha256=bXNFWfjBX5USld1C7fziT6BBmRy-avz00QtL8WmCHy0,5276
|
|
3175
3181
|
policyengine_us/reforms/winship.py,sha256=_q74Af1nkmoh0-M6PZJ2FcJAn6v5zf5sAEgvxjwHwyA,3069
|
|
3182
|
+
policyengine_us/reforms/aca/__init__.py,sha256=ugTekuQuCQw7EScXFCp5U3NSKhut8wIrrJK-1Y0aL9Q,234
|
|
3183
|
+
policyengine_us/reforms/aca/aca_ptc_additional_bracket.py,sha256=5mKi79SH49qQ-khd-kGDvASB0ftkPE3Z41HgNwSfWBE,4651
|
|
3184
|
+
policyengine_us/reforms/aca/aca_ptc_simplified_bracket.py,sha256=K4QEFYd3Vm1k1VG4RPrA6zqF3QVtfhC_E4AvU22B_BU,4649
|
|
3176
3185
|
policyengine_us/reforms/additional_tax_bracket/__init__.py,sha256=087GDzojnzkbARUgGTQDMNVWJzjtNZvBGr46jfu1kXc,89
|
|
3177
3186
|
policyengine_us/reforms/additional_tax_bracket/additional_tax_bracket_reform.py,sha256=4S1_9GmYDTXxangB2x1iNNIC8vGQDaCZR2TMFXNIEZY,5518
|
|
3178
3187
|
policyengine_us/reforms/biden/budget_2025/__init__.py,sha256=SSq5Hex7oz6EglxhWMr7W0mvRBFBTS4WN76VzasQgl4,201
|
|
@@ -5301,6 +5310,8 @@ policyengine_us/tests/policy/baseline/parameters/test_uprating_extensions.py,sha
|
|
|
5301
5310
|
policyengine_us/tests/policy/contrib/dc_kccatc.yaml,sha256=v4woAJveF3mZH6d4W3xAYlejcTIHTEQZM4nnenGNq-8,1786
|
|
5302
5311
|
policyengine_us/tests/policy/contrib/dc_single_joint_threshold_ratio.yaml,sha256=vDMmkKdvjCtR8uweKDptp1gt05OI78Pm7GoIL0Apxxg,632
|
|
5303
5312
|
policyengine_us/tests/policy/contrib/reported_state_income_tax.yaml,sha256=697RFAYWbmvD4LdQA-RHnIJ8nuu9wwEc2IRejdJ4QAQ,232
|
|
5313
|
+
policyengine_us/tests/policy/contrib/aca/ptc_additional_bracket.yaml,sha256=caSMB8FyL5SRJG0_6eghvwzm6u5HEGYUj5FXSOExzz8,3919
|
|
5314
|
+
policyengine_us/tests/policy/contrib/aca/ptc_simplified_bracket.yaml,sha256=PsRxlQ7yhzr-xyW0hBze8cqYO2LmrhlMISUNti-c800,3879
|
|
5304
5315
|
policyengine_us/tests/policy/contrib/additional_tax_bracket/additional_tax_bracket_reform.yaml,sha256=NIqdjkbwWfwWYqWoIE3NvJ1NOw7wI2KJg_z77efvhMA,2009
|
|
5305
5316
|
policyengine_us/tests/policy/contrib/congress/american_family_act_with_baby_bonus.yaml,sha256=Vb1aAv8od1NQdvD7FaqDeVhEn5IuP76SDIJTK1kM1x4,1372
|
|
5306
5317
|
policyengine_us/tests/policy/contrib/congress/wftca.yaml,sha256=NWN1tx6GBH3_e-qy5bQfLJj8Bdf9YIepiN0ZI_QDoMY,621
|
|
@@ -8565,8 +8576,8 @@ policyengine_us/variables/input/farm_income.py,sha256=BEKxYmHNNnWJAAvULl5qZJigy5
|
|
|
8565
8576
|
policyengine_us/variables/input/geography.py,sha256=Ux0ueAf0rhZaflyEqz81UuXP3xKCKBDvoO3CrKhiQEc,5421
|
|
8566
8577
|
policyengine_us/variables/input/self_employment_income.py,sha256=PwsGz8R4lRikKWUYOhsC0qosNNLXq4f5SQmfw4S3mk8,511
|
|
8567
8578
|
policyengine_us/variables/input/self_employment_income_before_lsr.py,sha256=E8fcX9Nlyqz8dziHhQv_euutdmoIwFMMWePUwbbwv_w,379
|
|
8568
|
-
policyengine_us-1.
|
|
8569
|
-
policyengine_us-1.
|
|
8570
|
-
policyengine_us-1.
|
|
8571
|
-
policyengine_us-1.
|
|
8572
|
-
policyengine_us-1.
|
|
8579
|
+
policyengine_us-1.411.0.dist-info/METADATA,sha256=6ZIsvwrqMwtM5GQLWevnxPlrkbkDqkZrHgfJFB33aKI,1649
|
|
8580
|
+
policyengine_us-1.411.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
8581
|
+
policyengine_us-1.411.0.dist-info/entry_points.txt,sha256=MLaqNyNTbReALyKNkde85VkuFFpdPWAcy8VRG1mjczc,57
|
|
8582
|
+
policyengine_us-1.411.0.dist-info/licenses/LICENSE,sha256=2N5ReRelkdqkR9a-KP-y-shmcD5P62XoYiG-miLTAzo,34519
|
|
8583
|
+
policyengine_us-1.411.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|