policyengine-us 1.410.0__py3-none-any.whl → 1.412.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.

Files changed (19) hide show
  1. policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/brackets.yaml +42 -0
  2. policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/in_effect.yaml +10 -0
  3. policyengine_us/parameters/gov/contrib/aca/ptc_additional_bracket/income_eligibility.yaml +28 -0
  4. policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/brackets.yaml +28 -0
  5. policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/in_effect.yaml +10 -0
  6. policyengine_us/parameters/gov/contrib/aca/ptc_simplified_bracket/income_eligibility.yaml +28 -0
  7. policyengine_us/parameters/gov/hhs/fpg.yaml +16 -0
  8. policyengine_us/reforms/aca/__init__.py +6 -0
  9. policyengine_us/reforms/aca/aca_ptc_additional_bracket.py +126 -0
  10. policyengine_us/reforms/aca/aca_ptc_simplified_bracket.py +127 -0
  11. policyengine_us/reforms/reforms.py +12 -0
  12. policyengine_us/tests/policy/baseline/gov/hhs/spm_unit_fpg.yaml +46 -0
  13. policyengine_us/tests/policy/contrib/aca/ptc_additional_bracket.yaml +117 -0
  14. policyengine_us/tests/policy/contrib/aca/ptc_simplified_bracket.yaml +117 -0
  15. {policyengine_us-1.410.0.dist-info → policyengine_us-1.412.0.dist-info}/METADATA +1 -1
  16. {policyengine_us-1.410.0.dist-info → policyengine_us-1.412.0.dist-info}/RECORD +19 -8
  17. {policyengine_us-1.410.0.dist-info → policyengine_us-1.412.0.dist-info}/WHEEL +0 -0
  18. {policyengine_us-1.410.0.dist-info → policyengine_us-1.412.0.dist-info}/entry_points.txt +0 -0
  19. {policyengine_us-1.410.0.dist-info → policyengine_us-1.412.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,10 @@
1
+ description: Whether the ACA PTC additional bracket structure is in effect.
2
+
3
+ values:
4
+ 0000-01-01: false
5
+
6
+ metadata:
7
+ unit: bool
8
+ period: year
9
+ label: ACA PTC additional bracket in effect
10
+
@@ -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,10 @@
1
+ description: Whether the ACA PTC simplified bracket structure is in effect.
2
+
3
+ values:
4
+ 0000-01-01: false
5
+
6
+ metadata:
7
+ unit: bool
8
+ period: year
9
+ label: ACA PTC simplified bracket in effect
10
+
@@ -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
@@ -1,6 +1,8 @@
1
1
  description: Federal poverty guidelines published by the Department of Health and Human Services.
2
2
  first_person:
3
3
  CONTIGUOUS_US:
4
+ 2015-01-01: 11_770
5
+ 2016-01-01: 11_880
4
6
  2017-01-01: 12_060
5
7
  2018-01-01: 12_140
6
8
  2019-01-01: 12_490
@@ -11,6 +13,8 @@ first_person:
11
13
  2024-01-01: 15_060
12
14
  2025-01-01: 15_650
13
15
  AK:
16
+ 2015-01-01: 14_720
17
+ 2016-01-01: 14_840
14
18
  2017-01-01: 15_060
15
19
  2018-01-01: 15_180
16
20
  2019-01-01: 15_600
@@ -21,6 +25,8 @@ first_person:
21
25
  2024-01-01: 18_810
22
26
  2025-01-01: 19_550
23
27
  HI:
28
+ 2015-01-01: 13_550
29
+ 2016-01-01: 13_670
24
30
  2017-01-01: 13_860
25
31
  2018-01-01: 13_960
26
32
  2019-01-01: 14_380
@@ -44,6 +50,8 @@ additional_person:
44
50
  # Calculated by subtracting a two-person household's line from a one-person's.
45
51
  # This difference is always the same for larger households.
46
52
  CONTIGUOUS_US:
53
+ 2015-01-01: 4_160
54
+ 2016-01-01: 4_160
47
55
  2017-01-01: 4_180
48
56
  2018-01-01: 4_320
49
57
  2019-01-01: 4_420
@@ -54,6 +62,8 @@ additional_person:
54
62
  2024-01-01: 5_380
55
63
  2025-01-01: 5_500
56
64
  AK:
65
+ 2015-01-01: 5_200
66
+ 2016-01-01: 5_200
57
67
  2017-01-01: 5_230
58
68
  2018-01-01: 5_400
59
69
  2019-01-01: 5_530
@@ -64,6 +74,8 @@ additional_person:
64
74
  2024-01-01: 6_730
65
75
  2025-01-01: 6_880
66
76
  HI:
77
+ 2015-01-01: 4_780
78
+ 2016-01-01: 4_780
67
79
  2017-01-01: 4_810
68
80
  2018-01-01: 4_810
69
81
  2019-01-01: 5_080
@@ -84,6 +96,10 @@ additional_person:
84
96
  metadata:
85
97
  unit: currency-USD
86
98
  reference:
99
+ - title: 2015 Poverty Guidelines
100
+ href: https://aspe.hhs.gov/2015-poverty-guidelines
101
+ - title: 2016 Poverty Guidelines
102
+ href: https://aspe.hhs.gov/2016-poverty-guidelines
87
103
  - title: Prior HHS Poverty Guidelines and Federal Register References
88
104
  href: https://aspe.hhs.gov/topics/poverty-economic-mobility/poverty-guidelines/prior-hhs-poverty-guidelines-federal-register-references
89
105
  - title: Poverty Guidelines
@@ -0,0 +1,6 @@
1
+ from policyengine_us.reforms.aca.aca_ptc_additional_bracket import (
2
+ create_aca_ptc_additional_bracket_reform,
3
+ )
4
+ from policyengine_us.reforms.aca.aca_ptc_simplified_bracket import (
5
+ create_aca_ptc_simplified_bracket_reform,
6
+ )
@@ -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
 
@@ -11,3 +11,49 @@
11
11
  spm_unit_size: 3
12
12
  output:
13
13
  spm_unit_fpg: 12_880 + 2 * 4_540
14
+
15
+ - name: One-person SPM unit in 2015 in contiguous US
16
+ period: 2015
17
+ input:
18
+ spm_unit_size: 1
19
+ output:
20
+ spm_unit_fpg: 11_770
21
+
22
+ - name: Two-person SPM unit in 2015 in Alaska
23
+ period: 2015
24
+ input:
25
+ spm_unit_size: 2
26
+ state_group_str: AK
27
+ output:
28
+ spm_unit_fpg: 14_720 + 5_200
29
+
30
+ - name: Four-person SPM unit in 2015 in Hawaii
31
+ period: 2015
32
+ input:
33
+ spm_unit_size: 4
34
+ state_group_str: HI
35
+ output:
36
+ spm_unit_fpg: 13_550 + 3 * 4_780
37
+
38
+ - name: One-person SPM unit in 2016 in contiguous US
39
+ period: 2016
40
+ input:
41
+ spm_unit_size: 1
42
+ output:
43
+ spm_unit_fpg: 11_880
44
+
45
+ - name: Five-person SPM unit in 2016 in Alaska
46
+ period: 2016
47
+ input:
48
+ spm_unit_size: 5
49
+ state_group_str: AK
50
+ output:
51
+ spm_unit_fpg: 14_840 + 4 * 5_200
52
+
53
+ - name: Three-person SPM unit in 2016 in Hawaii
54
+ period: 2016
55
+ input:
56
+ spm_unit_size: 3
57
+ state_group_str: HI
58
+ output:
59
+ spm_unit_fpg: 13_670 + 2 * 4_780
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: policyengine-us
3
- Version: 1.410.0
3
+ Version: 1.412.0
4
4
  Summary: Add your description here.
5
5
  Author-email: PolicyEngine <hello@policyengine.org>
6
6
  License-File: LICENSE
@@ -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
@@ -366,7 +372,7 @@ policyengine_us/parameters/gov/fcc/lifeline/tribal_categorical_eligibility.yaml,
366
372
  policyengine_us/parameters/gov/fcc/lifeline/amount/rural_tribal_supplement.yaml,sha256=cvXBkXqdnFa5zUWQyehBmH9CJkiRhInCeuqwzqvGAzg,313
367
373
  policyengine_us/parameters/gov/fcc/lifeline/amount/standard.yaml,sha256=i94DV8Ow1kjT-oqkI-TjfHR8rbVHHSLjJeWQ2ol6BxE,395
368
374
  policyengine_us/parameters/gov/hhs/README.md,sha256=-K3nU8bLJDb5t222i9zQRp2LOhpqtszN_7-Zfi_3PH0,48
369
- policyengine_us/parameters/gov/hhs/fpg.yaml,sha256=O0GRTHiNjLvpS1kJBZRg5dZtDUwgijEJBZd9qpvp7nM,2619
375
+ policyengine_us/parameters/gov/hhs/fpg.yaml,sha256=EAzdlS_45gP9RMDAEdFYO-DUrL0M4VIqTB0xLrqkk_Q,3077
370
376
  policyengine_us/parameters/gov/hhs/index.yaml,sha256=diih4UjZz-5dZSiO89js5pJ-G3PO3kWspE7ybH4kCqk,66
371
377
  policyengine_us/parameters/gov/hhs/uprating.yaml,sha256=Xle2-jt8tZq8FCSAAMb5G4EOMoQoZlg8ligEDFqam8A,1149
372
378
  policyengine_us/parameters/gov/hhs/ccdf/README.md,sha256=5u4-bwFTCDWgj6711QBPRQMoJSUfXBp_o_1UTxITl8Y,37
@@ -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=vlmmXymCgkY58URYF-3-Sdcy_SvlScKjG-YF7vco2cU,10453
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
@@ -3325,7 +3334,7 @@ policyengine_us/tests/policy/baseline/gov/fcc/lifeline/integration.yaml,sha256=n
3325
3334
  policyengine_us/tests/policy/baseline/gov/fcc/lifeline/is_lifeline_eligible.yaml,sha256=Nofkgo0svSTj-0EfN0TPiDJyk8wkc5NeoLazrxUzzxY,1038
3326
3335
  policyengine_us/tests/policy/baseline/gov/fcc/lifeline/lifeline.yaml,sha256=zqId54reOZWNaOlC1MuwMf7VwFRRdfGiMEIHfesBLUg,2272
3327
3336
  policyengine_us/tests/policy/baseline/gov/hhs/hhs_smi.yaml,sha256=0-WdotyBCwN3NXPnhXZR9CPjSrNtkHMFWFOATUeZA40,695
3328
- policyengine_us/tests/policy/baseline/gov/hhs/spm_unit_fpg.yaml,sha256=-lG4o-YPlPRR5Iq5CL9kd9CD8Z4ENrIdrNKfAMpiZ28,281
3337
+ policyengine_us/tests/policy/baseline/gov/hhs/spm_unit_fpg.yaml,sha256=TIRg6qOpe0nv1kpDKJQghplZeooTkd5k1mrkLD-fMLg,1201
3329
3338
  policyengine_us/tests/policy/baseline/gov/hhs/ccdf/ccdf_age_group.yaml,sha256=q6HWK5MLULilVYh4lxpprq3Lx-FfFAzVUATbD3QRZUg,830
3330
3339
  policyengine_us/tests/policy/baseline/gov/hhs/ccdf/ccdf_copay.yaml,sha256=MC4vJ3LBPnPa882bucGrN7s3HNad_40dP1K2lL-N9uE,474
3331
3340
  policyengine_us/tests/policy/baseline/gov/hhs/ccdf/ccdf_county_cluster.yaml,sha256=V7RNNVYkrki9PagV9_dM4Kt6EWfEJHTTT_Lbcc0f148,647
@@ -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.410.0.dist-info/METADATA,sha256=W4v1Txfy2OU5cdb_0WzmrLboQDMtFpQn9c_2Id8p1vw,1649
8569
- policyengine_us-1.410.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8570
- policyengine_us-1.410.0.dist-info/entry_points.txt,sha256=MLaqNyNTbReALyKNkde85VkuFFpdPWAcy8VRG1mjczc,57
8571
- policyengine_us-1.410.0.dist-info/licenses/LICENSE,sha256=2N5ReRelkdqkR9a-KP-y-shmcD5P62XoYiG-miLTAzo,34519
8572
- policyengine_us-1.410.0.dist-info/RECORD,,
8579
+ policyengine_us-1.412.0.dist-info/METADATA,sha256=YAIWQ6dm_eFoV9V-gRBIKy2yrfBCaB27AgmiydQiPUA,1649
8580
+ policyengine_us-1.412.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
8581
+ policyengine_us-1.412.0.dist-info/entry_points.txt,sha256=MLaqNyNTbReALyKNkde85VkuFFpdPWAcy8VRG1mjczc,57
8582
+ policyengine_us-1.412.0.dist-info/licenses/LICENSE,sha256=2N5ReRelkdqkR9a-KP-y-shmcD5P62XoYiG-miLTAzo,34519
8583
+ policyengine_us-1.412.0.dist-info/RECORD,,