diff --git a/docs/make_uguide.py b/docs/make_uguide.py index da69b7360..5b02e73c4 100644 --- a/docs/make_uguide.py +++ b/docs/make_uguide.py @@ -9,7 +9,7 @@ import os import sys from collections import OrderedDict -from taxcalc import Policy, json_to_dict +from taxcalc import * INPUT_FILENAME = 'uguide.htmx' @@ -20,6 +20,7 @@ TAXCALC_PATH = os.path.join(CURDIR_PATH, '..', 'taxcalc') INPUT_PATH = os.path.join(CURDIR_PATH, INPUT_FILENAME) +TCJA_PATH = os.path.join(CURDIR_PATH,'../taxcalc/reforms/TCJA.json') POLICY_PATH = os.path.join(TAXCALC_PATH, 'policy_current_law.json') IOVARS_PATH = os.path.join(TAXCALC_PATH, 'records_variables.json') CONSUMPTION_PATH = os.path.join(TAXCALC_PATH, 'consumption.json') @@ -48,8 +49,9 @@ def main(): old = '' text = text.replace(old, topbtn) + params_dict = reformat_params() # augment text variable with information from JSON files - text = policy_params(POLICY_PATH, text) + text = policy_params(POLICY_PATH, text, params_dict) text = io_variables('read', IOVARS_PATH, text) text = io_variables('calc', IOVARS_PATH, text) text = assumption_params('consumption', CONSUMPTION_PATH, text) @@ -64,11 +66,51 @@ def main(): # end of main function code -def policy_param_text(pname, param): +def reformat_params(): + """ + Translates ParamTools-style policy_current_law.json + to a dictionary that resembles the old Tax-Calculator + parameter schema + """ + # Parameters that were changed by TCJA will be extended through + # 2026 in the uguide + tcja = Policy.read_json_reform(TCJA_PATH) + + pol = Policy() + pol.clear_state() + years_short = list(range(2013, 2020)) + years_long = list(range(2013, 2027)) + pol.set_year(years_long) + params = pol.specification(serializable=True, sort_values=True) + + # Create parameter dictionary that resembles old Tax-Calculator + # paramter schema + params_dict = {} + for param in params.keys(): + if param in tcja.keys(): + years = years_long + else: + years = years_short + params_dict[param] = {} + params_dict[param]['years'] = years + list_vals2 = [] + for year in years: + list_vals1 = [] + for idx in range(0, len(params[param])): + if params[param][idx]['year'] == year: + list_vals1.append(params[param][idx]['value']) + if params[param][idx]['year'] != params[param][idx - 1]['year']: + list_vals2.append(list_vals1) + params_dict[param]['values'] = list_vals2 + return params_dict + + +def policy_param_text(pname, param, params_dict): """ Extract info from param for pname and return as HTML string. """ # pylint: disable=too-many-statements,too-many-branches + sec1 = param['section_1'] if sec1: txt = '

{} — {}'.format(sec1, param['section_2']) @@ -76,10 +118,7 @@ def policy_param_text(pname, param): txt = '

{} — {}'.format('Other Parameters', 'Not in Tax-Brain webapp') txt += '
tc Name: {}'.format(pname) - if sec1: - txt += '
TB Name: {}'.format(param['long_name']) - else: - txt += '
Long Name: {}'.format(param['long_name']) + txt += '
Title: {}'.format(param['title']) txt += '
Description: {}'.format(param['description']) if param.get('notes', ''): txt += '
Notes: {}'.format(param['notes']) @@ -104,32 +143,32 @@ def policy_param_text(pname, param): txt += 'True' else: txt += 'False' - txt += '
Value Type: {}'.format(param['value_type']) + txt += '
Value Type: {}'.format(param['type']) txt += '
Known Values:' - if param.get('vi_vals', []): - cols = ', '.join(param['vi_vals']) - txt += '
   for: [{}]'.format(cols) - for cyr, val in zip(param['value_yrs'], param['value']): - final_cyr = cyr - final_val = val - txt += '
{}: {}'.format(cyr, val) - if not param['indexed']: - fcyr = int(final_cyr) - if fcyr < Policy.LAST_KNOWN_YEAR: - # extrapolate final_val thru Policy.LAST_KNOWN_YEAR if not indexed - for cyr in range(fcyr + 1, Policy.LAST_KNOWN_YEAR + 1): - txt += '
{}: {}'.format(cyr, final_val) + if len(params_dict[pname]['values'][0]) == 5: + txt += '
   for: [single, mjoint, mseparate, headhh, widow]' + elif len(params_dict[pname]['values'][0]) == 4: + txt += '
   for: [0kids, 1kid, 2kids, 3+kids]' + elif len(params_dict[pname]['values'][0]) == 7: + txt += '
   for: [med, sltx, retx, cas, misc, int, char]' + for cyr, val in zip(params_dict[pname]['years'], params_dict[pname]['values']): + if len(params_dict[pname]['values'][0]) == 1: + txt += '
{}: {}'.format(cyr, val[0]) + else: + txt += '
{}: {}'.format(cyr, val) txt += '
Valid Range:' - minval = param['valid_values']['min'] - maxval = param['valid_values']['max'] - txt += ' min = {} and max = {}'.format(minval, maxval) - invalid_action = param.get('invalid_action', 'stop') - txt += '
Out-of-Range Action: {}'.format(invalid_action) + validators = param.get("validators", None) + if validators: + minval = validators['range']['min'] + maxval = validators['range']['max'] + txt += ' min = {} and max = {}'.format(minval, maxval) + invalid_action = validators["range"].get('level', 'error') + txt += '
Out-of-Range Action: {}'.format(invalid_action) txt += '

' return txt -def policy_params(path, text): +def policy_params(path, text, params_dict): """ Read policy parameters from path, integrate them into text, and return the integrated text. @@ -144,6 +183,8 @@ def policy_params(path, text): section = OrderedDict() using_other_params_section = False for pname in params: + if pname == "schema": + continue param = params[pname] sec1_sec2 = '{}{}{}'.format(param['section_1'], concat_str, @@ -161,9 +202,11 @@ def policy_params(path, text): sec2 = split_list[1] ptext = '' for pname in params: + if pname == "schema": + continue param = params[pname] if sec1 == param['section_1'] and sec2 == param['section_2']: - ptext += policy_param_text(pname, param) + ptext += policy_param_text(pname, param, params_dict) # integrate parameter text into text old = ''.format(sec1_sec2) text = text.replace(old, ptext) @@ -233,9 +276,9 @@ def assumption_param_text(pname, ptype, param): ptype.capitalize()) txt += '
tc Name: {}'.format(pname) if sec1: - txt += '
TB Name: {}'.format(param['long_name']) + txt += '
TB Name: {}'.format(param['title']) else: - txt += '
Long Name: {}'.format(param['long_name']) + txt += '
Long Name: {}'.format(param['title']) txt += '
Description: {}'.format(param['description']) if param.get('notes', ''): txt += '
Notes: {}'.format(param['notes']) @@ -243,14 +286,20 @@ def assumption_param_text(pname, ptype, param): if param.get('vi_vals', []): cols = ', '.join(param['vi_vals']) txt += '
   for: [{}]'.format(cols) - for cyr, val in zip(param['value_yrs'], param['value']): - txt += '
{}: {}'.format(cyr, val) + for vo in param["value"]: + labels = " ".join( + f"{label}={value}" for label, value in vo.items() + if label not in ("year", "value") + ) + txt += f"
{vo['year']}: {vo['value']} {labels}" txt += '
Valid Range:' - minval = param['valid_values']['min'] - maxval = param['valid_values']['max'] - txt += ' min = {} and max = {}'.format(minval, maxval) - invalid_action = param.get('invalid_action', 'stop') - txt += '
Out-of-Range Action: {}'.format(invalid_action) + validators = param.get("validators", None) + if validators: + minval = validators['range']['min'] + maxval = validators['range']['max'] + txt += ' min = {} and max = {}'.format(minval, maxval) + invalid_action = validators["range"].get('level', 'error') + txt += '
Out-of-Range Action: {}'.format(invalid_action) txt += '

' return txt @@ -267,6 +316,8 @@ def assumption_params(ptype, path, text): # construct parameter text for each param ptext = '' for pname in params: + if pname == "schema": + continue param = params[pname] ptext += assumption_param_text(pname, ptype, param) # integrate parameter text into text diff --git a/docs/uguide.html b/docs/uguide.html index e0be8658d..d5b9776b8 100644 --- a/docs/uguide.html +++ b/docs/uguide.html @@ -867,137 +867,137 @@

3. Policy Parameters

3a. Parameter Indexing

-

Parameter Indexing — Offsets
tc Name: CPI_offset
TB Name: Decimal offset ADDED to unchained CPI to get parameter indexing rate
Description: Values are zero before 2017; reforms that introduce indexing with chained CPI would have values around -0.0025 beginning in the year before the first year policy parameters will have values computed with chained CPI.
Notes: See April 2013 CBO report entitled 'What Would Be the Effect on the Deficit of Using the Chained CPI to Index Benefit Programs and the Tax Code?', which includes this: 'The chained CPI grows more slowly than the traditional CPI does: an average of about 0.25 percentage points more slowly per year over the past decade.'
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: -0.0025
2018: -0.0025
2019: -0.0025
Valid Range: min = -0.005 and max = 0.005
Out-of-Range Action: stop

+

Parameter Indexing — Offsets
tc Name: CPI_offset
Title: Decimal offset ADDED to unchained CPI to get parameter indexing rate
Description: Values are zero before 2017; reforms that introduce indexing with chained CPI would have values around -0.0025 beginning in the year before the first year policy parameters will have values computed with chained CPI.
Notes: See April 2013 CBO report entitled 'What Would Be the Effect on the Deficit of Using the Chained CPI to Index Benefit Programs and the Tax Code?', which includes this: 'The chained CPI grows more slowly than the traditional CPI does: an average of about 0.25 percentage points more slowly per year over the past decade.'
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: -0.0025
2018: -0.0025
2019: -0.0025
2020: -0.0025
2021: -0.0025
2022: -0.0025
2023: -0.0025
2024: -0.0025
2025: -0.0025
2026: -0.0025
Valid Range: min = -0.005 and max = 0.005
Out-of-Range Action: error

3b. Payroll Taxes

-

Payroll Taxes — Social Security FICA
tc Name: FICA_ss_trt
TB Name: Social Security payroll tax rate
Description: Social Security FICA rate, including both employer and employee.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.124
2014: 0.124
2015: 0.124
2016: 0.124
2017: 0.124
2018: 0.124
2019: 0.124
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Payroll Taxes — Social Security FICA
tc Name: SS_Earnings_c
TB Name: Maximum taxable earnings (MTE) for Social Security
Description: Individual earnings below this amount are subjected to Social Security (OASDI) payroll tax.
Notes: This parameter is indexed by the rate of growth in average wages, not by the price inflation rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 113700.0
2014: 117000.0
2015: 118500.0
2016: 118500.0
2017: 127200.0
2018: 128400.0
2019: 132900.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Payroll Taxes — Social Security FICA
tc Name: SS_Earnings_thd
TB Name: Additional Taxable Earnings Threshold for Social Security
Description: Individual earnings above this threshold are subjected to Social Security (OASDI) payroll tax, in addition to earnings below the maximum taxable earnings threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Payroll Taxes — Social Security FICA
tc Name: FICA_ss_trt
Title: Social Security payroll tax rate
Description: Social Security FICA rate, including both employer and employee.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.124
2014: 0.124
2015: 0.124
2016: 0.124
2017: 0.124
2018: 0.124
2019: 0.124
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Payroll Taxes — Social Security FICA
tc Name: SS_Earnings_c
Title: Maximum taxable earnings (MTE) for Social Security
Description: Individual earnings below this amount are subjected to Social Security (OASDI) payroll tax.
Notes: This parameter is indexed by the rate of growth in average wages, not by the price inflation rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 113700.0
2014: 117000.0
2015: 118500.0
2016: 118500.0
2017: 127200.0
2018: 128400.0
2019: 132900.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Payroll Taxes — Social Security FICA
tc Name: SS_Earnings_thd
Title: Additional Taxable Earnings Threshold for Social Security
Description: Individual earnings above this threshold are subjected to Social Security (OASDI) payroll tax, in addition to earnings below the maximum taxable earnings threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Payroll Taxes — Medicare FICA
tc Name: FICA_mc_trt
TB Name: Medicare payroll tax rate
Description: Medicare FICA rate, including both employer and employee.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.029
2014: 0.029
2015: 0.029
2016: 0.029
2017: 0.029
2018: 0.029
2019: 0.029
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Payroll Taxes — Medicare FICA
tc Name: FICA_mc_trt
Title: Medicare payroll tax rate
Description: Medicare FICA rate, including both employer and employee.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.029
2014: 0.029
2015: 0.029
2016: 0.029
2017: 0.029
2018: 0.029
2019: 0.029
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Payroll Taxes — Additional Medicare FICA
tc Name: AMEDT_ec
TB Name: Additional Medicare tax earnings exclusion
Description: The Additional Medicare Tax rate, AMEDT_rt, applies to all earnings in excess of this excluded amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2014: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2015: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2016: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2017: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2018: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2019: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Payroll Taxes — Additional Medicare FICA
tc Name: AMEDT_rt
TB Name: Additional Medicare tax rate
Description: This is the rate applied to the portion of Medicare wages, RRTA compensation and self-employment income exceeding the Additional Medicare Tax earning exclusion.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.009
2014: 0.009
2015: 0.009
2016: 0.009
2017: 0.009
2018: 0.009
2019: 0.009
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Payroll Taxes — Additional Medicare FICA
tc Name: AMEDT_ec
Title: Additional Medicare tax earnings exclusion
Description: The Additional Medicare Tax rate, AMEDT_rt, applies to all earnings in excess of this excluded amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2014: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2015: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2016: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2017: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2018: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
2019: [200000.0, 250000.0, 125000.0, 200000.0, 200000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Payroll Taxes — Additional Medicare FICA
tc Name: AMEDT_rt
Title: Additional Medicare tax rate
Description: This is the rate applied to the portion of Medicare wages, RRTA compensation and self-employment income exceeding the Additional Medicare Tax earning exclusion.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.009
2014: 0.009
2015: 0.009
2016: 0.009
2017: 0.009
2018: 0.009
2019: 0.009
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3c. Social Security Taxability

-

Social Security Taxability — Threshold For Social Security Benefit Taxability 1
tc Name: SS_thd50
TB Name: Threshold for Social Security benefit taxability 1
Description: The first threshold for Social Security benefit taxability: if taxpayers have provisional income greater than this threshold, up to 50% of their Social Security benefit will be subject to tax under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2014: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2015: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2016: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2017: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2018: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2019: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
Valid Range: min = 0 and max = SS_thd85
Out-of-Range Action: stop

+

Social Security Taxability — Threshold For Social Security Benefit Taxability 1
tc Name: SS_thd50
Title: Threshold for Social Security benefit taxability 1
Description: The first threshold for Social Security benefit taxability: if taxpayers have provisional income greater than this threshold, up to 50% of their Social Security benefit will be subject to tax under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2014: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2015: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2016: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2017: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2018: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
2019: [25000.0, 32000.0, 25000.0, 25000.0, 25000.0]
Valid Range: min = 0 and max = SS_thd85
Out-of-Range Action: error

-

Social Security Taxability — Threshold For Social Security Benefit Taxability 2
tc Name: SS_thd85
TB Name: Threshold for Social Security benefit taxability 2
Description: The second threshold for Social Security taxability: if taxpayers have provisional income greater than this threshold, up to 85% of their Social Security benefit will be subject to tax under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2014: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2015: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2016: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2017: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2018: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2019: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
Valid Range: min = SS_thd50 and max = 9e+99
Out-of-Range Action: stop

+

Social Security Taxability — Threshold For Social Security Benefit Taxability 2
tc Name: SS_thd85
Title: Threshold for Social Security benefit taxability 2
Description: The second threshold for Social Security taxability: if taxpayers have provisional income greater than this threshold, up to 85% of their Social Security benefit will be subject to tax under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2014: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2015: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2016: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2017: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2018: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
2019: [34000.0, 44000.0, 34000.0, 34000.0, 34000.0]
Valid Range: min = SS_thd50 and max = 9e+99
Out-of-Range Action: error

3d. Above The Line Deductions

-

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_StudentLoan_hc
TB Name: Adjustment for student loan interest haircut
Description: This decimal fraction can be applied to limit the student loan interest adjustment allowed.
Notes: The final adjustment amount will be (1-Haircut)*StudentLoanInterest.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_SelfEmploymentTax_hc
TB Name: Adjustment for self-employment tax haircut
Description: This decimal fraction, if greater than zero, reduces the employer equivalent portion of self-employment adjustment.
Notes: The final adjustment amount would be (1-Haircut)*SelfEmploymentTaxAdjustment.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_SelfEmp_HealthIns_hc
TB Name: Adjustment for self employed health insurance haircut
Description: This decimal fraction, if greater than zero, reduces the health insurance adjustment for self-employed taxpayers.
Notes: The final adjustment amount would be (1-Haircut)*SelfEmployedHealthInsuranceAdjustment.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_KEOGH_SEP_hc
TB Name: Adjustment for contributions to either KEOGH or SEP plan haircut
Description: Under current law, contributions to Keogh or SEP plans can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.
Notes: The final adjustment amount is (1-Haircut)*KEOGH_SEP_Contributinos.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_EarlyWithdraw_hc
TB Name: Adjustment for early withdrawal penalty haircut
Description: Under current law, early withdraw penalty can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.
Notes: The final adjustment amount is (1-Haircut)*EarlyWithdrawPenalty.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_AlimonyPaid_hc
TB Name: Adjustment for alimony-paid haircut
Description: Under pre-TCJA law, the full amount of alimony paid is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.
Notes: The final adjustment amount would be (1-Haircut)*AlimonyPaid.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_AlimonyReceived_hc
TB Name: Adjustment for alimony-received haircut
Description: Under pre-TCJA law, none of alimony received is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.
Notes: The final adjustment amount would be (1-Haircut)*AlimonyReceived.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_EducatorExpenses_hc
TB Name: Deduction for educator expenses haircut
Description: If greater than zero, this decimal fraction reduces the portion of educator expenses that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*EducatorExpenses.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_HSADeduction_hc
TB Name: Deduction for HSA deduction haircut
Description: If greater than zero, this decimal fraction reduces the portion of a taxpayer's HSA deduction that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*HSA_Deduction.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_IRAContributions_hc
TB Name: Deduction for IRA contributions haircut
Description: If greater than zero, this decimal fraction reduces the portion of IRA contributions that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*IRA_Contribution.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_DomesticProduction_hc
TB Name: Deduction for domestic production activity haircut
Description: If greater than zero, this decimal fraction reduces the portion of domestic production activity that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*DomesticProductionActivity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_Tuition_hc
TB Name: Deduction for tuition and fees haircut
Description: If greater than zero, this decimal fraction reduces the portion of tuition and fees that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*TuitionFees.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_StudentLoan_hc
Title: Adjustment for student loan interest haircut
Description: This decimal fraction can be applied to limit the student loan interest adjustment allowed.
Notes: The final adjustment amount will be (1-Haircut)*StudentLoanInterest.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_SelfEmploymentTax_hc
Title: Adjustment for self-employment tax haircut
Description: This decimal fraction, if greater than zero, reduces the employer equivalent portion of self-employment adjustment.
Notes: The final adjustment amount would be (1-Haircut)*SelfEmploymentTaxAdjustment.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_SelfEmp_HealthIns_hc
Title: Adjustment for self employed health insurance haircut
Description: This decimal fraction, if greater than zero, reduces the health insurance adjustment for self-employed taxpayers.
Notes: The final adjustment amount would be (1-Haircut)*SelfEmployedHealthInsuranceAdjustment.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_KEOGH_SEP_hc
Title: Adjustment for contributions to either KEOGH or SEP plan haircut
Description: Under current law, contributions to Keogh or SEP plans can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.
Notes: The final adjustment amount is (1-Haircut)*KEOGH_SEP_Contributinos.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_EarlyWithdraw_hc
Title: Adjustment for early withdrawal penalty haircut
Description: Under current law, early withdraw penalty can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.
Notes: The final adjustment amount is (1-Haircut)*EarlyWithdrawPenalty.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_AlimonyPaid_hc
Title: Adjustment for alimony-paid haircut
Description: Under pre-TCJA law, the full amount of alimony paid is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.
Notes: The final adjustment amount would be (1-Haircut)*AlimonyPaid.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_AlimonyReceived_hc
Title: Adjustment for alimony-received haircut
Description: Under pre-TCJA law, none of alimony received is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.
Notes: The final adjustment amount would be (1-Haircut)*AlimonyReceived.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_EducatorExpenses_hc
Title: Deduction for educator expenses haircut
Description: If greater than zero, this decimal fraction reduces the portion of educator expenses that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*EducatorExpenses.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_HSADeduction_hc
Title: Deduction for HSA deduction haircut
Description: If greater than zero, this decimal fraction reduces the portion of a taxpayer's HSA deduction that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*HSA_Deduction.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_IRAContributions_hc
Title: Deduction for IRA contributions haircut
Description: If greater than zero, this decimal fraction reduces the portion of IRA contributions that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*IRA_Contribution.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_DomesticProduction_hc
Title: Deduction for domestic production activity haircut
Description: If greater than zero, this decimal fraction reduces the portion of domestic production activity that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*DomesticProductionActivity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Adjustment Haircuts
tc Name: ALD_Tuition_hc
Title: Deduction for tuition and fees haircut
Description: If greater than zero, this decimal fraction reduces the portion of tuition and fees that can be deducted from AGI.
Notes: The final adjustment amount would be (1-Haircut)*TuitionFees.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Above The Line Deductions — Misc. Exclusions
tc Name: ALD_InvInc_ec_rt
TB Name: Investment income exclusion rate haircut
Description: Decimal fraction of investment income base that can be excluded from AGI.
Notes: The final taxable investment income will be (1-_ALD_InvInc_ec_rt)*investment_income_base. Even though the excluded portion of investment income is not included in AGI, it still is included in investment income used to calculate the Net Investment Income Tax and Earned Income Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Misc. Exclusions
tc Name: ALD_BusinessLosses_c
TB Name: Maximum amount of business losses deductible
Description: Business losses in excess of this amount may not be deducted from AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [250000.0, 500000.0, 250000.0, 250000.0, 500000.0]
2019: [255000.0, 510000.0, 255000.0, 255000.0, 510000.0]
2020: [259029.0, 518058.0, 259029.0, 259029.0, 518058.0]
2021: [264675.83, 529351.66, 264675.83, 264675.83, 529351.66]
2022: [270683.97, 541367.95, 270683.97, 270683.97, 541367.95]
2023: [276936.77, 553873.55, 276936.77, 276936.77, 553873.55]
2024: [283084.77, 566169.54, 283084.77, 283084.77, 566169.54]
2025: [289199.4, 578398.8, 289199.4, 289199.4, 578398.8]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Above The Line Deductions — Misc. Exclusions
tc Name: ALD_InvInc_ec_rt
Title: Investment income exclusion rate haircut
Description: Decimal fraction of investment income base that can be excluded from AGI.
Notes: The final taxable investment income will be (1-_ALD_InvInc_ec_rt)*investment_income_base. Even though the excluded portion of investment income is not included in AGI, it still is included in investment income used to calculate the Net Investment Income Tax and Earned Income Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Misc. Exclusions
tc Name: ALD_BusinessLosses_c
Title: Maximum amount of business losses deductible
Description: Business losses in excess of this amount may not be deducted from AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [250000.0, 500000.0, 250000.0, 250000.0, 500000.0]
2019: [255000.0, 510000.0, 255000.0, 255000.0, 510000.0]
2020: [259029.0, 518058.0, 259029.0, 259029.0, 518058.0]
2021: [264675.83, 529351.66, 264675.83, 264675.83, 529351.66]
2022: [270683.97, 541367.94, 270683.97, 270683.97, 541367.94]
2023: [276936.77, 553873.54, 276936.77, 276936.77, 553873.54]
2024: [283084.77, 566169.53, 283084.77, 283084.77, 566169.53]
2025: [289199.4, 578398.79, 289199.4, 289199.4, 578398.79]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_hc
TB Name: Deduction for childcare costs haircut
Description: This decimal fraction, if greater than zero, reduces the portion of childcare costs that can be deducted from AGI.
Notes: The final adjustment would be (1-Haircut)*AverageChildcareCosts.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_Child_c
TB Name: National average childcare costs: ceiling for available childcare deduction.
Description: The weighted average of childcare costs in the US. 7165 is the weighted average from the 'Child Care in America: 2016 State Fact Sheets'.
Notes: This is a weighted average of childcare costs in each state
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_Elder_c
TB Name: Ceiling for elderly care deduction proposed in Trump's tax plan
Description: A taxpayer can take an above the line deduction up to this amount if they have an elderly dependent. The Trump 2016 campaign proposal was for $5000.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_thd
TB Name: Maximum level of income to qualify for the dependent care deduction
Description: A taxpayer can only claim the dependent care deduction if their total income is below this level. The Trump 2016 campaign proposal was for 250000 single, 500000 joint, 250000 separate, 500000 head of household].
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_hc
Title: Deduction for childcare costs haircut
Description: This decimal fraction, if greater than zero, reduces the portion of childcare costs that can be deducted from AGI.
Notes: The final adjustment would be (1-Haircut)*AverageChildcareCosts.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_Child_c
Title: National average childcare costs: ceiling for available childcare deduction.
Description: The weighted average of childcare costs in the US. 7165 is the weighted average from the 'Child Care in America: 2016 State Fact Sheets'.
Notes: This is a weighted average of childcare costs in each state
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_Elder_c
Title: Ceiling for elderly care deduction proposed in Trump's tax plan
Description: A taxpayer can take an above the line deduction up to this amount if they have an elderly dependent. The Trump 2016 campaign proposal was for $5000.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Above The Line Deductions — Child And Elderly Care
tc Name: ALD_Dependents_thd
Title: Maximum level of income to qualify for the dependent care deduction
Description: A taxpayer can only claim the dependent care deduction if their total income is below this level. The Trump 2016 campaign proposal was for 250000 single, 500000 joint, 250000 separate, 500000 head of household].
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

3e. Personal Exemptions

-

Personal Exemptions — Personal And Dependent Exemption Amount
tc Name: II_em
TB Name: Personal and dependent exemption amount
Description: Subtracted from AGI in the calculation of taxable income, per taxpayer and dependent.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 3900.0
2014: 3950.0
2015: 4000.0
2016: 4050.0
2017: 4050.0
2018: 0.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 4880.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Personal Exemptions — Personal And Dependent Exemption Amount
tc Name: II_em
Title: Personal and dependent exemption amount
Description: Subtracted from AGI in the calculation of taxable income, per taxpayer and dependent.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 3900.0
2014: 3950.0
2015: 4000.0
2016: 4050.0
2017: 4050.0
2018: 0.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 4880.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Personal Exemptions — Personal Exemption Phaseout Rate
tc Name: II_prt
TB Name: Personal exemption phaseout rate
Description: Personal exemption amount will decrease by this rate for each dollar of AGI exceeding exemption phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Personal Exemptions — Personal Exemption Phaseout Rate
tc Name: II_prt
Title: Personal exemption phaseout rate
Description: Personal exemption amount will decrease by this rate for each dollar of AGI exceeding exemption phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Personal Exemptions — Repeal for Dependents Under Age 18
tc Name: II_no_em_nu18
TB Name: Repeal personal exemptions for dependents under age 18
Description: Total personal exemptions will be decreased by the number of dependents under the age of 18.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Personal Exemptions — Repeal for Dependents Under Age 18
tc Name: II_no_em_nu18
Title: Repeal personal exemptions for dependents under age 18
Description: Total personal exemptions will be decreased by the number of dependents under the age of 18.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

3f. Standard Deduction

-

Standard Deduction — Standard Deduction Amount
tc Name: STD
TB Name: Standard deduction amount
Description: Amount filing unit can use as a standard deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [6100.0, 12200.0, 6100.0, 8950.0, 12200.0]
2014: [6200.0, 12400.0, 6200.0, 9100.0, 12400.0]
2015: [6300.0, 12600.0, 6300.0, 9250.0, 12600.0]
2016: [6300.0, 12600.0, 6300.0, 9300.0, 12600.0]
2017: [6350.0, 12700.0, 6350.0, 9350.0, 12700.0]
2018: [12000.0, 24000.0, 12000.0, 18000.0, 24000.0]
2019: [12200.0, 24400.0, 12200.0, 18350.0, 24400.0]
2020: [12392.76, 24785.52, 12392.76, 18639.93, 24785.52]
2021: [12662.92, 25325.84, 12662.92, 19046.28, 25325.84]
2022: [12950.37, 25900.74, 12950.37, 19478.63, 25900.74]
2023: [13249.52, 26499.05, 13249.52, 19928.59, 26499.05]
2024: [13543.66, 27087.33, 13543.66, 20371.0, 27087.33]
2025: [13836.21, 27672.41, 13836.21, 20811.02, 27672.41]
2026: [7651.0, 15303.0, 7651.0, 11266.0, 15303.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Standard Deduction — Standard Deduction Amount
tc Name: STD
Title: Standard deduction amount
Description: Amount filing unit can use as a standard deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [6100.0, 12200.0, 6100.0, 8950.0, 12200.0]
2014: [6200.0, 12400.0, 6200.0, 9100.0, 12400.0]
2015: [6300.0, 12600.0, 6300.0, 9250.0, 12600.0]
2016: [6300.0, 12600.0, 6300.0, 9300.0, 12600.0]
2017: [6350.0, 12700.0, 6350.0, 9350.0, 12700.0]
2018: [12000.0, 24000.0, 12000.0, 18000.0, 24000.0]
2019: [12200.0, 24400.0, 12200.0, 18350.0, 24400.0]
2020: [12392.76, 24785.52, 12392.76, 18639.93, 24785.52]
2021: [12662.92, 25325.84, 12662.92, 19046.28, 25325.84]
2022: [12950.37, 25900.74, 12950.37, 19478.63, 25900.74]
2023: [13249.52, 26499.05, 13249.52, 19928.59, 26499.05]
2024: [13543.66, 27087.33, 13543.66, 20371.0, 27087.33]
2025: [13836.2, 27672.42, 13836.2, 20811.01, 27672.42]
2026: [7651.0, 15303.0, 7651.0, 11266.0, 15303.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Standard Deduction — Additional Standard Deduction For Blind And Aged
tc Name: STD_Aged
TB Name: Additional standard deduction for blind and aged
Description: To get the standard deduction for aged or blind individuals, taxpayers need to add this value to regular standard deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1500.0, 1200.0, 1200.0, 1500.0, 1500.0]
2014: [1550.0, 1200.0, 1200.0, 1550.0, 1550.0]
2015: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2016: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2017: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2018: [1600.0, 1300.0, 1300.0, 1600.0, 1300.0]
2019: [1650.0, 1300.0, 1300.0, 1650.0, 1300.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Standard Deduction — Additional Standard Deduction For Blind And Aged
tc Name: STD_Aged
Title: Additional standard deduction for blind and aged
Description: To get the standard deduction for aged or blind individuals, taxpayers need to add this value to regular standard deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1500.0, 1200.0, 1200.0, 1500.0, 1500.0]
2014: [1550.0, 1200.0, 1200.0, 1550.0, 1550.0]
2015: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2016: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2017: [1550.0, 1250.0, 1250.0, 1550.0, 1550.0]
2018: [1600.0, 1300.0, 1300.0, 1600.0, 1300.0]
2019: [1650.0, 1300.0, 1300.0, 1650.0, 1300.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

3g. Nonrefundable Credits

-

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_c
TB Name: Maximum child & dependent care credit per dependent
Description: The maximum amount of credit allowed for each qualifying dependent.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 3000.0
2014: 3000.0
2015: 3000.0
2016: 3000.0
2017: 3000.0
2018: 3000.0
2019: 3000.0
Valid Range: min = 0 and max = 3000
Out-of-Range Action: stop

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_ps
TB Name: Child & dependent care credit phaseout start
Description: For taxpayers with AGI over this amount, the credit is reduced by one percentage point each $2000 of AGI over this amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 15000.0
2014: 15000.0
2015: 15000.0
2016: 15000.0
2017: 15000.0
2018: 15000.0
2019: 15000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_crt
TB Name: Child & dependent care credit phaseout percentage rate ceiling
Description: The maximum percentage rate in the AGI phaseout; this percentage rate decreases as AGI rises above the CDCC_ps level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 35.0
2014: 35.0
2015: 35.0
2016: 35.0
2017: 35.0
2018: 35.0
2019: 35.0
Valid Range: min = 0 and max = 100
Out-of-Range Action: stop

+

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_c
Title: Maximum child & dependent care credit per dependent
Description: The maximum amount of credit allowed for each qualifying dependent.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 3000.0
2014: 3000.0
2015: 3000.0
2016: 3000.0
2017: 3000.0
2018: 3000.0
2019: 3000.0
Valid Range: min = 0 and max = 3000
Out-of-Range Action: error

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_ps
Title: Child & dependent care credit phaseout start
Description: For taxpayers with AGI over this amount, the credit is reduced by one percentage point each $2000 of AGI over this amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 15000.0
2014: 15000.0
2015: 15000.0
2016: 15000.0
2017: 15000.0
2018: 15000.0
2019: 15000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Nonrefundable Credits — Child And Dependent Care
tc Name: CDCC_crt
Title: Child & dependent care credit phaseout percentage rate ceiling
Description: The maximum percentage rate in the AGI phaseout; this percentage rate decreases as AGI rises above the CDCC_ps level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 35.0
2014: 35.0
2015: 35.0
2016: 35.0
2017: 35.0
2018: 35.0
2019: 35.0
Valid Range: min = 0 and max = 100
Out-of-Range Action: error

-

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_RetirementSavings_hc
TB Name: Credit for retirement savings haircut
Description: If greater than zero, this decimal fraction reduces the portion of the retirement savings credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*RetirementSavingsCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_ForeignTax_hc
TB Name: Credit for foreign tax haircut
Description: If greater than zero, this decimal fraction reduces the portion of the foreign tax credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ForeignTaxCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_ResidentialEnergy_hc
TB Name: Credit for residential energy haircut
Description: If greater than zero, this decimal fraction reduces the portion of the residential energy credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ResidentialEnergyCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_GeneralBusiness_hc
TB Name: Credit for general business haircut
Description: If greater than zero, this decimal fraction reduces the portion of the general business credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*GeneralBusinessCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_MinimumTax_hc
TB Name: Credit for previous year minimum tax credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the previous year minimum tax credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*PreviousYearMinimumTaxCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_AmOppRefundable_hc
TB Name: Refundable portion of the American Opportunity Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the refundable American Opportunity credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*RefundablePortionOfAmericanOpportunityCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_AmOppNonRefundable_hc
TB Name: Nonrefundable portion of the American Opportunity Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the nonrefundable American Opportunity credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*NonRefundablePortionOfAmericanOpportunityCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_SchR_hc
TB Name: Schedule R Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of Schedule R credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ScheduleRCredit
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_OtherCredits_hc
TB Name: Other Credits haircut
Description: If greater than zero, this decimal fraction reduces the portion of other credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*OtherCredits.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_Education_hc
TB Name: Education Credits haircut
Description: If greater than zero, this decimal fraction reduces the portion of education credits that can be claimed.
Notes: Credit claimed will be (1-Haircut)*EducationCredits.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_RetirementSavings_hc
Title: Credit for retirement savings haircut
Description: If greater than zero, this decimal fraction reduces the portion of the retirement savings credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*RetirementSavingsCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_ForeignTax_hc
Title: Credit for foreign tax haircut
Description: If greater than zero, this decimal fraction reduces the portion of the foreign tax credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ForeignTaxCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_ResidentialEnergy_hc
Title: Credit for residential energy haircut
Description: If greater than zero, this decimal fraction reduces the portion of the residential energy credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ResidentialEnergyCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_GeneralBusiness_hc
Title: Credit for general business haircut
Description: If greater than zero, this decimal fraction reduces the portion of the general business credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*GeneralBusinessCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_MinimumTax_hc
Title: Credit for previous year minimum tax credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the previous year minimum tax credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*PreviousYearMinimumTaxCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_AmOppRefundable_hc
Title: Refundable portion of the American Opportunity Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the refundable American Opportunity credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*RefundablePortionOfAmericanOpportunityCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_AmOppNonRefundable_hc
Title: Nonrefundable portion of the American Opportunity Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of the nonrefundable American Opportunity credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*NonRefundablePortionOfAmericanOpportunityCredit.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_SchR_hc
Title: Schedule R Credit haircut
Description: If greater than zero, this decimal fraction reduces the portion of Schedule R credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*ScheduleRCredit
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_OtherCredits_hc
Title: Other Credits haircut
Description: If greater than zero, this decimal fraction reduces the portion of other credit that can be claimed.
Notes: Credit claimed will be (1-Haircut)*OtherCredits.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Nonrefundable Credits — Misc. Credit Limits
tc Name: CR_Education_hc
Title: Education Credits haircut
Description: If greater than zero, this decimal fraction reduces the portion of education credits that can be claimed.
Notes: Credit claimed will be (1-Haircut)*EducationCredits.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr
TB Name: Personal nonrefundable credit maximum amount
Description: This credit amount is not refundable and is phased out based on AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr_ps
TB Name: Personal nonrefundable credit phaseout start
Description: The personal nonrefundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr_prt
TB Name: Personal nonrefundable credit phaseout rate
Description: The personal nonrefundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_nr_ps threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr
Title: Personal nonrefundable credit maximum amount
Description: This credit amount is not refundable and is phased out based on AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr_ps
Title: Personal nonrefundable credit phaseout start
Description: The personal nonrefundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Nonrefundable Credits — Personal Nonrefundable Credit
tc Name: II_credit_nr_prt
Title: Personal nonrefundable credit phaseout rate
Description: The personal nonrefundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_nr_ps threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3h. Child/Dependent Credits

-

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_c
TB Name: Maximum nonrefundable child tax credit per child
Description: The maximum nonrefundable credit allowed for each child.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1000.0
2016: 1000.0
2017: 1000.0
2018: 2000.0
2019: 2000.0
2020: 2000.0
2021: 2000.0
2022: 2000.0
2023: 2000.0
2024: 2000.0
2025: 2000.0
2026: 1000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_c_under5_bonus
TB Name: Bonus child tax credit maximum for qualifying children under five
Description: The maximum amount of child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_ps
TB Name: Child tax credit phaseout MAGI start
Description: Child tax credit begins to decrease when MAGI is above this level; read descriptions of the dependent credit amounts for how they phase out when MAGI is above this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2014: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2015: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2016: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2017: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2020: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2021: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2022: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2023: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2024: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2025: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2026: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_prt
TB Name: Child and dependent tax credit phaseout rate
Description: The amount of the credit starts to decrease at this rate if MAGI is higher than child tax credit phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.05
2014: 0.05
2015: 0.05
2016: 0.05
2017: 0.05
2018: 0.05
2019: 0.05
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_c
Title: Maximum nonrefundable child tax credit per child
Description: The maximum nonrefundable credit allowed for each child.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1000.0
2016: 1000.0
2017: 1000.0
2018: 2000.0
2019: 2000.0
2020: 2000.0
2021: 2000.0
2022: 2000.0
2023: 2000.0
2024: 2000.0
2025: 2000.0
2026: 1000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_c_under5_bonus
Title: Bonus child tax credit maximum for qualifying children under five
Description: The maximum amount of child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_ps
Title: Child tax credit phaseout MAGI start
Description: Child tax credit begins to decrease when MAGI is above this level; read descriptions of the dependent credit amounts for how they phase out when MAGI is above this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2014: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2015: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2016: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2017: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2020: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2021: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2022: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2023: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2024: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2025: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2026: [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Child/Dependent Credits — Child Tax Credit
tc Name: CTC_prt
Title: Child and dependent tax credit phaseout rate
Description: The amount of the credit starts to decrease at this rate if MAGI is higher than child tax credit phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.05
2014: 0.05
2015: 0.05
2016: 0.05
2017: 0.05
2018: 0.05
2019: 0.05
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_c
TB Name: Maximum refundable additional child tax credit
Description: This refundable credit is applied to child dependents and phases out exactly like the CTC amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1000.0
2016: 1000.0
2017: 1000.0
2018: 1400.0
2019: 1400.0
2020: 1400.0
2021: 1400.0
2022: 1500.0
2023: 1500.0
2024: 1500.0
2025: 1600.0
2026: 1000.0
Valid Range: min = 0 and max = CTC_c
Out-of-Range Action: stop

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_rt
TB Name: Additional Child Tax Credit rate
Description: This is the fraction of earnings used in calculating the ACTC, which is a partially refundable credit that supplements the CTC for some taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_rt_bonus_under5family
TB Name: Bonus additional child tax credit rate for families with qualifying children under 5
Description: For families with qualifying children under 5 years old, this bonus rate is added to the fraction of earnings (additional child tax credit rate) used in calculating the ACTC.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_Income_thd
TB Name: Additional Child Tax Credit income threshold
Description: The portion of earned income below this threshold does not count as base for the Additional Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 3000.0
2014: 3000.0
2015: 3000.0
2016: 3000.0
2017: 3000.0
2018: 2500.0
2019: 2500.0
2020: 2500.0
2021: 2500.0
2022: 2500.0
2023: 2500.0
2024: 2500.0
2025: 2500.0
2026: 3000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_ChildNum
TB Name: Additional Child Tax Credit minimum number of qualified children for different formula
Description: Families with this number of qualified children or more may qualify for a different formula to calculate the Additional Child Tax Credit, which is a partially refundable credit that supplements the Child Tax Credit for some taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: integer
Known Values:
2013: 3
2014: 3
2015: 3
2016: 3
2017: 3
2018: 3
2019: 3
Valid Range: min = 0 and max = 99
Out-of-Range Action: stop

+

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_c
Title: Maximum refundable additional child tax credit
Description: This refundable credit is applied to child dependents and phases out exactly like the CTC amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1000.0
2016: 1000.0
2017: 1000.0
2018: 1400.0
2019: 1400.0
2020: 1400.0
2021: 1400.0
2022: 1500.0
2023: 1500.0
2024: 1500.0
2025: 1600.0
2026: 1000.0
Valid Range: min = 0 and max = CTC_c
Out-of-Range Action: error

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_rt
Title: Additional Child Tax Credit rate
Description: This is the fraction of earnings used in calculating the ACTC, which is a partially refundable credit that supplements the CTC for some taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_rt_bonus_under5family
Title: Bonus additional child tax credit rate for families with qualifying children under 5
Description: For families with qualifying children under 5 years old, this bonus rate is added to the fraction of earnings (additional child tax credit rate) used in calculating the ACTC.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_Income_thd
Title: Additional Child Tax Credit income threshold
Description: The portion of earned income below this threshold does not count as base for the Additional Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 3000.0
2014: 3000.0
2015: 3000.0
2016: 3000.0
2017: 3000.0
2018: 2500.0
2019: 2500.0
2020: 2500.0
2021: 2500.0
2022: 2500.0
2023: 2500.0
2024: 2500.0
2025: 2500.0
2026: 3000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Child/Dependent Credits — Additional Child Tax Credit
tc Name: ACTC_ChildNum
Title: Additional Child Tax Credit minimum number of qualified children for different formula
Description: Families with this number of qualified children or more may qualify for a different formula to calculate the Additional Child Tax Credit, which is a partially refundable credit that supplements the Child Tax Credit for some taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: int
Known Values:
2013: 3
2014: 3
2015: 3
2016: 3
2017: 3
2018: 3
2019: 3
Valid Range: min = 0 and max = 99
Out-of-Range Action: error

-

Child/Dependent Credits — Other Dependent Tax Credit
tc Name: ODC_c
TB Name: Maximum nonrefundable other-dependent credit
Description: This nonrefundable credit is applied to non-child dependents and phases out along with the CTC amount.
Notes: Became current-law policy with passage of TCJA
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 500.0
2019: 500.0
2020: 500.0
2021: 500.0
2022: 500.0
2023: 500.0
2024: 500.0
2025: 500.0
2026: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Child/Dependent Credits — Other Dependent Tax Credit
tc Name: ODC_c
Title: Maximum nonrefundable other-dependent credit
Description: This nonrefundable credit is applied to non-child dependents and phases out along with the CTC amount.
Notes: Became current-law policy with passage of TCJA
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 500.0
2019: 500.0
2020: 500.0
2021: 500.0
2022: 500.0
2023: 500.0
2024: 500.0
2025: 500.0
2026: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

3i. Itemized Deductions

-

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_frt
TB Name: Floor (as a decimal fraction of AGI) for deductible medical expenses.
Description: Taxpayers are eligible to deduct the portion of their medical expenses exceeding this fraction of AGI.
Notes: When using PUF data, lowering this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.075
2018: 0.075
2019: 0.075
Valid Range: min = 0.075 and max = 0.1
Out-of-Range Action: warn

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_frt_add4aged
TB Name: Addon floor (as a decimal fraction of AGI) for deductible medical expenses for elderly filing units.
Description: Elderly taxpayers have this fraction added to the value of the regular floor rate for deductible medical expenses. This fraction was -0.025 from 2013 to 2016, but that was temporary and it changed to zero beginning in 2017.
Notes: When using PUF data, changing this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: -0.025
2014: -0.025
2015: -0.025
2016: -0.025
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = -0.025 and max = 0.0
Out-of-Range Action: warn

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_hc
TB Name: Medical expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of medical expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_c
TB Name: Ceiling on the amount of medical expense deduction allowed (dollars)
Description: The amount of medical expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_frt
Title: Floor (as a decimal fraction of AGI) for deductible medical expenses.
Description: Taxpayers are eligible to deduct the portion of their medical expenses exceeding this fraction of AGI.
Notes: When using PUF data, lowering this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.075
2018: 0.075
2019: 0.075
2020: 0.075
2021: 0.075
2022: 0.075
2023: 0.075
2024: 0.075
2025: 0.075
2026: 0.075
Valid Range: min = 0.075 and max = 0.1
Out-of-Range Action: warn

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_frt_add4aged
Title: Addon floor (as a decimal fraction of AGI) for deductible medical expenses for elderly filing units.
Description: Elderly taxpayers have this fraction added to the value of the regular floor rate for deductible medical expenses. This fraction was -0.025 from 2013 to 2016, but that was temporary and it changed to zero beginning in 2017.
Notes: When using PUF data, changing this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: -0.025
2014: -0.025
2015: -0.025
2016: -0.025
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = -0.025 and max = 0.0
Out-of-Range Action: warn

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_hc
Title: Medical expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of medical expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Medical Expenses
tc Name: ID_Medical_c
Title: Ceiling on the amount of medical expense deduction allowed (dollars)
Description: The amount of medical expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_hc
TB Name: State and local income and sales taxes deduction haircut.
Description: This decimal fraction reduces the state and local income and sales tax deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_crt
TB Name: Ceiling (as a decimal fraction of AGI) for the combination of all state and local income and sales tax deductions.
Description: The total deduction for state and local taxes is capped at this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_c
TB Name: Ceiling on the amount of state and local income and sales taxes deduction allowed (dollars)
Description: The amount of state and local income and sales taxes deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_hc
Title: State and local income and sales taxes deduction haircut.
Description: This decimal fraction reduces the state and local income and sales tax deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_crt
Title: Ceiling (as a decimal fraction of AGI) for the combination of all state and local income and sales tax deductions.
Description: The total deduction for state and local taxes is capped at this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — State And Local Income And Sales Taxes
tc Name: ID_StateLocalTax_c
Title: Ceiling on the amount of state and local income and sales taxes deduction allowed (dollars)
Description: The amount of state and local income and sales taxes deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_hc
TB Name: State, local, and foreign real estate taxes deduction haircut.
Description: This decimal fraction reduces real estate taxes paid eligible to deduct in itemized deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_crt
TB Name: Ceiling (as a decimal fraction of AGI) for the combination of all state, local, and foreign real estate tax deductions.
Description: The total deduction for all real estate taxes is capped at this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_c
TB Name: Ceiling on the amount of state, local, and foreign real estate taxes deduction allowed (dollars)
Description: The amount of real estate taxes deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_hc
Title: State, local, and foreign real estate taxes deduction haircut.
Description: This decimal fraction reduces real estate taxes paid eligible to deduct in itemized deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_crt
Title: Ceiling (as a decimal fraction of AGI) for the combination of all state, local, and foreign real estate tax deductions.
Description: The total deduction for all real estate taxes is capped at this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — State, Local, And Foreign Real Estate Taxes
tc Name: ID_RealEstate_c
Title: Ceiling on the amount of state, local, and foreign real estate taxes deduction allowed (dollars)
Description: The amount of real estate taxes deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — State And Local Taxes And Real Estate Taxes
tc Name: ID_AllTaxes_hc
TB Name: State and local income, sales, and real estate tax deduction haircut.
Description: This decimal fraction reduces all state and local taxes paid eligible to deduct in itemized deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — State And Local Taxes And Real Estate Taxes
tc Name: ID_AllTaxes_c
TB Name: Ceiling on the amount of state and local income, sales and real estate tax deductions allowed (dollars)
Description: The amount of state and local income, sales and real estate tax deductions is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2019: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2020: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2021: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2022: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2023: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2024: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2025: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — State And Local Taxes And Real Estate Taxes
tc Name: ID_AllTaxes_hc
Title: State and local income, sales, and real estate tax deduction haircut.
Description: This decimal fraction reduces all state and local taxes paid eligible to deduct in itemized deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — State And Local Taxes And Real Estate Taxes
tc Name: ID_AllTaxes_c
Title: Ceiling on the amount of state and local income, sales and real estate tax deductions allowed (dollars)
Description: The amount of state and local income, sales and real estate tax deductions is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2019: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2020: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2021: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2022: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2023: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2024: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2025: [10000.0, 10000.0, 5000.0, 10000.0, 10000.0]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — Interest Paid
tc Name: ID_InterestPaid_hc
TB Name: Interest paid deduction haircut
Description: This decimal fraction can be applied to limit the amount of interest paid deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Interest Paid
tc Name: ID_InterestPaid_c
TB Name: Ceiling on the amount of interest paid deduction allowed (dollars)
Description: The amount of interest paid deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — Interest Paid
tc Name: ID_InterestPaid_hc
Title: Interest paid deduction haircut
Description: This decimal fraction can be applied to limit the amount of interest paid deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Interest Paid
tc Name: ID_InterestPaid_c
Title: Ceiling on the amount of interest paid deduction allowed (dollars)
Description: The amount of interest paid deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — Charity
tc Name: ID_Charity_crt_all
TB Name: Ceiling (as a decimal fraction of AGI) for all charitable contribution deductions
Description: The total deduction for charity is capped at this fraction of AGI.
Notes: When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.5
2014: 0.5
2015: 0.5
2016: 0.5
2017: 0.5
2018: 0.6
2019: 0.6
2020: 0.6
2021: 0.6
2022: 0.6
2023: 0.6
2024: 0.6
2025: 0.6
2026: 0.5
Valid Range: min = 0 and max = 0.6
Out-of-Range Action: warn

Itemized Deductions — Charity
tc Name: ID_Charity_crt_noncash
TB Name: Ceiling (as a decimal fraction of AGI) for noncash charitable contribution deductions
Description: The deduction for noncash charity contributions is capped at this fraction of AGI.
Notes: When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.3
2014: 0.3
2015: 0.3
2016: 0.3
2017: 0.3
2018: 0.3
2019: 0.3
Valid Range: min = 0 and max = 0.3
Out-of-Range Action: warn

Itemized Deductions — Charity
tc Name: ID_Charity_frt
TB Name: Floor (as a decimal fraction of AGI) for deductible charitable contributions.
Description: Taxpayers are eligible to deduct the portion of their charitable expense exceeding this fraction of AGI.
Notes: This parameter allows for implementation of Option 52 from https://www.cbo.gov/sites/default/files/cbofiles/attachments/49638-BudgetOptions.pdf.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Charity
tc Name: ID_Charity_hc
TB Name: Charity expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of charity expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Charity
tc Name: ID_Charity_c
TB Name: Ceiling on the amount of charity expense deduction allowed (dollars)
Description: The amount of charity expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — Charity
tc Name: ID_Charity_f
TB Name: Floor on the amount of charity expense deduction allowed (dollars)
Description: Only charitable giving in excess of this dollar amount is eligible for a deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — Charity
tc Name: ID_Charity_crt_all
Title: Ceiling (as a decimal fraction of AGI) for all charitable contribution deductions
Description: The total deduction for charity is capped at this fraction of AGI.
Notes: When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.5
2014: 0.5
2015: 0.5
2016: 0.5
2017: 0.5
2018: 0.6
2019: 0.6
2020: 0.6
2021: 0.6
2022: 0.6
2023: 0.6
2024: 0.6
2025: 0.6
2026: 0.5
Valid Range: min = 0 and max = 0.6
Out-of-Range Action: warn

Itemized Deductions — Charity
tc Name: ID_Charity_crt_noncash
Title: Ceiling (as a decimal fraction of AGI) for noncash charitable contribution deductions
Description: The deduction for noncash charity contributions is capped at this fraction of AGI.
Notes: When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.3
2014: 0.3
2015: 0.3
2016: 0.3
2017: 0.3
2018: 0.3
2019: 0.3
Valid Range: min = 0 and max = 0.3
Out-of-Range Action: warn

Itemized Deductions — Charity
tc Name: ID_Charity_frt
Title: Floor (as a decimal fraction of AGI) for deductible charitable contributions.
Description: Taxpayers are eligible to deduct the portion of their charitable expense exceeding this fraction of AGI.
Notes: This parameter allows for implementation of Option 52 from https://www.cbo.gov/sites/default/files/cbofiles/attachments/49638-BudgetOptions.pdf.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Charity
tc Name: ID_Charity_hc
Title: Charity expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of charity expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Charity
tc Name: ID_Charity_c
Title: Ceiling on the amount of charity expense deduction allowed (dollars)
Description: The amount of charity expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — Charity
tc Name: ID_Charity_f
Title: Floor on the amount of charity expense deduction allowed (dollars)
Description: Only charitable giving in excess of this dollar amount is eligible for a deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — Casualty
tc Name: ID_Casualty_frt
TB Name: Floor (as a decimal fraction of AGI) for deductible casualty loss.
Description: Taxpayers are eligible to deduct the portion of their gross casualty losses exceeding this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Casualty
tc Name: ID_Casualty_hc
TB Name: Casualty expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of casualty expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Casualty
tc Name: ID_Casualty_c
TB Name: Ceiling on the amount of casualty expense deduction allowed (dollars)
Description: The amount of casualty expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — Casualty
tc Name: ID_Casualty_frt
Title: Floor (as a decimal fraction of AGI) for deductible casualty loss.
Description: Taxpayers are eligible to deduct the portion of their gross casualty losses exceeding this fraction of AGI.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Casualty
tc Name: ID_Casualty_hc
Title: Casualty expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of casualty expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Casualty
tc Name: ID_Casualty_c
Title: Ceiling on the amount of casualty expense deduction allowed (dollars)
Description: The amount of casualty expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_frt
TB Name: Floor (as a decimal fraction of AGI) for deductible miscellaneous expenses.
Description: Taxpayers are eligible to deduct the portion of their miscellaneous expense exceeding this fraction of AGI.
Notes: When using PUF data, lowering this parameter value may produce unexpected results because in PUF data the variable e20400 is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0.02 and max = 1
Out-of-Range Action: warn

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_hc
TB Name: Miscellaneous expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of miscellaneous expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_c
TB Name: Ceiling on the amount of miscellaneous expense deduction allowed (dollars)
Description: The amount of miscellaneous expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_frt
Title: Floor (as a decimal fraction of AGI) for deductible miscellaneous expenses.
Description: Taxpayers are eligible to deduct the portion of their miscellaneous expense exceeding this fraction of AGI.
Notes: When using PUF data, lowering this parameter value may produce unexpected results because in PUF data the variable e20400 is zero below the floor.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0.02 and max = 1
Out-of-Range Action: warn

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_hc
Title: Miscellaneous expense deduction haircut
Description: This decimal fraction can be applied to limit the amount of miscellaneous expense deduction allowed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Miscellaneous
tc Name: ID_Miscellaneous_c
Title: Ceiling on the amount of miscellaneous expense deduction allowed (dollars)
Description: The amount of miscellaneous expense deduction is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_ps
TB Name: Itemized deduction phaseout AGI start (Pease provision)
Description: The itemized deductions will be reduced for taxpayers with AGI higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [250000.0, 300000.0, 150000.0, 275000.0, 300000.0]
2014: [254200.0, 305050.0, 152525.0, 279650.0, 305050.0]
2015: [258250.0, 309900.0, 154950.0, 284050.0, 309900.0]
2016: [259400.0, 311300.0, 155650.0, 285350.0, 311300.0]
2017: [261500.0, 313800.0, 156900.0, 287650.0, 313800.0]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2020: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2021: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2022: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2023: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2024: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2025: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2026: [315093.0, 378112.0, 189056.0, 346603.0, 378112.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_prt
TB Name: Itemized deduction phaseout rate (Pease provision)
Description: Taxpayers will not be eligible to deduct the full amount of itemized deduction if their AGI is above the phaseout start. The deductible portion would be decreased at this rate for each dollar exceeding the start.
Notes: This phaseout rate cannot be lower than 0.03 for each dollar, due to limited data on non-itemizers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.03
2014: 0.03
2015: 0.03
2016: 0.03
2017: 0.03
2018: 0.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 0.03
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_crt
TB Name: Itemized deduction maximum phaseout as a decimal fraction of total itemized deductions (Pease provision)
Description: The phaseout amount is capped at this fraction of the original total deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.8
2014: 0.8
2015: 0.8
2016: 0.8
2017: 0.8
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.8
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_ps
Title: Itemized deduction phaseout AGI start (Pease provision)
Description: The itemized deductions will be reduced for taxpayers with AGI higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [250000.0, 300000.0, 150000.0, 275000.0, 300000.0]
2014: [254200.0, 305050.0, 152525.0, 279650.0, 305050.0]
2015: [258250.0, 309900.0, 154950.0, 284050.0, 309900.0]
2016: [259400.0, 311300.0, 155650.0, 285350.0, 311300.0]
2017: [261500.0, 313800.0, 156900.0, 287650.0, 313800.0]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2020: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2021: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2022: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2023: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2024: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2025: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2026: [315093.0, 378112.0, 189056.0, 346603.0, 378112.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_prt
Title: Itemized deduction phaseout rate (Pease provision)
Description: Taxpayers will not be eligible to deduct the full amount of itemized deduction if their AGI is above the phaseout start. The deductible portion would be decreased at this rate for each dollar exceeding the start.
Notes: This phaseout rate cannot be lower than 0.03 for each dollar, due to limited data on non-itemizers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.03
2014: 0.03
2015: 0.03
2016: 0.03
2017: 0.03
2018: 0.0
2019: 0.0
2020: 0.0
2021: 0.0
2022: 0.0
2023: 0.0
2024: 0.0
2025: 0.0
2026: 0.03
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Itemized Deduction Limitation
tc Name: ID_crt
Title: Itemized deduction maximum phaseout as a decimal fraction of total itemized deductions (Pease provision)
Description: The phaseout amount is capped at this fraction of the original total deduction.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.8
2014: 0.8
2015: 0.8
2016: 0.8
2017: 0.8
2018: 1.0
2019: 1.0
2020: 1.0
2021: 1.0
2022: 1.0
2023: 1.0
2024: 1.0
2025: 1.0
2026: 0.8
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_trt
TB Name: Surtax rate on the benefits from specified itemized deductions
Description: The benefit from specified itemized deductions exceeding the credit is taxed at this rate. A surtax rate of 1 strictly limits the benefit from specified itemized deductions to the specified credit. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_crt
TB Name: Credit on itemized deduction benefit surtax (decimal fraction of AGI)
Description: The surtax on specified itemized deductions applies to benefits in excess of this fraction of AGI. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_em
TB Name: Exemption for itemized deduction benefit surtax (dollar AGI threshold)
Description: This amount is subtracted from itemized deduction benefits in the calculation of the itemized deduction benefit surtax. With ID_BenefitSurtax_crt set to 0.0 and ID_BenefitSurtax_trt set to 1.0, this amount serves as a dollar limit on the value of itemized deductions.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_Switch
TB Name: Deductions subject to the surtax on itemized deduction benefits
Description: The surtax on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_trt
Title: Surtax rate on the benefits from specified itemized deductions
Description: The benefit from specified itemized deductions exceeding the credit is taxed at this rate. A surtax rate of 1 strictly limits the benefit from specified itemized deductions to the specified credit. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_crt
Title: Credit on itemized deduction benefit surtax (decimal fraction of AGI)
Description: The surtax on specified itemized deductions applies to benefits in excess of this fraction of AGI. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_em
Title: Exemption for itemized deduction benefit surtax (dollar AGI threshold)
Description: This amount is subtracted from itemized deduction benefits in the calculation of the itemized deduction benefit surtax. With ID_BenefitSurtax_crt set to 0.0 and ID_BenefitSurtax_trt set to 1.0, this amount serves as a dollar limit on the value of itemized deductions.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — Surtax On Itemized Deduction Benefits Above An AGI Threshold
tc Name: ID_BenefitSurtax_Switch
Title: Deductions subject to the surtax on itemized deduction benefits
Description: The surtax on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: error

-

Itemized Deductions — Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses
tc Name: ID_BenefitCap_rt
TB Name: Ceiling on the benefits from itemized deductions; decimal fraction of total deductible expenses
Description: The benefit from specified itemized deductions is capped at this percent of the total deductible expenses.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Itemized Deductions — Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses
tc Name: ID_BenefitCap_Switch
TB Name: Deductions subject to the cap on itemized deduction benefits
Description: The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Itemized Deductions — Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses
tc Name: ID_BenefitCap_rt
Title: Ceiling on the benefits from itemized deductions; decimal fraction of total deductible expenses
Description: The benefit from specified itemized deductions is capped at this percent of the total deductible expenses.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Itemized Deductions — Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses
tc Name: ID_BenefitCap_Switch
Title: Deductions subject to the cap on itemized deduction benefits
Description: The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: error

-

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_c
TB Name: Ceiling on the amount of itemized deductions allowed (dollars)
Description: The amount of itemized deductions is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_AmountCap_rt
TB Name: Ceiling on the gross amount of itemized deductions allowed; decimal fraction of AGI
Description: The gross allowable amount of specified itemized deductions is capped at this percent of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_AmountCap_Switch
TB Name: Deductions subject to the cap on itemized deduction benefits
Description: The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_c
Title: Ceiling on the amount of itemized deductions allowed (dollars)
Description: The amount of itemized deductions is limited to this dollar amount.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_AmountCap_rt
Title: Ceiling on the gross amount of itemized deductions allowed; decimal fraction of AGI
Description: The gross allowable amount of specified itemized deductions is capped at this percent of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Itemized Deductions — Ceiling On The Amount Of Itemized Deductions Allowed
tc Name: ID_AmountCap_Switch
Title: Deductions subject to the cap on itemized deduction benefits
Description: The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
   for: [med, sltx, retx, cas, misc, int, char]
2013: [True, True, True, True, True, True, True]
2014: [True, True, True, True, True, True, True]
2015: [True, True, True, True, True, True, True]
2016: [True, True, True, True, True, True, True]
2017: [True, True, True, True, True, True, True]
2018: [True, True, True, True, True, True, True]
2019: [True, True, True, True, True, True, True]
Valid Range: min = False and max = True
Out-of-Range Action: error

3j. Capital Gains And Dividends

-

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt1
TB Name: Long term capital gain and qualified dividends (regular/non-AMT) rate 1
Description: The capital gain and dividends (stacked on top of regular income) that are below threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk1
TB Name: Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 1
Description: The gains and dividends (stacked on top of regular income) below this are taxed at capital gain rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38600.0, 77200.0, 38600.0, 51700.0, 77200.0]
2019: [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]
Valid Range: min = 0 and max = CG_brk2
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt2
TB Name: Long term capital gain and qualified dividends (regular/non-AMT) rate 2
Description: The capital gain and dividends (stacked on top of regular income) that are below threshold 2 and above threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk2
TB Name: Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 2
Description: The gains and dividends (stacked on top of regular income) below this and above top of bracket 1 are taxed at capital gain rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [425800.0, 479000.0, 239500.0, 452400.0, 479000.0]
2019: [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]
Valid Range: min = CG_brk1 and max = CG_brk3
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt3
TB Name: Long term capital gain and qualified dividends (regular/non-AMT) rate 3
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 2 and below threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.2
2014: 0.2
2015: 0.2
2016: 0.2
2017: 0.2
2018: 0.2
2019: 0.2
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk3
TB Name: Top of long-term capital gains and qualified dividend tax (regular/non-AMT) bracket 3
Description: The gains and dividends (stacked on top of regular income) below this and above top of bracket 2 are taxed at the capital gain rate 3; above this they are taxed at capital gain rate 4. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = CG_brk2 and max = 9e+99
Out-of-Range Action: stop

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt4
TB Name: Long term capital gain and qualified dividends (regular/non-AMT) rate 4
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt1
Title: Long term capital gain and qualified dividends (regular/non-AMT) rate 1
Description: The capital gain and dividends (stacked on top of regular income) that are below threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk1
Title: Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 1
Description: The gains and dividends (stacked on top of regular income) below this are taxed at capital gain rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38600.0, 77200.0, 38600.0, 51700.0, 77200.0]
2019: [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]
Valid Range: min = 0 and max = CG_brk2
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt2
Title: Long term capital gain and qualified dividends (regular/non-AMT) rate 2
Description: The capital gain and dividends (stacked on top of regular income) that are below threshold 2 and above threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk2
Title: Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 2
Description: The gains and dividends (stacked on top of regular income) below this and above top of bracket 1 are taxed at capital gain rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [425800.0, 479000.0, 239500.0, 452400.0, 479000.0]
2019: [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]
Valid Range: min = CG_brk1 and max = CG_brk3
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt3
Title: Long term capital gain and qualified dividends (regular/non-AMT) rate 3
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 2 and below threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.2
2014: 0.2
2015: 0.2
2016: 0.2
2017: 0.2
2018: 0.2
2019: 0.2
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_brk3
Title: Top of long-term capital gains and qualified dividend tax (regular/non-AMT) bracket 3
Description: The gains and dividends (stacked on top of regular income) below this and above top of bracket 2 are taxed at the capital gain rate 3; above this they are taxed at capital gain rate 4. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = CG_brk2 and max = 9e+99
Out-of-Range Action: error

Capital Gains And Dividends — Regular - Long Term Capital Gains And Qualified Dividends
tc Name: CG_rt4
Title: Long term capital gain and qualified dividends (regular/non-AMT) rate 4
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt1
TB Name: Long term capital gain and qualified dividends (AMT) rate 1
Description: Capital gain and qualified dividends (stacked on top of regular income) below threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk1
TB Name: Top of long-term capital gains and qualified dividends (AMT) tax bracket 1
Description: The gains and dividends, stacked last, of AMT taxable income below this are taxed at AMT capital gain rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38600.0, 77200.0, 38600.0, 51700.0, 77200.0]
2019: [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]
Valid Range: min = 0 and max = AMT_CG_brk2
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt2
TB Name: Long term capital gain and qualified dividends (AMT) rate 2
Description: Capital gain and qualified dividend (stacked on top of regular income) below threshold 2 and above threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk2
TB Name: Top of long-term capital gains and qualified dividends (AMT) tax bracket 2
Description: The gains and dividends, stacked last, of AMT taxable income below this threshold and above bracket 1 are taxed at AMT capital gain rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [425800.0, 479000.0, 239500.0, 452400.0, 479000.0]
2019: [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]
Valid Range: min = AMT_CG_brk1 and max = AMT_CG_brk3
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt3
TB Name: Long term capital gain and qualified dividends (AMT) rate 3
Description: The capital gain and qualified dividend (stacked on top of regular income) above threshold 2 and below threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.2
2014: 0.2
2015: 0.2
2016: 0.2
2017: 0.2
2018: 0.2
2019: 0.2
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk3
TB Name: Long term capital gain and qualified dividends (AMT) threshold 3
Description: The gains and dividends, stacked last, of AMT taxable income below this and above bracket 2 are taxed at capital gain rate 3; above thisthey are taxed at AMT capital gain rate 4. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = AMT_CG_brk2 and max = 9e+99
Out-of-Range Action: stop

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt4
TB Name: Long term capital gain and qualified dividends (AMT) rate 4
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt1
Title: Long term capital gain and qualified dividends (AMT) rate 1
Description: Capital gain and qualified dividends (stacked on top of regular income) below threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk1
Title: Top of long-term capital gains and qualified dividends (AMT) tax bracket 1
Description: The gains and dividends, stacked last, of AMT taxable income below this are taxed at AMT capital gain rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38600.0, 77200.0, 38600.0, 51700.0, 77200.0]
2019: [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]
Valid Range: min = 0 and max = AMT_CG_brk2
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt2
Title: Long term capital gain and qualified dividends (AMT) rate 2
Description: Capital gain and qualified dividend (stacked on top of regular income) below threshold 2 and above threshold 1 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.15
2019: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk2
Title: Top of long-term capital gains and qualified dividends (AMT) tax bracket 2
Description: The gains and dividends, stacked last, of AMT taxable income below this threshold and above bracket 1 are taxed at AMT capital gain rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [425800.0, 479000.0, 239500.0, 452400.0, 479000.0]
2019: [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]
Valid Range: min = AMT_CG_brk1 and max = AMT_CG_brk3
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt3
Title: Long term capital gain and qualified dividends (AMT) rate 3
Description: The capital gain and qualified dividend (stacked on top of regular income) above threshold 2 and below threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.2
2014: 0.2
2015: 0.2
2016: 0.2
2017: 0.2
2018: 0.2
2019: 0.2
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_brk3
Title: Long term capital gain and qualified dividends (AMT) threshold 3
Description: The gains and dividends, stacked last, of AMT taxable income below this and above bracket 2 are taxed at capital gain rate 3; above thisthey are taxed at AMT capital gain rate 4. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = AMT_CG_brk2 and max = 9e+99
Out-of-Range Action: error

Capital Gains And Dividends — AMT - Long Term Capital Gains And Qualified Dividends
tc Name: AMT_CG_rt4
Title: Long term capital gain and qualified dividends (AMT) rate 4
Description: The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_nodiff
TB Name: Long term capital gains and qualified dividends taxed no differently than regular taxable income
Description: Specifies whether or not long term capital gains and qualified dividends are taxed like regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_ec
TB Name: Dollar amount of all capital gains and qualified dividends that are excluded from AGI.
Description: Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_reinvest_ec_rt
TB Name: Fraction of all capital gains and qualified dividends in excess of the dollar exclusion that are excluded from AGI.
Description: Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income. To limit the exclusion to capital gains and dividends invested within one year, set to statutory exclusion rate times the fraction of capital gains and qualified dividends in excess of the exclusion that are assumed to be reinvested within the year.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_nodiff
Title: Long term capital gains and qualified dividends taxed no differently than regular taxable income
Description: Specifies whether or not long term capital gains and qualified dividends are taxed like regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_ec
Title: Dollar amount of all capital gains and qualified dividends that are excluded from AGI.
Description: Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Capital Gains And Dividends — Tax All Capital Gains And Dividends The Same As Regular Taxable Income
tc Name: CG_reinvest_ec_rt
Title: Fraction of all capital gains and qualified dividends in excess of the dollar exclusion that are excluded from AGI.
Description: Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income. To limit the exclusion to capital gains and dividends invested within one year, set to statutory exclusion rate times the fraction of capital gains and qualified dividends in excess of the exclusion that are assumed to be reinvested within the year.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3k. Personal Income

-

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt1
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 1
Description: The lowest tax rate, applied to the portion of taxable income below tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
2020: 0.1
2021: 0.1
2022: 0.1
2023: 0.1
2024: 0.1
2025: 0.1
2026: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk1
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 1
Description: Taxable income below this threshold is taxed at tax rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [8925.0, 17850.0, 8925.0, 12750.0, 17850.0]
2014: [9075.0, 18150.0, 9075.0, 12950.0, 18150.0]
2015: [9225.0, 18450.0, 9225.0, 13150.0, 18450.0]
2016: [9275.0, 18550.0, 9275.0, 13250.0, 18550.0]
2017: [9325.0, 18650.0, 9325.0, 13350.0, 18650.0]
2018: [9525.0, 19050.0, 9525.0, 13600.0, 19050.0]
2019: [9700.0, 19400.0, 9700.0, 13850.0, 19400.0]
2020: [9853.26, 19706.52, 9853.26, 14068.83, 19706.52]
2021: [10068.06, 20136.12, 10068.06, 14375.53, 20136.12]
2022: [10296.61, 20593.21, 10296.61, 14701.86, 20593.21]
2023: [10534.46, 21068.92, 10534.46, 15041.47, 21068.92]
2024: [10768.32, 21536.65, 10768.32, 15375.39, 21536.65]
2025: [11000.92, 22001.84, 11000.92, 15707.5, 22001.84]
2026: [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]
Valid Range: min = 0 and max = II_brk2
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt2
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 2
Description: The second lowest tax rate, applied to the portion of taxable income below tax bracket 2 and above tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.12
2019: 0.12
2020: 0.12
2021: 0.12
2022: 0.12
2023: 0.12
2024: 0.12
2025: 0.12
2026: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk2
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 2
Description: Income below this threshold and above tax bracket 1 is taxed at tax rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38700.0, 77400.0, 38700.0, 51800.0, 77400.0]
2019: [39475.0, 78950.0, 39475.0, 52850.0, 78950.0]
2020: [40098.7, 80197.41, 40098.7, 53685.03, 80197.41]
2021: [40972.86, 81945.71, 40972.86, 54855.36, 81945.71]
2022: [41902.94, 83805.88, 41902.94, 56100.58, 83805.88]
2023: [42870.9, 85741.8, 42870.9, 57396.5, 85741.8]
2024: [43822.63, 87645.26, 43822.63, 58670.71, 87645.26]
2025: [44769.2, 89538.4, 44769.2, 59937.99, 89538.4]
2026: [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]
Valid Range: min = II_brk1 and max = II_brk3
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt3
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 3
Description: The third lowest tax rate, applied to the portion of taxable income below tax bracket 3 and above tax bracket 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.22
2019: 0.22
2020: 0.22
2021: 0.22
2022: 0.22
2023: 0.22
2024: 0.22
2025: 0.22
2026: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk3
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 3
Description: Income below this threshold and above tax bracket 2 is taxed at tax rate 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [87850.0, 146400.0, 73200.0, 125450.0, 146400.0]
2014: [89350.0, 148850.0, 74425.0, 127550.0, 148850.0]
2015: [90750.0, 151200.0, 75600.0, 129600.0, 151200.0]
2016: [91150.0, 151900.0, 75950.0, 130150.0, 151900.0]
2017: [91900.0, 153100.0, 76550.0, 131200.0, 153100.0]
2018: [82500.0, 165000.0, 82500.0, 82500.0, 165000.0]
2019: [84200.0, 168400.0, 84200.0, 84200.0, 168400.0]
2020: [85530.36, 171060.72, 85530.36, 85530.36, 171060.72]
2021: [87394.92, 174789.84, 87394.92, 87394.92, 174789.84]
2022: [89378.79, 178757.57, 89378.79, 89378.79, 178757.57]
2023: [91443.44, 182886.87, 91443.44, 91443.44, 182886.87]
2024: [93473.48, 186946.96, 93473.48, 93473.48, 186946.96]
2025: [95492.51, 190985.02, 95492.51, 95492.51, 190985.02]
2026: [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]
Valid Range: min = II_brk2 and max = II_brk4
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt4
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 4
Description: The tax rate applied to the portion of taxable income below tax bracket 4 and above tax bracket 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.28
2014: 0.28
2015: 0.28
2016: 0.28
2017: 0.28
2018: 0.24
2019: 0.24
2020: 0.24
2021: 0.24
2022: 0.24
2023: 0.24
2024: 0.24
2025: 0.24
2026: 0.28
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk4
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 4
Description: Income below this threshold and above tax bracket 3 is taxed at tax rate 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [183250.0, 223050.0, 111525.0, 203150.0, 223050.0]
2014: [186350.0, 226850.0, 113425.0, 206600.0, 226850.0]
2015: [189300.0, 230450.0, 115225.0, 209850.0, 230450.0]
2016: [190150.0, 231450.0, 115725.0, 210800.0, 231450.0]
2017: [191650.0, 233350.0, 116675.0, 212500.0, 233350.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160725.0, 321450.0, 160725.0, 160700.0, 321450.0]
2020: [163264.46, 326528.91, 163264.46, 163239.06, 326528.91]
2021: [166823.62, 333647.24, 166823.62, 166797.67, 333647.24]
2022: [170610.52, 341221.03, 170610.52, 170583.98, 341221.03]
2023: [174551.62, 349103.24, 174551.62, 174524.47, 349103.24]
2024: [178426.67, 356853.33, 178426.67, 178398.91, 356853.33]
2025: [182280.68, 364561.36, 182280.68, 182252.33, 364561.36]
2026: [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]
Valid Range: min = II_brk3 and max = II_brk5
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt5
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 5
Description: The third highest tax rate, applied to the portion of taxable income below tax bracket 5 and above tax bracket 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.33
2014: 0.33
2015: 0.33
2016: 0.33
2017: 0.33
2018: 0.32
2019: 0.32
2020: 0.32
2021: 0.32
2022: 0.32
2023: 0.32
2024: 0.32
2025: 0.32
2026: 0.33
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk5
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 5
Description: Income below this threshold and above tax bracket 4 is taxed at tax rate 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [398350.0, 398350.0, 199175.0, 398350.0, 398350.0]
2014: [405100.0, 405100.0, 202550.0, 405100.0, 405100.0]
2015: [411500.0, 411500.0, 205750.0, 411500.0, 411500.0]
2016: [413350.0, 413350.0, 206675.0, 413350.0, 413350.0]
2017: [416700.0, 416700.0, 208350.0, 416700.0, 416700.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [204100.0, 408200.0, 204100.0, 204100.0, 408200.0]
2020: [207324.78, 414649.56, 207324.78, 207324.78, 414649.56]
2021: [211844.46, 423688.92, 211844.46, 211844.46, 423688.92]
2022: [216653.33, 433306.66, 216653.33, 216653.33, 433306.66]
2023: [221658.02, 443316.04, 221658.02, 221658.02, 443316.04]
2024: [226578.83, 453157.66, 226578.83, 226578.83, 453157.66]
2025: [231472.93, 462945.86, 231472.93, 231472.93, 462945.86]
2026: [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]
Valid Range: min = II_brk4 and max = II_brk6
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt6
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 6
Description: The second higher tax rate, applied to the portion of taxable income below tax bracket 6 and above tax bracket 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.35
2014: 0.35
2015: 0.35
2016: 0.35
2017: 0.35
2018: 0.35
2019: 0.35
2020: 0.35
2021: 0.35
2022: 0.35
2023: 0.35
2024: 0.35
2025: 0.35
2026: 0.35
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk6
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket 6
Description: Income below this threshold and above tax bracket 5 is taxed at tax rate 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [500000.0, 600000.0, 300000.0, 500000.0, 600000.0]
2019: [510300.0, 612350.0, 306175.0, 510300.0, 612350.0]
2020: [518362.74, 622025.13, 311012.56, 518362.74, 622025.13]
2021: [529663.05, 635585.28, 317792.64, 529663.05, 635585.28]
2022: [541686.4, 650013.06, 325006.53, 541686.4, 650013.06]
2023: [554199.35, 665028.37, 332514.18, 554199.35, 665028.37]
2024: [566502.58, 679792.0, 339896.0, 566502.58, 679792.0]
2025: [578739.04, 694475.5, 347237.75, 578739.04, 694475.5]
2026: [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]
Valid Range: min = II_brk5 and max = II_brk7
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt7
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 7
Description: The tax rate applied to the portion of taxable income below tax bracket 7 and above tax bracket 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.396
2014: 0.396
2015: 0.396
2016: 0.396
2017: 0.396
2018: 0.37
2019: 0.37
2020: 0.37
2021: 0.37
2022: 0.37
2023: 0.37
2024: 0.37
2025: 0.37
2026: 0.396
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk7
TB Name: Personal income (regular/non-AMT/non-pass-through) tax bracket 7
Description: Income below this threshold and above tax bracket 6 is taxed at tax rate 7; income above this threshold is taxed at tax rate 8. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2020: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2021: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2022: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2023: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2024: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2025: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = II_brk6 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt8
TB Name: Personal income (regular/non-AMT/non-pass-through) tax rate 8
Description: The tax rate applied to the portion of taxable income above tax bracket 7.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt1
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 1
Description: The lowest tax rate, applied to the portion of taxable income below tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
2020: 0.1
2021: 0.1
2022: 0.1
2023: 0.1
2024: 0.1
2025: 0.1
2026: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk1
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 1
Description: Taxable income below this threshold is taxed at tax rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [8925.0, 17850.0, 8925.0, 12750.0, 17850.0]
2014: [9075.0, 18150.0, 9075.0, 12950.0, 18150.0]
2015: [9225.0, 18450.0, 9225.0, 13150.0, 18450.0]
2016: [9275.0, 18550.0, 9275.0, 13250.0, 18550.0]
2017: [9325.0, 18650.0, 9325.0, 13350.0, 18650.0]
2018: [9525.0, 19050.0, 9525.0, 13600.0, 19050.0]
2019: [9700.0, 19400.0, 9700.0, 13850.0, 19400.0]
2020: [9853.26, 19706.52, 9853.26, 14068.83, 19706.52]
2021: [10068.06, 20136.12, 10068.06, 14375.53, 20136.12]
2022: [10296.6, 20593.21, 10296.6, 14701.85, 20593.21]
2023: [10534.45, 21068.91, 10534.45, 15041.46, 21068.91]
2024: [10768.31, 21536.64, 10768.31, 15375.38, 21536.64]
2025: [11000.91, 22001.83, 11000.91, 15707.49, 22001.83]
2026: [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]
Valid Range: min = 0 and max = II_brk2
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt2
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 2
Description: The second lowest tax rate, applied to the portion of taxable income below tax bracket 2 and above tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.12
2019: 0.12
2020: 0.12
2021: 0.12
2022: 0.12
2023: 0.12
2024: 0.12
2025: 0.12
2026: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk2
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 2
Description: Income below this threshold and above tax bracket 1 is taxed at tax rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38700.0, 77400.0, 38700.0, 51800.0, 77400.0]
2019: [39475.0, 78950.0, 39475.0, 52850.0, 78950.0]
2020: [40098.7, 80197.41, 40098.7, 53685.03, 80197.41]
2021: [40972.85, 81945.71, 40972.85, 54855.36, 81945.71]
2022: [41902.93, 83805.88, 41902.93, 56100.58, 83805.88]
2023: [42870.89, 85741.8, 42870.89, 57396.5, 85741.8]
2024: [43822.62, 87645.27, 43822.62, 58670.7, 87645.27]
2025: [44769.19, 89538.41, 44769.19, 59937.99, 89538.41]
2026: [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]
Valid Range: min = II_brk1 and max = II_brk3
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt3
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 3
Description: The third lowest tax rate, applied to the portion of taxable income below tax bracket 3 and above tax bracket 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.22
2019: 0.22
2020: 0.22
2021: 0.22
2022: 0.22
2023: 0.22
2024: 0.22
2025: 0.22
2026: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk3
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 3
Description: Income below this threshold and above tax bracket 2 is taxed at tax rate 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [87850.0, 146400.0, 73200.0, 125450.0, 146400.0]
2014: [89350.0, 148850.0, 74425.0, 127550.0, 148850.0]
2015: [90750.0, 151200.0, 75600.0, 129600.0, 151200.0]
2016: [91150.0, 151900.0, 75950.0, 130150.0, 151900.0]
2017: [91900.0, 153100.0, 76550.0, 131200.0, 153100.0]
2018: [82500.0, 165000.0, 82500.0, 82500.0, 165000.0]
2019: [84200.0, 168400.0, 84200.0, 84200.0, 168400.0]
2020: [85530.36, 171060.72, 85530.36, 85530.36, 171060.72]
2021: [87394.92, 174789.84, 87394.92, 87394.92, 174789.84]
2022: [89378.78, 178757.57, 89378.78, 89378.78, 178757.57]
2023: [91443.43, 182886.87, 91443.43, 91443.43, 182886.87]
2024: [93473.47, 186946.96, 93473.47, 93473.47, 186946.96]
2025: [95492.5, 190985.01, 95492.5, 95492.5, 190985.01]
2026: [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]
Valid Range: min = II_brk2 and max = II_brk4
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt4
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 4
Description: The tax rate applied to the portion of taxable income below tax bracket 4 and above tax bracket 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.28
2014: 0.28
2015: 0.28
2016: 0.28
2017: 0.28
2018: 0.24
2019: 0.24
2020: 0.24
2021: 0.24
2022: 0.24
2023: 0.24
2024: 0.24
2025: 0.24
2026: 0.28
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk4
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 4
Description: Income below this threshold and above tax bracket 3 is taxed at tax rate 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [183250.0, 223050.0, 111525.0, 203150.0, 223050.0]
2014: [186350.0, 226850.0, 113425.0, 206600.0, 226850.0]
2015: [189300.0, 230450.0, 115225.0, 209850.0, 230450.0]
2016: [190150.0, 231450.0, 115725.0, 210800.0, 231450.0]
2017: [191650.0, 233350.0, 116675.0, 212500.0, 233350.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160725.0, 321450.0, 160725.0, 160700.0, 321450.0]
2020: [163264.46, 326528.91, 163264.46, 163239.06, 326528.91]
2021: [166823.63, 333647.24, 166823.63, 166797.67, 333647.24]
2022: [170610.53, 341221.03, 170610.53, 170583.98, 341221.03]
2023: [174551.63, 349103.24, 174551.63, 174524.47, 349103.24]
2024: [178426.68, 356853.33, 178426.68, 178398.91, 356853.33]
2025: [182280.7, 364561.36, 182280.7, 182252.33, 364561.36]
2026: [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]
Valid Range: min = II_brk3 and max = II_brk5
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt5
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 5
Description: The third highest tax rate, applied to the portion of taxable income below tax bracket 5 and above tax bracket 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.33
2014: 0.33
2015: 0.33
2016: 0.33
2017: 0.33
2018: 0.32
2019: 0.32
2020: 0.32
2021: 0.32
2022: 0.32
2023: 0.32
2024: 0.32
2025: 0.32
2026: 0.33
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk5
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 5
Description: Income below this threshold and above tax bracket 4 is taxed at tax rate 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [398350.0, 398350.0, 199175.0, 398350.0, 398350.0]
2014: [405100.0, 405100.0, 202550.0, 405100.0, 405100.0]
2015: [411500.0, 411500.0, 205750.0, 411500.0, 411500.0]
2016: [413350.0, 413350.0, 206675.0, 413350.0, 413350.0]
2017: [416700.0, 416700.0, 208350.0, 416700.0, 416700.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [204100.0, 408200.0, 204100.0, 204100.0, 408200.0]
2020: [207324.78, 414649.56, 207324.78, 207324.78, 414649.56]
2021: [211844.46, 423688.92, 211844.46, 211844.46, 423688.92]
2022: [216653.33, 433306.66, 216653.33, 216653.33, 433306.66]
2023: [221658.02, 443316.04, 221658.02, 221658.02, 443316.04]
2024: [226578.83, 453157.66, 226578.83, 226578.83, 453157.66]
2025: [231472.93, 462945.87, 231472.93, 231472.93, 462945.87]
2026: [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]
Valid Range: min = II_brk4 and max = II_brk6
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt6
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 6
Description: The second higher tax rate, applied to the portion of taxable income below tax bracket 6 and above tax bracket 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.35
2014: 0.35
2015: 0.35
2016: 0.35
2017: 0.35
2018: 0.35
2019: 0.35
2020: 0.35
2021: 0.35
2022: 0.35
2023: 0.35
2024: 0.35
2025: 0.35
2026: 0.35
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk6
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket 6
Description: Income below this threshold and above tax bracket 5 is taxed at tax rate 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [500000.0, 600000.0, 300000.0, 500000.0, 600000.0]
2019: [510300.0, 612350.0, 306175.0, 510300.0, 612350.0]
2020: [518362.74, 622025.13, 311012.56, 518362.74, 622025.13]
2021: [529663.05, 635585.28, 317792.63, 529663.05, 635585.28]
2022: [541686.4, 650013.07, 325006.52, 541686.4, 650013.07]
2023: [554199.36, 665028.37, 332514.17, 554199.36, 665028.37]
2024: [566502.59, 679792.0, 339895.98, 566502.59, 679792.0]
2025: [578739.05, 694475.51, 347237.73, 578739.05, 694475.51]
2026: [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]
Valid Range: min = II_brk5 and max = II_brk7
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt7
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 7
Description: The tax rate applied to the portion of taxable income below tax bracket 7 and above tax bracket 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.396
2014: 0.396
2015: 0.396
2016: 0.396
2017: 0.396
2018: 0.37
2019: 0.37
2020: 0.37
2021: 0.37
2022: 0.37
2023: 0.37
2024: 0.37
2025: 0.37
2026: 0.396
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_brk7
Title: Personal income (regular/non-AMT/non-pass-through) tax bracket 7
Description: Income below this threshold and above tax bracket 6 is taxed at tax rate 7; income above this threshold is taxed at tax rate 8. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = II_brk6 and max = 9e+99
Out-of-Range Action: error

Personal Income — Regular: Non-AMT, Non-Pass-Through
tc Name: II_rt8
Title: Personal income (regular/non-AMT/non-pass-through) tax rate 8
Description: The tax rate applied to the portion of taxable income above tax bracket 7.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Personal Income — Pass-Through
tc Name: PT_rt1
TB Name: Pass-through income tax rate 1
Description: The lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
2020: 0.1
2021: 0.1
2022: 0.1
2023: 0.1
2024: 0.1
2025: 0.1
2026: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk1
TB Name: Pass-through income tax bracket (upper threshold) 1
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold is taxed at tax rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [8925.0, 17850.0, 8925.0, 12750.0, 17850.0]
2014: [9075.0, 18150.0, 9075.0, 12950.0, 18150.0]
2015: [9225.0, 18450.0, 9225.0, 13150.0, 18450.0]
2016: [9275.0, 18550.0, 9275.0, 13250.0, 18550.0]
2017: [9325.0, 18650.0, 9325.0, 13350.0, 18650.0]
2018: [9525.0, 19050.0, 9525.0, 13600.0, 19050.0]
2019: [9700.0, 19400.0, 9700.0, 13850.0, 19400.0]
2020: [9853.26, 19706.52, 9853.26, 14068.83, 19706.52]
2021: [10068.06, 20136.12, 10068.06, 14375.53, 20136.12]
2022: [10296.61, 20593.21, 10296.61, 14701.86, 20593.21]
2023: [10534.46, 21068.92, 10534.46, 15041.47, 21068.92]
2024: [10768.32, 21536.65, 10768.32, 15375.39, 21536.65]
2025: [11000.92, 22001.84, 11000.92, 15707.5, 22001.84]
2026: [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]
Valid Range: min = 0 and max = PT_brk2
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt2
TB Name: Pass-through income tax rate 2
Description: The second lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 2 and above tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.12
2019: 0.12
2020: 0.12
2021: 0.12
2022: 0.12
2023: 0.12
2024: 0.12
2025: 0.12
2026: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk2
TB Name: Pass-through income tax bracket (upper threshold) 2
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 1 is taxed at tax rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38700.0, 77400.0, 38700.0, 51800.0, 77400.0]
2019: [39475.0, 78950.0, 39475.0, 52850.0, 78950.0]
2020: [40098.7, 80197.41, 40098.7, 53685.03, 80197.41]
2021: [40972.86, 81945.71, 40972.86, 54855.36, 81945.71]
2022: [41902.94, 83805.88, 41902.94, 56100.58, 83805.88]
2023: [42870.9, 85741.8, 42870.9, 57396.5, 85741.8]
2024: [43822.63, 87645.26, 43822.63, 58670.71, 87645.26]
2025: [44769.2, 89538.4, 44769.2, 59937.99, 89538.4]
2026: [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]
Valid Range: min = PT_brk1 and max = PT_brk3
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt3
TB Name: Pass-through income tax rate 3
Description: The third lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 3 and above tax bracket 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.22
2019: 0.22
2020: 0.22
2021: 0.22
2022: 0.22
2023: 0.22
2024: 0.22
2025: 0.22
2026: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk3
TB Name: Pass-through income tax bracket (upper threshold) 3
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 2 is taxed at tax rate 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [87850.0, 146400.0, 73200.0, 125450.0, 146400.0]
2014: [89350.0, 148850.0, 74425.0, 127550.0, 148850.0]
2015: [90750.0, 151200.0, 75600.0, 129600.0, 151200.0]
2016: [91150.0, 151900.0, 75950.0, 130150.0, 151900.0]
2017: [91900.0, 153100.0, 76550.0, 131200.0, 153100.0]
2018: [82500.0, 165000.0, 82500.0, 82500.0, 165000.0]
2019: [84200.0, 168400.0, 84200.0, 84200.0, 168400.0]
2020: [85530.36, 171060.72, 85530.36, 85530.36, 171060.72]
2021: [87394.92, 174789.84, 87394.92, 87394.92, 174789.84]
2022: [89378.79, 178757.57, 89378.79, 89378.79, 178757.57]
2023: [91443.44, 182886.87, 91443.44, 91443.44, 182886.87]
2024: [93473.48, 186946.96, 93473.48, 93473.48, 186946.96]
2025: [95492.51, 190985.02, 95492.51, 95492.51, 190985.02]
2026: [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]
Valid Range: min = PT_brk2 and max = PT_brk4
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt4
TB Name: Pass-through income tax rate 4
Description: The tax rate applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 4 and above tax bracket 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.28
2014: 0.28
2015: 0.28
2016: 0.28
2017: 0.28
2018: 0.24
2019: 0.24
2020: 0.24
2021: 0.24
2022: 0.24
2023: 0.24
2024: 0.24
2025: 0.24
2026: 0.28
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk4
TB Name: Pass-through income tax bracket (upper threshold) 4
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 3 is taxed at tax rate 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [183250.0, 223050.0, 111525.0, 203150.0, 223050.0]
2014: [186350.0, 226850.0, 113425.0, 206600.0, 226850.0]
2015: [189300.0, 230450.0, 115225.0, 209850.0, 230450.0]
2016: [190150.0, 231450.0, 115725.0, 210800.0, 231450.0]
2017: [191650.0, 233350.0, 116675.0, 212500.0, 233350.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160725.0, 321450.0, 160725.0, 160700.0, 321450.0]
2020: [163264.46, 326528.91, 163264.46, 163239.06, 326528.91]
2021: [166823.62, 333647.24, 166823.62, 166797.67, 333647.24]
2022: [170610.52, 341221.03, 170610.52, 170583.98, 341221.03]
2023: [174551.62, 349103.24, 174551.62, 174524.47, 349103.24]
2024: [178426.67, 356853.33, 178426.67, 178398.91, 356853.33]
2025: [182280.68, 364561.36, 182280.68, 182252.33, 364561.36]
2026: [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]
Valid Range: min = PT_brk3 and max = PT_brk5
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt5
TB Name: Pass-through income tax rate 5
Description: The third highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 5 and above tax bracket 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.33
2014: 0.33
2015: 0.33
2016: 0.33
2017: 0.33
2018: 0.32
2019: 0.32
2020: 0.32
2021: 0.32
2022: 0.32
2023: 0.32
2024: 0.32
2025: 0.32
2026: 0.33
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk5
TB Name: Pass-through income tax bracket (upper threshold) 5
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 4 is taxed at tax rate 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [398350.0, 398350.0, 199175.0, 398350.0, 398350.0]
2014: [405100.0, 405100.0, 202550.0, 405100.0, 405100.0]
2015: [411500.0, 411500.0, 205750.0, 411500.0, 411500.0]
2016: [413350.0, 413350.0, 206675.0, 413350.0, 413350.0]
2017: [416700.0, 416700.0, 208350.0, 416700.0, 416700.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [204100.0, 408200.0, 204100.0, 204100.0, 408200.0]
2020: [207324.78, 414649.56, 207324.78, 207324.78, 414649.56]
2021: [211844.46, 423688.92, 211844.46, 211844.46, 423688.92]
2022: [216653.33, 433306.66, 216653.33, 216653.33, 433306.66]
2023: [221658.02, 443316.04, 221658.02, 221658.02, 443316.04]
2024: [226578.83, 453157.66, 226578.83, 226578.83, 453157.66]
2025: [231472.93, 462945.86, 231472.93, 231472.93, 462945.86]
2026: [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]
Valid Range: min = PT_brk4 and max = PT_brk6
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt6
TB Name: Pass-through income tax rate 6
Description: The second higher tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 6 and above tax bracket 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.35
2014: 0.35
2015: 0.35
2016: 0.35
2017: 0.35
2018: 0.35
2019: 0.35
2020: 0.35
2021: 0.35
2022: 0.35
2023: 0.35
2024: 0.35
2025: 0.35
2026: 0.35
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk6
TB Name: Pass-through income tax bracket (upper threshold) 6
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 5 is taxed at tax rate 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [500000.0, 600000.0, 300000.0, 500000.0, 600000.0]
2019: [510300.0, 612350.0, 306175.0, 510300.0, 612350.0]
2020: [518362.74, 622025.13, 311012.56, 518362.74, 622025.13]
2021: [529663.05, 635585.28, 317792.64, 529663.05, 635585.28]
2022: [541686.4, 650013.06, 325006.53, 541686.4, 650013.06]
2023: [554199.35, 665028.37, 332514.18, 554199.35, 665028.37]
2024: [566502.58, 679792.0, 339896.0, 566502.58, 679792.0]
2025: [578739.04, 694475.5, 347237.75, 578739.04, 694475.5]
2026: [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]
Valid Range: min = PT_brk5 and max = PT_brk7
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt7
TB Name: Pass-through income tax rate 7
Description: The highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 7 and above tax bracket 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.396
2014: 0.396
2015: 0.396
2016: 0.396
2017: 0.396
2018: 0.37
2019: 0.37
2020: 0.37
2021: 0.37
2022: 0.37
2023: 0.37
2024: 0.37
2025: 0.37
2026: 0.396
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_brk7
TB Name: Extra pass-through income tax bracket
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 6 is taxed at tax rate 7. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2020: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2021: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2022: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2023: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2024: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2025: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2026: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = PT_brk6 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_rt8
TB Name: Extra pass-through income tax rate
Description: The extra tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations above the tax bracket 7.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_EligibleRate_active
TB Name: Share of active business income eligible for PT rate schedule
Description: Eligibility rate of active business income for separate pass-through rates.
Notes: Active business income defined as e00900 + e26270
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_EligibleRate_passive
TB Name: Share of passive business income eligible for PT rate schedule
Description: Eligibility rate of passive business income for mseparate pass-through rates.
Notes: Passive business income defined as e02000 - e26270
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_wages_active_income
TB Name: Wages included in (positive) active business income eligible for PT rates
Description: Whether active business income eligibility base for PT schedule for includes wages.
Notes: Only applies if active business income is positive
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_top_stacking
TB Name: PT taxable income stacked on top of regular taxable income
Description: Whether taxable income eligible for PT rate schedule is stacked on top of regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: True
2014: True
2015: True
2016: True
2017: True
2018: True
2019: True
Valid Range: min = False and max = True
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_rt
TB Name: Pass-through qualified business income deduction rate
Description: Fraction of pass-through business income that may be excluded from taxable income.
Notes: Applies to e00900 + e26270
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.2
2019: 0.2
2020: 0.2
2021: 0.2
2022: 0.2
2023: 0.2
2024: 0.2
2025: 0.2
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_taxinc_thd
TB Name: Lower threshold of pre-QBID taxable income
Description: Pre-QBID taxable income above this lower threshold implies the QBID amount begins to be limited.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160700.0, 321400.0, 160725.0, 160700.0, 321400.0]
2020: [163239.06, 326478.12, 163264.46, 163239.06, 326478.12]
2021: [166797.67, 333595.34, 166823.62, 166797.67, 333595.34]
2022: [170583.98, 341167.96, 170610.52, 170583.98, 341167.96]
2023: [174524.47, 349048.94, 174551.62, 174524.47, 349048.94]
2024: [178398.91, 356797.82, 178426.67, 178398.91, 356797.82]
2025: [182252.33, 364504.66, 182280.68, 182252.33, 364504.66]
2026: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_taxinc_gap
TB Name: Dollar gap between upper and lower threshold of pre-QBID taxable income
Description: Pre-QBID taxable income above this upper threshold implies the QBID amount is even more limited.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1.0, 1.0, 1.0, 1.0, 1.0]
2014: [1.0, 1.0, 1.0, 1.0, 1.0]
2015: [1.0, 1.0, 1.0, 1.0, 1.0]
2016: [1.0, 1.0, 1.0, 1.0, 1.0]
2017: [1.0, 1.0, 1.0, 1.0, 1.0]
2018: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2019: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2020: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2021: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2022: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2023: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2024: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2025: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2026: [1.0, 1.0, 1.0, 1.0, 1.0]
Valid Range: min = 1 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_w2_wages_rt
TB Name: QBID cap rate on pass-through business W-2 wages paid
Description: QBID is capped at this fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.5
2019: 0.5
2020: 0.5
2021: 0.5
2022: 0.5
2023: 0.5
2024: 0.5
2025: 0.5
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_alt_w2_wages_rt
TB Name: Alternative QBID cap rate on pass-through business W-2 wages paid
Description: QBID is capped at this fraction of W-2 wages paid by the pass-through business plus some fraction of business property if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.25
2019: 0.25
2020: 0.25
2021: 0.25
2022: 0.25
2023: 0.25
2024: 0.25
2025: 0.25
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Pass-Through
tc Name: PT_qbid_alt_property_rt
TB Name: Alternative QBID cap rate on pass-through business property owned
Description: QBID is capped at this fraction of business property owned plus some fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.025
2019: 0.025
2020: 0.025
2021: 0.025
2022: 0.025
2023: 0.025
2024: 0.025
2025: 0.025
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Personal Income — Pass-Through
tc Name: PT_rt1
Title: Pass-through income tax rate 1
Description: The lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.1
2014: 0.1
2015: 0.1
2016: 0.1
2017: 0.1
2018: 0.1
2019: 0.1
2020: 0.1
2021: 0.1
2022: 0.1
2023: 0.1
2024: 0.1
2025: 0.1
2026: 0.1
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk1
Title: Pass-through income tax bracket (upper threshold) 1
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold is taxed at tax rate 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [8925.0, 17850.0, 8925.0, 12750.0, 17850.0]
2014: [9075.0, 18150.0, 9075.0, 12950.0, 18150.0]
2015: [9225.0, 18450.0, 9225.0, 13150.0, 18450.0]
2016: [9275.0, 18550.0, 9275.0, 13250.0, 18550.0]
2017: [9325.0, 18650.0, 9325.0, 13350.0, 18650.0]
2018: [9525.0, 19050.0, 9525.0, 13600.0, 19050.0]
2019: [9700.0, 19400.0, 9700.0, 13850.0, 19400.0]
2020: [9853.26, 19706.52, 9853.26, 14068.83, 19706.52]
2021: [10068.06, 20136.12, 10068.06, 14375.53, 20136.12]
2022: [10296.6, 20593.21, 10296.6, 14701.85, 20593.21]
2023: [10534.45, 21068.91, 10534.45, 15041.46, 21068.91]
2024: [10768.31, 21536.64, 10768.31, 15375.38, 21536.64]
2025: [11000.91, 22001.83, 11000.91, 15707.49, 22001.83]
2026: [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]
Valid Range: min = 0 and max = PT_brk2
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt2
Title: Pass-through income tax rate 2
Description: The second lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 2 and above tax bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.15
2014: 0.15
2015: 0.15
2016: 0.15
2017: 0.15
2018: 0.12
2019: 0.12
2020: 0.12
2021: 0.12
2022: 0.12
2023: 0.12
2024: 0.12
2025: 0.12
2026: 0.15
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk2
Title: Pass-through income tax bracket (upper threshold) 2
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 1 is taxed at tax rate 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [36250.0, 72500.0, 36250.0, 48600.0, 72500.0]
2014: [36900.0, 73800.0, 36900.0, 49400.0, 73800.0]
2015: [37450.0, 74900.0, 37450.0, 50200.0, 74900.0]
2016: [37650.0, 75300.0, 37650.0, 50400.0, 75300.0]
2017: [37950.0, 75900.0, 37950.0, 50800.0, 75900.0]
2018: [38700.0, 77400.0, 38700.0, 51800.0, 77400.0]
2019: [39475.0, 78950.0, 39475.0, 52850.0, 78950.0]
2020: [40098.7, 80197.41, 40098.7, 53685.03, 80197.41]
2021: [40972.85, 81945.71, 40972.85, 54855.36, 81945.71]
2022: [41902.93, 83805.88, 41902.93, 56100.58, 83805.88]
2023: [42870.89, 85741.8, 42870.89, 57396.5, 85741.8]
2024: [43822.62, 87645.27, 43822.62, 58670.7, 87645.27]
2025: [44769.19, 89538.41, 44769.19, 59937.99, 89538.41]
2026: [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]
Valid Range: min = PT_brk1 and max = PT_brk3
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt3
Title: Pass-through income tax rate 3
Description: The third lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 3 and above tax bracket 2.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.22
2019: 0.22
2020: 0.22
2021: 0.22
2022: 0.22
2023: 0.22
2024: 0.22
2025: 0.22
2026: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk3
Title: Pass-through income tax bracket (upper threshold) 3
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 2 is taxed at tax rate 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [87850.0, 146400.0, 73200.0, 125450.0, 146400.0]
2014: [89350.0, 148850.0, 74425.0, 127550.0, 148850.0]
2015: [90750.0, 151200.0, 75600.0, 129600.0, 151200.0]
2016: [91150.0, 151900.0, 75950.0, 130150.0, 151900.0]
2017: [91900.0, 153100.0, 76550.0, 131200.0, 153100.0]
2018: [82500.0, 165000.0, 82500.0, 82500.0, 165000.0]
2019: [84200.0, 168400.0, 84200.0, 84200.0, 168400.0]
2020: [85530.36, 171060.72, 85530.36, 85530.36, 171060.72]
2021: [87394.92, 174789.84, 87394.92, 87394.92, 174789.84]
2022: [89378.78, 178757.57, 89378.78, 89378.78, 178757.57]
2023: [91443.43, 182886.87, 91443.43, 91443.43, 182886.87]
2024: [93473.47, 186946.96, 93473.47, 93473.47, 186946.96]
2025: [95492.5, 190985.01, 95492.5, 95492.5, 190985.01]
2026: [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]
Valid Range: min = PT_brk2 and max = PT_brk4
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt4
Title: Pass-through income tax rate 4
Description: The tax rate applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 4 and above tax bracket 3.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.28
2014: 0.28
2015: 0.28
2016: 0.28
2017: 0.28
2018: 0.24
2019: 0.24
2020: 0.24
2021: 0.24
2022: 0.24
2023: 0.24
2024: 0.24
2025: 0.24
2026: 0.28
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk4
Title: Pass-through income tax bracket (upper threshold) 4
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 3 is taxed at tax rate 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [183250.0, 223050.0, 111525.0, 203150.0, 223050.0]
2014: [186350.0, 226850.0, 113425.0, 206600.0, 226850.0]
2015: [189300.0, 230450.0, 115225.0, 209850.0, 230450.0]
2016: [190150.0, 231450.0, 115725.0, 210800.0, 231450.0]
2017: [191650.0, 233350.0, 116675.0, 212500.0, 233350.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160725.0, 321450.0, 160725.0, 160700.0, 321450.0]
2020: [163264.46, 326528.91, 163264.46, 163239.06, 326528.91]
2021: [166823.63, 333647.24, 166823.63, 166797.67, 333647.24]
2022: [170610.53, 341221.03, 170610.53, 170583.98, 341221.03]
2023: [174551.63, 349103.24, 174551.63, 174524.47, 349103.24]
2024: [178426.68, 356853.33, 178426.68, 178398.91, 356853.33]
2025: [182280.7, 364561.36, 182280.7, 182252.33, 364561.36]
2026: [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]
Valid Range: min = PT_brk3 and max = PT_brk5
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt5
Title: Pass-through income tax rate 5
Description: The third highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 5 and above tax bracket 4.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.33
2014: 0.33
2015: 0.33
2016: 0.33
2017: 0.33
2018: 0.32
2019: 0.32
2020: 0.32
2021: 0.32
2022: 0.32
2023: 0.32
2024: 0.32
2025: 0.32
2026: 0.33
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk5
Title: Pass-through income tax bracket (upper threshold) 5
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 4 is taxed at tax rate 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [398350.0, 398350.0, 199175.0, 398350.0, 398350.0]
2014: [405100.0, 405100.0, 202550.0, 405100.0, 405100.0]
2015: [411500.0, 411500.0, 205750.0, 411500.0, 411500.0]
2016: [413350.0, 413350.0, 206675.0, 413350.0, 413350.0]
2017: [416700.0, 416700.0, 208350.0, 416700.0, 416700.0]
2018: [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]
2019: [204100.0, 408200.0, 204100.0, 204100.0, 408200.0]
2020: [207324.78, 414649.56, 207324.78, 207324.78, 414649.56]
2021: [211844.46, 423688.92, 211844.46, 211844.46, 423688.92]
2022: [216653.33, 433306.66, 216653.33, 216653.33, 433306.66]
2023: [221658.02, 443316.04, 221658.02, 221658.02, 443316.04]
2024: [226578.83, 453157.66, 226578.83, 226578.83, 453157.66]
2025: [231472.93, 462945.87, 231472.93, 231472.93, 462945.87]
2026: [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]
Valid Range: min = PT_brk4 and max = PT_brk6
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt6
Title: Pass-through income tax rate 6
Description: The second higher tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 6 and above tax bracket 5.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.35
2014: 0.35
2015: 0.35
2016: 0.35
2017: 0.35
2018: 0.35
2019: 0.35
2020: 0.35
2021: 0.35
2022: 0.35
2023: 0.35
2024: 0.35
2025: 0.35
2026: 0.35
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk6
Title: Pass-through income tax bracket (upper threshold) 6
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 5 is taxed at tax rate 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [400000.0, 450000.0, 225000.0, 425000.0, 450000.0]
2014: [406750.0, 457600.0, 228800.0, 432200.0, 457600.0]
2015: [413200.0, 464850.0, 232425.0, 439000.0, 464850.0]
2016: [415050.0, 466950.0, 233475.0, 441000.0, 466950.0]
2017: [418400.0, 470700.0, 235350.0, 444550.0, 470700.0]
2018: [500000.0, 600000.0, 300000.0, 500000.0, 600000.0]
2019: [510300.0, 612350.0, 306175.0, 510300.0, 612350.0]
2020: [518362.74, 622025.13, 311012.56, 518362.74, 622025.13]
2021: [529663.05, 635585.28, 317792.63, 529663.05, 635585.28]
2022: [541686.4, 650013.07, 325006.52, 541686.4, 650013.07]
2023: [554199.36, 665028.37, 332514.17, 554199.36, 665028.37]
2024: [566502.59, 679792.0, 339895.98, 566502.59, 679792.0]
2025: [578739.05, 694475.51, 347237.73, 578739.05, 694475.51]
2026: [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]
Valid Range: min = PT_brk5 and max = PT_brk7
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt7
Title: Pass-through income tax rate 7
Description: The highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 7 and above tax bracket 6.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.396
2014: 0.396
2015: 0.396
2016: 0.396
2017: 0.396
2018: 0.37
2019: 0.37
2020: 0.37
2021: 0.37
2022: 0.37
2023: 0.37
2024: 0.37
2025: 0.37
2026: 0.396
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_brk7
Title: Extra pass-through income tax bracket
Description: Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 6 is taxed at tax rate 7. Default value is essentially infinity.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = PT_brk6 and max = 9e+99
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_rt8
Title: Extra pass-through income tax rate
Description: The extra tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations above the tax bracket 7.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_EligibleRate_active
Title: Share of active business income eligible for PT rate schedule
Description: Eligibility rate of active business income for separate pass-through rates.
Notes: Active business income defined as e00900 + e26270
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 1.0
2014: 1.0
2015: 1.0
2016: 1.0
2017: 1.0
2018: 1.0
2019: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_EligibleRate_passive
Title: Share of passive business income eligible for PT rate schedule
Description: Eligibility rate of passive business income for mseparate pass-through rates.
Notes: Passive business income defined as e02000 - e26270
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_wages_active_income
Title: Wages included in (positive) active business income eligible for PT rates
Description: Whether active business income eligibility base for PT schedule for includes wages.
Notes: Only applies if active business income is positive
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_top_stacking
Title: PT taxable income stacked on top of regular taxable income
Description: Whether taxable income eligible for PT rate schedule is stacked on top of regular taxable income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: True
2014: True
2015: True
2016: True
2017: True
2018: True
2019: True
Valid Range: min = False and max = True
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_rt
Title: Pass-through qualified business income deduction rate
Description: Fraction of pass-through business income that may be excluded from taxable income.
Notes: Applies to e00900 + e26270
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.2
2019: 0.2
2020: 0.2
2021: 0.2
2022: 0.2
2023: 0.2
2024: 0.2
2025: 0.2
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_taxinc_thd
Title: Lower threshold of pre-QBID taxable income
Description: Pre-QBID taxable income above this lower threshold implies the QBID amount begins to be limited.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [157500.0, 315000.0, 157500.0, 157500.0, 315000.0]
2019: [160700.0, 321400.0, 160725.0, 160700.0, 321400.0]
2020: [163239.06, 326478.12, 163264.46, 163239.06, 326478.12]
2021: [166797.67, 333595.34, 166823.63, 166797.67, 333595.34]
2022: [170583.98, 341167.95, 170610.53, 170583.98, 341167.95]
2023: [174524.47, 349048.93, 174551.63, 174524.47, 349048.93]
2024: [178398.91, 356797.82, 178426.68, 178398.91, 356797.82]
2025: [182252.33, 364504.65, 182280.7, 182252.33, 364504.65]
2026: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_taxinc_gap
Title: Dollar gap between upper and lower threshold of pre-QBID taxable income
Description: Pre-QBID taxable income above this upper threshold implies the QBID amount is even more limited.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1.0, 1.0, 1.0, 1.0, 1.0]
2014: [1.0, 1.0, 1.0, 1.0, 1.0]
2015: [1.0, 1.0, 1.0, 1.0, 1.0]
2016: [1.0, 1.0, 1.0, 1.0, 1.0]
2017: [1.0, 1.0, 1.0, 1.0, 1.0]
2018: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2019: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2020: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2021: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2022: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2023: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2024: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2025: [50000.0, 100000.0, 50000.0, 50000.0, 100000.0]
2026: [1.0, 1.0, 1.0, 1.0, 1.0]
Valid Range: min = 1 and max = 9e+99
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_w2_wages_rt
Title: QBID cap rate on pass-through business W-2 wages paid
Description: QBID is capped at this fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.5
2019: 0.5
2020: 0.5
2021: 0.5
2022: 0.5
2023: 0.5
2024: 0.5
2025: 0.5
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_alt_w2_wages_rt
Title: Alternative QBID cap rate on pass-through business W-2 wages paid
Description: QBID is capped at this fraction of W-2 wages paid by the pass-through business plus some fraction of business property if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.25
2019: 0.25
2020: 0.25
2021: 0.25
2022: 0.25
2023: 0.25
2024: 0.25
2025: 0.25
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Pass-Through
tc Name: PT_qbid_alt_property_rt
Title: Alternative QBID cap rate on pass-through business property owned
Description: QBID is capped at this fraction of business property owned plus some fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.
Has An Effect When Using:   PUF data: False   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.025
2019: 0.025
2020: 0.025
2021: 0.025
2022: 0.025
2023: 0.025
2024: 0.025
2025: 0.025
2026: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Personal Income — Alternative Minimum Tax
tc Name: AMT_em
TB Name: AMT exemption amount
Description: The amount of AMT taxable income exempted from AMT.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [51900.0, 80800.0, 40400.0, 51900.0, 80800.0]
2014: [52800.0, 82100.0, 41050.0, 52800.0, 82100.0]
2015: [53600.0, 83400.0, 41700.0, 53600.0, 83400.0]
2016: [53900.0, 83800.0, 41900.0, 53900.0, 83800.0]
2017: [54300.0, 84500.0, 42250.0, 54300.0, 84500.0]
2018: [70300.0, 109400.0, 54700.0, 70300.0, 109400.0]
2019: [71700.0, 111700.0, 55850.0, 71700.0, 111700.0]
2020: [72832.86, 113464.86, 56732.43, 72832.86, 113464.86]
2021: [74420.62, 115938.39, 57969.2, 74420.62, 115938.39]
2022: [76109.96, 118570.2, 59285.1, 76109.96, 118570.2]
2023: [77868.1, 121309.17, 60654.58, 77868.1, 121309.17]
2024: [79596.78, 124002.23, 62001.12, 79596.78, 124002.23]
2025: [81316.07, 126680.68, 63340.34, 81316.07, 126680.68]
2026: [65429.0, 101818.0, 50909.0, 65429.0, 101818.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Alternative Minimum Tax
tc Name: AMT_prt
TB Name: AMT exemption phaseout rate
Description: AMT exemption will decrease at this rate for each dollar of AMT taxable income exceeding AMT phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.25
2019: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Alternative Minimum Tax
tc Name: AMT_em_ps
TB Name: AMT exemption phaseout start
Description: AMT exemption starts to decrease when AMT taxable income goes beyond this threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [115400.0, 153900.0, 76950.0, 115400.0, 153900.0]
2014: [117300.0, 156500.0, 78250.0, 117300.0, 156500.0]
2015: [119200.0, 158900.0, 79450.0, 119200.0, 158900.0]
2016: [119700.0, 159700.0, 79850.0, 119700.0, 159700.0]
2017: [120700.0, 160900.0, 80450.0, 120700.0, 160900.0]
2018: [500000.0, 1000000.0, 500000.0, 500000.0, 1000000.0]
2019: [510300.0, 1020600.0, 510300.0, 510300.0, 1020600.0]
2020: [518362.74, 1036725.48, 518362.74, 518362.74, 1036725.48]
2021: [529663.05, 1059326.1, 529663.05, 529663.05, 1059326.1]
2022: [541686.4, 1083372.8, 541686.4, 541686.4, 1083372.8]
2023: [554199.35, 1108398.71, 554199.35, 554199.35, 1108398.71]
2024: [566502.58, 1133005.16, 566502.58, 566502.58, 1133005.16]
2025: [578739.04, 1157478.07, 578739.04, 578739.04, 1157478.07]
2026: [145437.0, 193876.0, 96938.0, 145437.0, 193876.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Alternative Minimum Tax
tc Name: AMT_rt1
TB Name: AMT rate 1
Description: The tax rate applied to the portion of AMT taxable income below the surtax threshold, AMT bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.26
2014: 0.26
2015: 0.26
2016: 0.26
2017: 0.26
2018: 0.26
2019: 0.26
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Personal Income — Alternative Minimum Tax
tc Name: AMT_brk1
TB Name: AMT bracket 1 (upper threshold)
Description: AMT taxable income below this is subject to AMT rate 1 and above it is subject to AMT rate 1 + the additional AMT rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 179500.0
2014: 182500.0
2015: 185400.0
2016: 186300.0
2017: 187800.0
2018: 191100.0
2019: 194800.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Personal Income — Alternative Minimum Tax
tc Name: AMT_rt2
TB Name: Additional AMT rate for AMT taxable income above AMT bracket 1
Description: The additional tax rate applied to the portion of AMT income above the AMT bracket 1.
Notes: This is the additional tax rate (on top of AMT rate 1) for AMT income above AMT bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Personal Income — Alternative Minimum Tax
tc Name: AMT_em
Title: AMT exemption amount
Description: The amount of AMT taxable income exempted from AMT.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [51900.0, 80800.0, 40400.0, 51900.0, 80800.0]
2014: [52800.0, 82100.0, 41050.0, 52800.0, 82100.0]
2015: [53600.0, 83400.0, 41700.0, 53600.0, 83400.0]
2016: [53900.0, 83800.0, 41900.0, 53900.0, 83800.0]
2017: [54300.0, 84500.0, 42250.0, 54300.0, 84500.0]
2018: [70300.0, 109400.0, 54700.0, 70300.0, 109400.0]
2019: [71700.0, 111700.0, 55850.0, 71700.0, 111700.0]
2020: [72832.86, 113464.86, 56732.43, 72832.86, 113464.86]
2021: [74420.62, 115938.39, 57969.2, 74420.62, 115938.39]
2022: [76109.97, 118570.19, 59285.1, 76109.97, 118570.19]
2023: [77868.11, 121309.16, 60654.59, 77868.11, 121309.16]
2024: [79596.78, 124002.22, 62001.12, 79596.78, 124002.22]
2025: [81316.07, 126680.67, 63340.34, 81316.07, 126680.67]
2026: [65429.0, 101818.0, 50909.0, 65429.0, 101818.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Personal Income — Alternative Minimum Tax
tc Name: AMT_prt
Title: AMT exemption phaseout rate
Description: AMT exemption will decrease at this rate for each dollar of AMT taxable income exceeding AMT phaseout start.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.25
2014: 0.25
2015: 0.25
2016: 0.25
2017: 0.25
2018: 0.25
2019: 0.25
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Alternative Minimum Tax
tc Name: AMT_em_ps
Title: AMT exemption phaseout start
Description: AMT exemption starts to decrease when AMT taxable income goes beyond this threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [115400.0, 153900.0, 76950.0, 115400.0, 153900.0]
2014: [117300.0, 156500.0, 78250.0, 117300.0, 156500.0]
2015: [119200.0, 158900.0, 79450.0, 119200.0, 158900.0]
2016: [119700.0, 159700.0, 79850.0, 119700.0, 159700.0]
2017: [120700.0, 160900.0, 80450.0, 120700.0, 160900.0]
2018: [500000.0, 1000000.0, 500000.0, 500000.0, 1000000.0]
2019: [510300.0, 1020600.0, 510300.0, 510300.0, 1020600.0]
2020: [518362.74, 1036725.48, 518362.74, 518362.74, 1036725.48]
2021: [529663.05, 1059326.1, 529663.05, 529663.05, 1059326.1]
2022: [541686.4, 1083372.8, 541686.4, 541686.4, 1083372.8]
2023: [554199.36, 1108398.71, 554199.36, 554199.36, 1108398.71]
2024: [566502.59, 1133005.16, 566502.59, 566502.59, 1133005.16]
2025: [578739.05, 1157478.07, 578739.05, 578739.05, 1157478.07]
2026: [145437.0, 193876.0, 96938.0, 145437.0, 193876.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Personal Income — Alternative Minimum Tax
tc Name: AMT_rt1
Title: AMT rate 1
Description: The tax rate applied to the portion of AMT taxable income below the surtax threshold, AMT bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.26
2014: 0.26
2015: 0.26
2016: 0.26
2017: 0.26
2018: 0.26
2019: 0.26
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Personal Income — Alternative Minimum Tax
tc Name: AMT_brk1
Title: AMT bracket 1 (upper threshold)
Description: AMT taxable income below this is subject to AMT rate 1 and above it is subject to AMT rate 1 + the additional AMT rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 179500.0
2014: 182500.0
2015: 185400.0
2016: 186300.0
2017: 187800.0
2018: 191100.0
2019: 194800.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Personal Income — Alternative Minimum Tax
tc Name: AMT_rt2
Title: Additional AMT rate for AMT taxable income above AMT bracket 1
Description: The additional tax rate applied to the portion of AMT income above the AMT bracket 1.
Notes: This is the additional tax rate (on top of AMT rate 1) for AMT income above AMT bracket 1.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.02
2014: 0.02
2015: 0.02
2016: 0.02
2017: 0.02
2018: 0.02
2019: 0.02
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3l. Other Taxes

-

Other Taxes — Net Investment Income Tax
tc Name: NIIT_thd
TB Name: Net Investment Income Tax modified AGI threshold
Description: If modified AGI is more than this threshold, filing unit is subject to the Net Investment Income Tax.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2014: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2015: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2016: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2017: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2018: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2019: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Taxes — Net Investment Income Tax
tc Name: NIIT_PT_taxed
TB Name: Whether or not partnership and S-corp income is in NIIT base
Description: false ==> partnership and S-corp income excluded from NIIT base; true ==> partnership and S-corp income is in NIIT base.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Other Taxes — Net Investment Income Tax
tc Name: NIIT_rt
TB Name: Net Investment Income Tax rate
Description: If modified AGI exceeds NIIT_thd, all net investment income is taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.038
2014: 0.038
2015: 0.038
2016: 0.038
2017: 0.038
2018: 0.038
2019: 0.038
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Other Taxes — Net Investment Income Tax
tc Name: NIIT_thd
Title: Net Investment Income Tax modified AGI threshold
Description: If modified AGI is more than this threshold, filing unit is subject to the Net Investment Income Tax.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2014: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2015: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2016: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2017: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2018: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
2019: [200000.0, 250000.0, 125000.0, 200000.0, 250000.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Taxes — Net Investment Income Tax
tc Name: NIIT_PT_taxed
Title: Whether or not partnership and S-corp income is in NIIT base
Description: false ==> partnership and S-corp income excluded from NIIT base; true ==> partnership and S-corp income is in NIIT base.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Other Taxes — Net Investment Income Tax
tc Name: NIIT_rt
Title: Net Investment Income Tax rate
Description: If modified AGI exceeds NIIT_thd, all net investment income is taxed at this rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.038
2014: 0.038
2015: 0.038
2016: 0.038
2017: 0.038
2018: 0.038
2019: 0.038
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3m. Refundable Credits

-

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_c
TB Name: Maximum earned income credit
Description: This is the maximum amount of earned income credit taxpayers are eligible for; it depends on how many kids they have.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [487.0, 3250.0, 5372.0, 6044.0]
2014: [496.0, 3305.0, 5460.0, 6143.0]
2015: [503.0, 3359.0, 5548.0, 6242.0]
2016: [506.0, 3373.0, 5572.0, 6269.0]
2017: [510.0, 3400.0, 5616.0, 6318.0]
2018: [519.0, 3461.0, 5716.0, 6431.0]
2019: [529.0, 3526.0, 5828.0, 6557.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_rt
TB Name: Earned income credit phasein rate
Description: Pre-phaseout credit is minimum of this rate times earnings and the maximum earned income credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [0.0765, 0.34, 0.4, 0.45]
2014: [0.0765, 0.34, 0.4, 0.45]
2015: [0.0765, 0.34, 0.4, 0.45]
2016: [0.0765, 0.34, 0.4, 0.45]
2017: [0.0765, 0.34, 0.4, 0.45]
2018: [0.0765, 0.34, 0.4, 0.45]
2019: [0.0765, 0.34, 0.4, 0.45]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_basic_frac
TB Name: Fraction of maximum earned income credit paid at zero earnings
Description: This fraction of EITC_c is always paid as a credit and one minus this fraction is applied to the phasein rate, EITC_rt. This fraction is zero under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0.0 and max = 1.0
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_prt
TB Name: Earned income credit phaseout rate
Description: Earned income credit begins to decrease at the this rate when AGI is higher than earned income credit phaseout start AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [0.0765, 0.1598, 0.2106, 0.2106]
2014: [0.0765, 0.1598, 0.2106, 0.2106]
2015: [0.0765, 0.1598, 0.2106, 0.2106]
2016: [0.0765, 0.1598, 0.2106, 0.2106]
2017: [0.0765, 0.1598, 0.2106, 0.2106]
2018: [0.0765, 0.1598, 0.2106, 0.2106]
2019: [0.0765, 0.1598, 0.2106, 0.2106]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_ps
TB Name: Earned income credit phaseout start AGI
Description: If AGI is higher than this threshold, the amount of EITC will start to decrease at the phaseout rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [7970.0, 17530.0, 17530.0, 17530.0]
2014: [8110.0, 17830.0, 17830.0, 17830.0]
2015: [8250.0, 18150.0, 18150.0, 18150.0]
2016: [8270.0, 18190.0, 18190.0, 18190.0]
2017: [8340.0, 18340.0, 18340.0, 18340.0]
2018: [8490.0, 18660.0, 18660.0, 18660.0]
2019: [8650.0, 19030.0, 19030.0, 19030.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_ps_MarriedJ
TB Name: Extra earned income credit phaseout start AGI for married filling jointly
Description: This is the additional amount added on the regular phaseout start amount for taxpayers with filling status of married filing jointly.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [5340.0, 5340.0, 5340.0, 5340.0]
2014: [5430.0, 5430.0, 5430.0, 5430.0]
2015: [5500.0, 5500.0, 5500.0, 5500.0]
2016: [5550.0, 5550.0, 5550.0, 5550.0]
2017: [5590.0, 5590.0, 5590.0, 5590.0]
2018: [5680.0, 5690.0, 5690.0, 5690.0]
2019: [5800.0, 5790.0, 5790.0, 5790.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_MinEligAge
TB Name: Minimum Age for Childless EITC Eligibility
Description: For a childless filing unit, at least one individual's age needs to be no less than this age (but no greater than the EITC_MaxEligAge) in order to be eligible for an earned income tax credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: integer
Known Values:
2013: 25
2014: 25
2015: 25
2016: 25
2017: 25
2018: 25
2019: 25
Valid Range: min = 0 and max = 125
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_MaxEligAge
TB Name: Maximum Age for Childless EITC Eligibility
Description: For a childless filing unit, at least one individual's age needs to be no greater than this age (but no less than the EITC_MinEligAge) in order to be eligible for an earned income tax credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: integer
Known Values:
2013: 64
2014: 64
2015: 64
2016: 64
2017: 64
2018: 64
2019: 64
Valid Range: min = 0 and max = 125
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_InvestIncome_c
TB Name: Maximum investment income before EITC reduction
Description: The EITC amount is reduced when investment income exceeds this ceiling.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 3300.0
2014: 3350.0
2015: 3400.0
2016: 3400.0
2017: 3450.0
2018: 3500.0
2019: 3600.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_excess_InvestIncome_rt
TB Name: Rate of EITC reduction when investment income exceeds ceiling
Description: The EITC amount is reduced at this rate per dollar of investment income exceeding the ceiling.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_indiv
TB Name: EITC is computed for each spouse based on individual earnings
Description: Current-law value is false implying EITC is filing-unit based; a value of true implies EITC is computed for each individual wage earner. The additional phaseout start for joint filers is not affected by this parameter, nor are investment income and age eligibilty rules.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_sep_filers_elig
TB Name: Separate filers are eligibile for the EITC
Description: Current-law value is false, implying ineligibility.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_c
Title: Maximum earned income credit
Description: This is the maximum amount of earned income credit taxpayers are eligible for; it depends on how many kids they have.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [487.0, 3250.0, 5372.0, 6044.0]
2014: [496.0, 3305.0, 5460.0, 6143.0]
2015: [503.0, 3359.0, 5548.0, 6242.0]
2016: [506.0, 3373.0, 5572.0, 6269.0]
2017: [510.0, 3400.0, 5616.0, 6318.0]
2018: [519.0, 3461.0, 5716.0, 6431.0]
2019: [529.0, 3526.0, 5828.0, 6557.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_rt
Title: Earned income credit phasein rate
Description: Pre-phaseout credit is minimum of this rate times earnings and the maximum earned income credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [0.0765, 0.34, 0.4, 0.45]
2014: [0.0765, 0.34, 0.4, 0.45]
2015: [0.0765, 0.34, 0.4, 0.45]
2016: [0.0765, 0.34, 0.4, 0.45]
2017: [0.0765, 0.34, 0.4, 0.45]
2018: [0.0765, 0.34, 0.4, 0.45]
2019: [0.0765, 0.34, 0.4, 0.45]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_basic_frac
Title: Fraction of maximum earned income credit paid at zero earnings
Description: This fraction of EITC_c is always paid as a credit and one minus this fraction is applied to the phasein rate, EITC_rt. This fraction is zero under current law.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0.0 and max = 1.0
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_prt
Title: Earned income credit phaseout rate
Description: Earned income credit begins to decrease at the this rate when AGI is higher than earned income credit phaseout start AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [0.0765, 0.1598, 0.2106, 0.2106]
2014: [0.0765, 0.1598, 0.2106, 0.2106]
2015: [0.0765, 0.1598, 0.2106, 0.2106]
2016: [0.0765, 0.1598, 0.2106, 0.2106]
2017: [0.0765, 0.1598, 0.2106, 0.2106]
2018: [0.0765, 0.1598, 0.2106, 0.2106]
2019: [0.0765, 0.1598, 0.2106, 0.2106]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_ps
Title: Earned income credit phaseout start AGI
Description: If AGI is higher than this threshold, the amount of EITC will start to decrease at the phaseout rate.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [7970.0, 17530.0, 17530.0, 17530.0]
2014: [8110.0, 17830.0, 17830.0, 17830.0]
2015: [8250.0, 18150.0, 18150.0, 18150.0]
2016: [8270.0, 18190.0, 18190.0, 18190.0]
2017: [8340.0, 18340.0, 18340.0, 18340.0]
2018: [8490.0, 18660.0, 18660.0, 18660.0]
2019: [8650.0, 19030.0, 19030.0, 19030.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_ps_MarriedJ
Title: Extra earned income credit phaseout start AGI for married filling jointly
Description: This is the additional amount added on the regular phaseout start amount for taxpayers with filling status of married filing jointly.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [0kids, 1kid, 2kids, 3+kids]
2013: [5340.0, 5340.0, 5340.0, 5340.0]
2014: [5430.0, 5430.0, 5430.0, 5430.0]
2015: [5500.0, 5500.0, 5500.0, 5500.0]
2016: [5550.0, 5550.0, 5550.0, 5550.0]
2017: [5590.0, 5590.0, 5590.0, 5590.0]
2018: [5680.0, 5690.0, 5690.0, 5690.0]
2019: [5800.0, 5790.0, 5790.0, 5790.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_MinEligAge
Title: Minimum Age for Childless EITC Eligibility
Description: For a childless filing unit, at least one individual's age needs to be no less than this age (but no greater than the EITC_MaxEligAge) in order to be eligible for an earned income tax credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: int
Known Values:
2013: 25
2014: 25
2015: 25
2016: 25
2017: 25
2018: 25
2019: 25
Valid Range: min = 0 and max = 125
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_MaxEligAge
Title: Maximum Age for Childless EITC Eligibility
Description: For a childless filing unit, at least one individual's age needs to be no greater than this age (but no less than the EITC_MinEligAge) in order to be eligible for an earned income tax credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: int
Known Values:
2013: 64
2014: 64
2015: 64
2016: 64
2017: 64
2018: 64
2019: 64
Valid Range: min = 0 and max = 125
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_InvestIncome_c
Title: Maximum investment income before EITC reduction
Description: The EITC amount is reduced when investment income exceeds this ceiling.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 3300.0
2014: 3350.0
2015: 3400.0
2016: 3400.0
2017: 3450.0
2018: 3500.0
2019: 3600.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_excess_InvestIncome_rt
Title: Rate of EITC reduction when investment income exceeds ceiling
Description: The EITC amount is reduced at this rate per dollar of investment income exceeding the ceiling.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 9e+99
2014: 9e+99
2015: 9e+99
2016: 9e+99
2017: 9e+99
2018: 9e+99
2019: 9e+99
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_indiv
Title: EITC is computed for each spouse based on individual earnings
Description: Current-law value is false implying EITC is filing-unit based; a value of true implies EITC is computed for each individual wage earner. The additional phaseout start for joint filers is not affected by this parameter, nor are investment income and age eligibilty rules.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Refundable Credits — Earned Income Tax Credit
tc Name: EITC_sep_filers_elig
Title: Separate filers are eligibile for the EITC
Description: Current-law value is false, implying ineligibility.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

-

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_c
TB Name: New refundable child tax credit maximum amount per child
Description: In addition to all credits currently available for dependents, this parameter gives each qualifying child a new refundable credit with this maximum amount.
Notes: Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_c_under5_bonus
TB Name: Bonus new refundable child tax credit maximum for qualifying children under five
Description: The maximum amount of the new refundable child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_for_all
TB Name: Whether or not maximum amount of the new refundable child tax credit is available to all
Description: The maximum amount of the new refundable child tax credit does not depend on AGI when true; otherwise, see CTC_new_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_rt
TB Name: New refundable child tax credit amount phasein rate
Description: The maximum amount of the new child tax credit is increased at this rate per dollar of positive AGI until CTC_new_c times the number of qualified children is reached if CTC_new_for_all is false; if CTC_new_for_all is true, there is no AGI limitation to the maximum amount.
Notes: Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_ps
TB Name: New refundable child tax credit phaseout starting AGI
Description: The total amount of new child tax credit is reduced for taxpayers with AGI higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_prt
TB Name: New refundable child tax credit amount phaseout rate
Description: The total amount of the new child tax credit is reduced at this rate per dollar exceeding the phaseout starting AGI, CTC_new_ps.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limited
TB Name: New child tax credit refund limited to a decimal fraction of payroll taxes
Description: Specifies whether the new child tax credit refund is limited by the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt).
Notes: Set this parameter to true to limit the refundability or false to allow full refundability for all taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limit_payroll_rt
TB Name: New child tax credit refund limit rate (decimal fraction of payroll taxes)
Description: The fraction of payroll taxes (employee plus employer shares, but excluding all Medicare payroll taxes) that serves as a limit to the amount of new child tax credit that can be refunded.
Notes: Set this parameter to zero for no refundability; set it to 9e99 for unlimited refundability for taxpayers with payroll tax liabilities.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limited_all_payroll
TB Name: New child tax credit refund limit applies to all FICA taxes, not just OASDI
Description: Specifies whether the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt) applies to all FICA taxes (true) or just OASDI taxes (false).
Notes: If the new CTC is limited, set this parameter to true to limit the refundability to all FICA taxes or false to limit refundabiity to OASDI taxes.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_c
Title: New refundable child tax credit maximum amount per child
Description: In addition to all credits currently available for dependents, this parameter gives each qualifying child a new refundable credit with this maximum amount.
Notes: Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_c_under5_bonus
Title: Bonus new refundable child tax credit maximum for qualifying children under five
Description: The maximum amount of the new refundable child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_for_all
Title: Whether or not maximum amount of the new refundable child tax credit is available to all
Description: The maximum amount of the new refundable child tax credit does not depend on AGI when true; otherwise, see CTC_new_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_rt
Title: New refundable child tax credit amount phasein rate
Description: The maximum amount of the new child tax credit is increased at this rate per dollar of positive AGI until CTC_new_c times the number of qualified children is reached if CTC_new_for_all is false; if CTC_new_for_all is true, there is no AGI limitation to the maximum amount.
Notes: Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_ps
Title: New refundable child tax credit phaseout starting AGI
Description: The total amount of new child tax credit is reduced for taxpayers with AGI higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_prt
Title: New refundable child tax credit amount phaseout rate
Description: The total amount of the new child tax credit is reduced at this rate per dollar exceeding the phaseout starting AGI, CTC_new_ps.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limited
Title: New child tax credit refund limited to a decimal fraction of payroll taxes
Description: Specifies whether the new child tax credit refund is limited by the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt).
Notes: Set this parameter to true to limit the refundability or false to allow full refundability for all taxpayers.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limit_payroll_rt
Title: New child tax credit refund limit rate (decimal fraction of payroll taxes)
Description: The fraction of payroll taxes (employee plus employer shares, but excluding all Medicare payroll taxes) that serves as a limit to the amount of new child tax credit that can be refunded.
Notes: Set this parameter to zero for no refundability; set it to 9e99 for unlimited refundability for taxpayers with payroll tax liabilities.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — New Refundable Child Tax Credit
tc Name: CTC_new_refund_limited_all_payroll
Title: New child tax credit refund limit applies to all FICA taxes, not just OASDI
Description: Specifies whether the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt) applies to all FICA taxes (true) or just OASDI taxes (false).
Notes: If the new CTC is limited, set this parameter to true to limit the refundability to all FICA taxes or false to limit refundabiity to OASDI taxes.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

-

Refundable Credits — Personal Refundable Credit
tc Name: II_credit
TB Name: Personal refundable credit maximum amount
Description: This credit amount is fully refundable and is phased out based on AGI. It is available to tax units who would otherwise not file.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Personal Refundable Credit
tc Name: II_credit_ps
TB Name: Personal refundable credit phaseout start
Description: The personal refundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Personal Refundable Credit
tc Name: II_credit_prt
TB Name: Personal refundable credit phaseout rate
Description: The personal refundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_ps threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Refundable Credits — Personal Refundable Credit
tc Name: II_credit
Title: Personal refundable credit maximum amount
Description: This credit amount is fully refundable and is phased out based on AGI. It is available to tax units who would otherwise not file.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Personal Refundable Credit
tc Name: II_credit_ps
Title: Personal refundable credit phaseout start
Description: The personal refundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Personal Refundable Credit
tc Name: II_credit_prt
Title: Personal refundable credit phaseout rate
Description: The personal refundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_ps threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

-

Refundable Credits — Refundable Payroll Tax Credit
tc Name: RPTC_c
TB Name: Maximum refundable payroll tax credit
Description: This is the maximum amount of the refundable payroll tax credit for each taxpayer/spouse.
Notes: Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Refundable Credits — Refundable Payroll Tax Credit
tc Name: RPTC_rt
TB Name: Refundable payroll tax credit phasein rate
Description: Pre-phaseout credit is minimum of this rate times earnings and the maximum refundable payroll tax credit, where earnings is defined as in FICA and SECA.
Notes: Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Refundable Credits — Refundable Payroll Tax Credit
tc Name: RPTC_c
Title: Maximum refundable payroll tax credit
Description: This is the maximum amount of the refundable payroll tax credit for each taxpayer/spouse.
Notes: Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Refundable Credits — Refundable Payroll Tax Credit
tc Name: RPTC_rt
Title: Refundable payroll tax credit phasein rate
Description: Pre-phaseout credit is minimum of this rate times earnings and the maximum refundable payroll tax credit, where earnings is defined as in FICA and SECA.
Notes: Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

3n. Surtaxes

-

Surtaxes — New Minimum Tax
tc Name: FST_AGI_trt
TB Name: New minimum tax; rate as a decimal fraction of AGI
Description: Individual income taxes and the employee share of payroll taxes are credited against this minimum tax, so the surtax is the difference between the tax rate times AGI and the credited taxes. The new minimum tax is similar to the Fair Share Tax, except that no credits are exempted from the base.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Surtaxes — New Minimum Tax
tc Name: FST_AGI_thd_lo
TB Name: Minimum AGI needed to be subject to the new minimum tax
Description: A taxpayer is only subject to the new minimum tax if they exceed this level of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2014: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2015: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2016: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2017: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2018: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2019: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
Valid Range: min = 0 and max = FST_AGI_thd_hi
Out-of-Range Action: stop

Surtaxes — New Minimum Tax
tc Name: FST_AGI_thd_hi
TB Name: AGI level at which the New Minimum Tax is fully phased in
Description: The new minimum tax will be fully phased in at this level of AGI. If there is no phase-in, this upper threshold should be set equal to the lower AGI threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2014: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2015: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2016: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2017: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2018: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2019: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
Valid Range: min = FST_AGI_thd_lo and max = 9e+99
Out-of-Range Action: stop

+

Surtaxes — New Minimum Tax
tc Name: FST_AGI_trt
Title: New minimum tax; rate as a decimal fraction of AGI
Description: Individual income taxes and the employee share of payroll taxes are credited against this minimum tax, so the surtax is the difference between the tax rate times AGI and the credited taxes. The new minimum tax is similar to the Fair Share Tax, except that no credits are exempted from the base.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Surtaxes — New Minimum Tax
tc Name: FST_AGI_thd_lo
Title: Minimum AGI needed to be subject to the new minimum tax
Description: A taxpayer is only subject to the new minimum tax if they exceed this level of AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2014: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2015: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2016: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2017: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2018: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
2019: [1000000.0, 1000000.0, 500000.0, 1000000.0, 1000000.0]
Valid Range: min = 0 and max = FST_AGI_thd_hi
Out-of-Range Action: error

Surtaxes — New Minimum Tax
tc Name: FST_AGI_thd_hi
Title: AGI level at which the New Minimum Tax is fully phased in
Description: The new minimum tax will be fully phased in at this level of AGI. If there is no phase-in, this upper threshold should be set equal to the lower AGI threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2014: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2015: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2016: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2017: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2018: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
2019: [2000000.0, 2000000.0, 1000000.0, 2000000.0, 2000000.0]
Valid Range: min = FST_AGI_thd_lo and max = 9e+99
Out-of-Range Action: error

-

Surtaxes — New AGI Surtax
tc Name: AGI_surtax_trt
TB Name: New AGI surtax rate
Description: The surtax rate is applied to the portion of Adjusted Gross Income above the AGI surtax threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Surtaxes — New AGI Surtax
tc Name: AGI_surtax_thd
TB Name: Threshold for the new AGI surtax
Description: The aggregate gross income above this AGI surtax threshold is taxed at surtax rate on AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Surtaxes — New AGI Surtax
tc Name: AGI_surtax_trt
Title: New AGI surtax rate
Description: The surtax rate is applied to the portion of Adjusted Gross Income above the AGI surtax threshold.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Surtaxes — New AGI Surtax
tc Name: AGI_surtax_thd
Title: Threshold for the new AGI surtax
Description: The aggregate gross income above this AGI surtax threshold is taxed at surtax rate on AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2014: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2015: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2016: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2017: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Surtaxes — Lump-Sum Tax
tc Name: LST
TB Name: Dollar amount of lump-sum tax
Description: The lump-sum tax is levied on every member of a tax filing unit. The lump-sum tax is included only in combined taxes; it is not included in income or payroll taxes.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = -9e+99 and max = 9e+99
Out-of-Range Action: stop

+

Surtaxes — Lump-Sum Tax
tc Name: LST
Title: Dollar amount of lump-sum tax
Description: The lump-sum tax is levied on every member of a tax filing unit. The lump-sum tax is included only in combined taxes; it is not included in income or payroll taxes.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = -9e+99 and max = 9e+99
Out-of-Range Action: error

3o. Universal Basic Income

-

Universal Basic Income — UBI Benefits
tc Name: UBI_u18
TB Name: UBI benefit for those under 18
Description: UBI benefit provided to people under 18.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Universal Basic Income — UBI Benefits
tc Name: UBI_1820
TB Name: UBI benefit for those 18 through 20
Description: UBI benefit provided to people 18-20 years of age.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Universal Basic Income — UBI Benefits
tc Name: UBI_21
TB Name: UBI benefit for those 21 and over
Description: UBI benefit provided to people 21 and over.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

+

Universal Basic Income — UBI Benefits
tc Name: UBI_u18
Title: UBI benefit for those under 18
Description: UBI benefit provided to people under 18.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Universal Basic Income — UBI Benefits
tc Name: UBI_1820
Title: UBI benefit for those 18 through 20
Description: UBI benefit provided to people 18-20 years of age.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Universal Basic Income — UBI Benefits
tc Name: UBI_21
Title: UBI benefit for those 21 and over
Description: UBI benefit provided to people 21 and over.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

-

Universal Basic Income — UBI Taxability
tc Name: UBI_ecrt
TB Name: Fraction of UBI benefits excluded from AGI
Description: One minus this fraction of UBI benefits are taxable and will be added to AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Universal Basic Income — UBI Taxability
tc Name: UBI_ecrt
Title: Fraction of UBI benefits excluded from AGI
Description: One minus this fraction of UBI benefits are taxable and will be added to AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

3p. Benefits

-

Benefits — Benefit Repeal
tc Name: BEN_ssi_repeal
TB Name: SSI benefit repeal switch
Description: SSI benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_housing_repeal
TB Name: Housing benefit repeal switch
Description: Housing benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_snap_repeal
TB Name: SNAP benefit repeal switch
Description: SNAP benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_tanf_repeal
TB Name: TANF benefit repeal switch
Description: TANF benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_vet_repeal
TB Name: Veterans benefit repeal switch
Description: Veterans benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_wic_repeal
TB Name: WIC benefit repeal switch
Description: WIC benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_mcare_repeal
TB Name: Medicare benefit repeal switch
Description: Medicare benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_mcaid_repeal
TB Name: Medicaid benefit repeal switch
Description: Medicaid benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_oasdi_repeal
TB Name: Social Security benefit repeal switch
Description: Social Security benefits (e02400) can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_ui_repeal
TB Name: Unemployment insurance benefit repeal switch
Description: Unemployment insurance benefits (e02300) can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Benefits — Benefit Repeal
tc Name: BEN_other_repeal
TB Name: Other benefit repeal switch
Description: Other benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

+

Benefits — Benefit Repeal
tc Name: BEN_ssi_repeal
Title: SSI benefit repeal switch
Description: SSI benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_housing_repeal
Title: Housing benefit repeal switch
Description: Housing benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_snap_repeal
Title: SNAP benefit repeal switch
Description: SNAP benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_tanf_repeal
Title: TANF benefit repeal switch
Description: TANF benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_vet_repeal
Title: Veterans benefit repeal switch
Description: Veterans benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_wic_repeal
Title: WIC benefit repeal switch
Description: WIC benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_mcare_repeal
Title: Medicare benefit repeal switch
Description: Medicare benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_mcaid_repeal
Title: Medicaid benefit repeal switch
Description: Medicaid benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_oasdi_repeal
Title: Social Security benefit repeal switch
Description: Social Security benefits (e02400) can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_ui_repeal
Title: Unemployment insurance benefit repeal switch
Description: Unemployment insurance benefits (e02300) can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Benefits — Benefit Repeal
tc Name: BEN_other_repeal
Title: Other benefit repeal switch
Description: Other benefits can be repealed by switching this parameter to true.
Has An Effect When Using:   PUF data: False   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

3q. Other Parameters

-

Other Parameters — Not in Tax-Brain webapp
tc Name: SS_percentage1
Long Name: Social Security taxable income decimal fraction 1
Description: Under current law if their provisional income is above the first threshold for Social Security taxability but below the second threshold, taxpayers need to apply this fraction to both the excess of their provisional income over the first threshold and their Social Security benefits, and then include the smaller one in their AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.5
2014: 0.5
2015: 0.5
2016: 0.5
2017: 0.5
2018: 0.5
2019: 0.5
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: SS_percentage2
Long Name: Social Security taxable income decimal fraction 2
Description: Under current law if their provisional income is above the second threshold for Social Security taxability, taxpayers need to apply this fraction to both the excess of their provisional income over the second threshold and their social security benefits, and then include the smaller one in their AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.85
2014: 0.85
2015: 0.85
2016: 0.85
2017: 0.85
2018: 0.85
2019: 0.85
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: II_em_ps
Long Name: Personal exemption phaseout starting income
Description: If taxpayers' AGI is above this level, their personal exemption will start to decrease at the personal exemption phaseout rate (PEP provision).
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [250000.0, 300000.0, 150000.0, 275000.0, 300000.0]
2014: [254200.0, 305050.0, 152525.0, 279650.0, 305050.0]
2015: [258250.0, 309900.0, 154950.0, 284040.0, 309900.0]
2016: [259400.0, 311300.0, 155650.0, 285350.0, 311300.0]
2017: [261500.0, 313800.0, 156900.0, 287650.0, 313800.0]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2020: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2021: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2022: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2023: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2024: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2025: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2026: [316457.0, 379748.0, 189874.0, 348102.0, 379748.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: STD_Dep
Long Name: Standard deduction for dependents
Description: This is the maximum standard deduction for dependents.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1050.0
2016: 1050.0
2017: 1050.0
2018: 1050.0
2019: 1100.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: STD_allow_charity_ded_nonitemizers
Long Name: Allow standard deduction filers to take the charitable contributions deduction
Description: Extends the charitable contributions deduction to taxpayers who take the standard deduction. The same ceilings, floor, and haircuts applied to itemized deduction for charitable contributions also apply here.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: boolean
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_child_em
Long Name: Child AMT exemption additional income base
Description: The child's AMT exemption is capped by this amount plus the child's earned income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 7150.0
2014: 7250.0
2015: 7400.0
2016: 7400.0
2017: 7500.0
2018: 7600.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_child_em_c_age
Long Name: Age ceiling for special AMT exemption
Description: Individuals under this age must use the child AMT exemption rules.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: integer
Known Values:
2013: 18
2014: 18
2015: 18
2016: 18
2017: 18
2018: 18
2019: 18
Valid Range: min = 0 and max = 30
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_em_pe
Long Name: AMT exemption phaseout ending AMT taxable income for Married filing Separately
Description: The AMT exemption is entirely disallowed beyond this AMT taxable income level for individuals who are married but filing separately.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 238550.0
2014: 242450.0
2015: 246250.0
2016: 247450.0
2017: 249450.0
2018: 718800.0
2019: 733700.0
2020: 745292.46
2021: 761539.84
2022: 778826.79
2023: 796817.69
2024: 814507.04
2025: 832100.39
2026: 300574.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: LLC_Expense_c
Long Name: Lifetime learning credit expense limit
Description: The maximum expense eligible for lifetime learning credit, per child.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 10000.0
2014: 10000.0
2015: 10000.0
2016: 10000.0
2017: 10000.0
2018: 10000.0
2019: 10000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: ETC_pe_Single
Long Name: Education tax credit phaseout ends (Single)
Description: The education tax credit will be zero for those taxpayers of single filing status with modified AGI (in thousands) higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 63.0
2014: 64.0
2015: 65.0
2016: 65.0
2017: 66.0
2018: 67.0
2019: 68.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: ETC_pe_Married
Long Name: Education tax credit phaseout ends (Married)
Description: The education tax credit will be zero for those taxpayers of married filing status with modified AGI level (in thousands) higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: real
Known Values:
2013: 127.0
2014: 128.0
2015: 130.0
2016: 131.0
2017: 132.0
2018: 134.0
2019: 136.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_rt
Long Name: Charity Credit rate
Description: If greater than zero, this decimal fraction represents the portion of total charitable contributions provided as a nonrefundable tax credit.
Notes: Credit claimed will be (rt) * (e19800 + e20100)
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_f
Long Name: Charity Credit Floor
Description: Only charitable giving in excess of this dollar amount is eligible for the charity credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: stop

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_frt
Long Name: Charity Credit Floor Rate
Description: Only charitable giving in excess of this decimal fraction of AGI is eligible for the charity credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: real
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Other Parameters — Not in Tax-Brain webapp
tc Name: SS_percentage1
Title: Social Security taxable income decimal fraction 1
Description: Under current law if their provisional income is above the first threshold for Social Security taxability but below the second threshold, taxpayers need to apply this fraction to both the excess of their provisional income over the first threshold and their Social Security benefits, and then include the smaller one in their AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.5
2014: 0.5
2015: 0.5
2016: 0.5
2017: 0.5
2018: 0.5
2019: 0.5
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: SS_percentage2
Title: Social Security taxable income decimal fraction 2
Description: Under current law if their provisional income is above the second threshold for Social Security taxability, taxpayers need to apply this fraction to both the excess of their provisional income over the second threshold and their social security benefits, and then include the smaller one in their AGI.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.85
2014: 0.85
2015: 0.85
2016: 0.85
2017: 0.85
2018: 0.85
2019: 0.85
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: II_em_ps
Title: Personal exemption phaseout starting income
Description: If taxpayers' AGI is above this level, their personal exemption will start to decrease at the personal exemption phaseout rate (PEP provision).
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [250000.0, 300000.0, 150000.0, 275000.0, 300000.0]
2014: [254200.0, 305050.0, 152525.0, 279650.0, 305050.0]
2015: [258250.0, 309900.0, 154950.0, 284040.0, 309900.0]
2016: [259400.0, 311300.0, 155650.0, 285350.0, 311300.0]
2017: [261500.0, 313800.0, 156900.0, 287650.0, 313800.0]
2018: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
2019: [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: STD_Dep
Title: Standard deduction for dependents
Description: This is the maximum standard deduction for dependents.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 1000.0
2014: 1000.0
2015: 1050.0
2016: 1050.0
2017: 1050.0
2018: 1050.0
2019: 1100.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: STD_allow_charity_ded_nonitemizers
Title: Allow standard deduction filers to take the charitable contributions deduction
Description: Extends the charitable contributions deduction to taxpayers who take the standard deduction. The same ceilings, floor, and haircuts applied to itemized deduction for charitable contributions also apply here.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: bool
Known Values:
2013: False
2014: False
2015: False
2016: False
2017: False
2018: False
2019: False
Valid Range: min = False and max = True
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_child_em
Title: Child AMT exemption additional income base
Description: The child's AMT exemption is capped by this amount plus the child's earned income.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 7150.0
2014: 7250.0
2015: 7400.0
2016: 7400.0
2017: 7500.0
2018: 7600.0
2019: 0.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_child_em_c_age
Title: Age ceiling for special AMT exemption
Description: Individuals under this age must use the child AMT exemption rules.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: int
Known Values:
2013: 18
2014: 18
2015: 18
2016: 18
2017: 18
2018: 18
2019: 18
Valid Range: min = 0 and max = 30
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: AMT_em_pe
Title: AMT exemption phaseout ending AMT taxable income for Married filing Separately
Description: The AMT exemption is entirely disallowed beyond this AMT taxable income level for individuals who are married but filing separately.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 238550.0
2014: 242450.0
2015: 246250.0
2016: 247450.0
2017: 249450.0
2018: 718800.0
2019: 733700.0
2020: 745292.46
2021: 761539.84
2022: 778826.79
2023: 796817.69
2024: 814507.04
2025: 832100.39
2026: 300574.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: LLC_Expense_c
Title: Lifetime learning credit expense limit
Description: The maximum expense eligible for lifetime learning credit, per child.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 10000.0
2014: 10000.0
2015: 10000.0
2016: 10000.0
2017: 10000.0
2018: 10000.0
2019: 10000.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: ETC_pe_Single
Title: Education tax credit phaseout ends (Single)
Description: The education tax credit will be zero for those taxpayers of single filing status with modified AGI (in thousands) higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 63.0
2014: 64.0
2015: 65.0
2016: 65.0
2017: 66.0
2018: 67.0
2019: 68.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: ETC_pe_Married
Title: Education tax credit phaseout ends (Married)
Description: The education tax credit will be zero for those taxpayers of married filing status with modified AGI level (in thousands) higher than this level.
Has An Effect When Using:   PUF data: True   CPS data: False
Can Be Inflation Indexed: True     Is Inflation Indexed: True
Value Type: float
Known Values:
2013: 127.0
2014: 128.0
2015: 130.0
2016: 131.0
2017: 132.0
2018: 134.0
2019: 136.0
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_rt
Title: Charity Credit rate
Description: If greater than zero, this decimal fraction represents the portion of total charitable contributions provided as a nonrefundable tax credit.
Notes: Credit claimed will be (rt) * (e19800 + e20100)
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_f
Title: Charity Credit Floor
Description: Only charitable giving in excess of this dollar amount is eligible for the charity credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
   for: [single, mjoint, mseparate, headhh, widow]
2013: [0.0, 0.0, 0.0, 0.0, 0.0]
2014: [0.0, 0.0, 0.0, 0.0, 0.0]
2015: [0.0, 0.0, 0.0, 0.0, 0.0]
2016: [0.0, 0.0, 0.0, 0.0, 0.0]
2017: [0.0, 0.0, 0.0, 0.0, 0.0]
2018: [0.0, 0.0, 0.0, 0.0, 0.0]
2019: [0.0, 0.0, 0.0, 0.0, 0.0]
Valid Range: min = 0 and max = 9e+99
Out-of-Range Action: error

Other Parameters — Not in Tax-Brain webapp
tc Name: CR_Charity_frt
Title: Charity Credit Floor Rate
Description: Only charitable giving in excess of this decimal fraction of AGI is eligible for the charity credit.
Has An Effect When Using:   PUF data: True   CPS data: True
Can Be Inflation Indexed: False     Is Inflation Indexed: False
Value Type: float
Known Values:
2013: 0.0
2014: 0.0
2015: 0.0
2016: 0.0
2017: 0.0
2018: 0.0
2019: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

4. Input Variables

@@ -1051,11 +1051,11 @@

6. Assumption Parameters

6a. Growdiff Parameters

-

Assumption Parameter — Growdiff
tc Name: ABOOK
Long Name: ABOOK additive difference from default projection
Description: Default projection is in growfactors.csv file. ABOOK extrapolates input variables: e07300 and e07400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ACGNS
Long Name: ACGNS additive difference from default projection
Description: Default projection is in growfactors.csv file. ACGNS extrapolates input variables: e01200, p22250, p23250, e24515 and e24518.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ACPIM
Long Name: ACPIM additive difference from default projection
Description: Default projection is in growfactors.csv file. ACPIM extrapolates input variables: e03270, e03290 and e17500.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ACPIU
Long Name: ACPIU additive difference from default projection
Description: Default projection is in growfactors.csv file. ACPIU is the price inflation rate used to inflate many policy parameters. Note that non-zero values of this parameter will not affect historically known values of policy parameters.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ADIVS
Long Name: ADIVS additive difference from default projection
Description: Default projection is in growfactors.csv file. ADIVS extrapolates input variables: e00600 and e00650.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: AINTS
Long Name: AINTS additive difference from default projection
Description: Default projection is in growfactors.csv file. AINTS extrapolates input variables: e00300 and e00400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: AIPD
Long Name: AIPD additive difference from default projection
Description: Default projection is in growfactors.csv file. AIPD extrapolates input variables: e19200.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASCHCI
Long Name: ASCHCI additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHCI extrapolates input variables: e00900, e00900p and e00900s when they are positive.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASCHCL
Long Name: ASCHCL additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHCL extrapolates input variables: e00900, e00900p and e00900s when they are negative.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASCHEI
Long Name: ASCHEI additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHEI extrapolates input variables: e02000 when positive, and e26270, k1bx14p, k1bx14s and e27200 for all values.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASCHEL
Long Name: ASCHEL additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHEL extrapolates input variable: e02000 when negative.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASCHF
Long Name: ASCHF additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHF extrapolates input variables: e02100, e02100p and e02100s.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ASOCSEC
Long Name: ASOCSEC additive difference from default projection
Description: Default projection is in growfactors.csv file. ASOCSEC extrapolates input variable: e02400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ATXPY
Long Name: ATXPY additive difference from default projection
Description: Default projection is in growfactors.csv file. ATXPY extrapolates input variables: e00700, e00800, e01400, e01500, e01700, e03150, e03210, e03220, e03230, e03300, e03400, e03500, e07240, e07260, p08000, e09700, e09800, e09900, e11200, e18400, e18500, e19800, e20100, e20400, g20500, e07600, e32800, e58990, e62900, e87530, e87521 and cmbtp.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: AUCOMP
Long Name: AUCOMP additive difference from default projection
Description: Default projection is in growfactors.csv file. AUCOMP extrapolates input variable: e02300.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: AWAGE
Long Name: AWAGE additive difference from default projection
Description: Default projection is in growfactors.csv file. AWAGE extrapolates input variables: e00200, e00200p and e00200s. Also, AWAGE is the wage growth rate used to inflate the OASDI maximum taxable earnings policy parameter, _SS_Earnings_c. Note that non-zero values of this parameter will not affect historically known values of _SS_Earnings_c.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENOTHER
Long Name: ABENOTHER additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENOTHER extrapolates input variable other_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENMCARE
Long Name: ABENMCARE additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENMCARE extrapolates input variable mcare_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENMCAID
Long Name: ABENMCAID additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENMCAID extrapolates input variable mcaid_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENSSI
Long Name: ABENSSI additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENSSI extrapolates input variable ssi_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENSNAP
Long Name: ABENSNAP additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENSNAP extrapolates input variable snap_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENWIC
Long Name: ABENWIC additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENWIC extrapolates input variable wic_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENHOUSING
Long Name: ABENHOUSING additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENHOUSING extrapolates input variable housing_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENTANF
Long Name: ABENTANF additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENTANF extrapolates input variable tanf_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

Assumption Parameter — Growdiff
tc Name: ABENVET
Long Name: ABENVET additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENVET extrapolates input variable vet_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: stop

+

Assumption Parameter — Growdiff
tc Name: ABOOK
Long Name: ABOOK additive difference from default projection
Description: Default projection is in growfactors.csv file. ABOOK extrapolates input variables: e07300 and e07400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ACGNS
Long Name: ACGNS additive difference from default projection
Description: Default projection is in growfactors.csv file. ACGNS extrapolates input variables: e01200, p22250, p23250, e24515 and e24518.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ACPIM
Long Name: ACPIM additive difference from default projection
Description: Default projection is in growfactors.csv file. ACPIM extrapolates input variables: e03270, e03290 and e17500.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ACPIU
Long Name: ACPIU additive difference from default projection
Description: Default projection is in growfactors.csv file. ACPIU is the price inflation rate used to inflate many policy parameters. Note that non-zero values of this parameter will not affect historically known values of policy parameters.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ADIVS
Long Name: ADIVS additive difference from default projection
Description: Default projection is in growfactors.csv file. ADIVS extrapolates input variables: e00600 and e00650.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: AINTS
Long Name: AINTS additive difference from default projection
Description: Default projection is in growfactors.csv file. AINTS extrapolates input variables: e00300 and e00400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: AIPD
Long Name: AIPD additive difference from default projection
Description: Default projection is in growfactors.csv file. AIPD extrapolates input variables: e19200.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASCHCI
Long Name: ASCHCI additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHCI extrapolates input variables: e00900, e00900p and e00900s when they are positive.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASCHCL
Long Name: ASCHCL additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHCL extrapolates input variables: e00900, e00900p and e00900s when they are negative.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASCHEI
Long Name: ASCHEI additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHEI extrapolates input variables: e02000 when positive, and e26270, k1bx14p, k1bx14s and e27200 for all values.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASCHEL
Long Name: ASCHEL additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHEL extrapolates input variable: e02000 when negative.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASCHF
Long Name: ASCHF additive difference from default projection
Description: Default projection is in growfactors.csv file. ASCHF extrapolates input variables: e02100, e02100p and e02100s.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ASOCSEC
Long Name: ASOCSEC additive difference from default projection
Description: Default projection is in growfactors.csv file. ASOCSEC extrapolates input variable: e02400.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ATXPY
Long Name: ATXPY additive difference from default projection
Description: Default projection is in growfactors.csv file. ATXPY extrapolates input variables: e00700, e00800, e01400, e01500, e01700, e03150, e03210, e03220, e03230, e03300, e03400, e03500, e07240, e07260, p08000, e09700, e09800, e09900, e11200, e18400, e18500, e19800, e20100, e20400, g20500, e07600, e32800, e58990, e62900, e87530, e87521 and cmbtp.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: AUCOMP
Long Name: AUCOMP additive difference from default projection
Description: Default projection is in growfactors.csv file. AUCOMP extrapolates input variable: e02300.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: AWAGE
Long Name: AWAGE additive difference from default projection
Description: Default projection is in growfactors.csv file. AWAGE extrapolates input variables: e00200, e00200p and e00200s. Also, AWAGE is the wage growth rate used to inflate the OASDI maximum taxable earnings policy parameter, _SS_Earnings_c. Note that non-zero values of this parameter will not affect historically known values of _SS_Earnings_c.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENOTHER
Long Name: ABENOTHER additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENOTHER extrapolates input variable other_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENMCARE
Long Name: ABENMCARE additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENMCARE extrapolates input variable mcare_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENMCAID
Long Name: ABENMCAID additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENMCAID extrapolates input variable mcaid_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENSSI
Long Name: ABENSSI additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENSSI extrapolates input variable ssi_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENSNAP
Long Name: ABENSNAP additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENSNAP extrapolates input variable snap_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENWIC
Long Name: ABENWIC additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENWIC extrapolates input variable wic_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENHOUSING
Long Name: ABENHOUSING additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENHOUSING extrapolates input variable housing_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENTANF
Long Name: ABENTANF additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENTANF extrapolates input variable tanf_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

Assumption Parameter — Growdiff
tc Name: ABENVET
Long Name: ABENVET additive difference from default projection
Description: Default projection is in growfactors.csv file. ABENVET extrapolates input variable vet_ben.
Default Value:
2013: 0.0
Valid Range: min = -10 and max = 10
Out-of-Range Action: error

6b. Consumption Parameters

-

Assumption Parameter — Consumption
tc Name: MPC_e17500
Long Name: Marginal propensity to consume medical expenses
Description: Defined as dollar change in medical-expense consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: MPC_e18400
Long Name: Marginal propensity to consume state-and-local taxes
Description: Defined as dollar change in state-and-local-taxes consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: MPC_e19800
Long Name: Marginal propensity to consume charity cash contributions
Description: Defined as dollar change in charity-cash-contribution consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: MPC_e20400
Long Name: Marginal propensity to consume miscellaneous deduction expenses
Description: Defined as dollar change in miscellaneous-deduction-expense consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_housing_value
Long Name: Consumption value of housing benefits
Description: Consumption value per dollar of housing benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_snap_value
Long Name: Consumption value of SNAP benefits
Description: Consumption value per dollar of SNAP benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_tanf_value
Long Name: Consumption value of TANF benefits
Description: Consumption value per dollar of TANF benefits, some of which are cash benefits and some of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_vet_value
Long Name: Consumption value of veterans benefits
Description: Consumption value per dollar of veterans benefits, some of which are in-kind benefits (only about 48% are cash benefits).
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_wic_value
Long Name: Consumption value of WIC benefits
Description: Consumption value per dollar of WIC benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_mcare_value
Long Name: Consumption value of Medicare benefits
Description: Consumption value per dollar of Medicare benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_mcaid_value
Long Name: Consumption value of Medicaid benefits
Description: Consumption value per dollar of Medicaid benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: stop

Assumption Parameter — Consumption
tc Name: BEN_other_value
Long Name: Consumption value of other benefits
Description: Consumption value per dollar of other benefits, some of which are in-kind benefits (somewhere between 52% and 76% are in-kind benefits).
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: stop

+

Assumption Parameter — Consumption
tc Name: MPC_e17500
Long Name: Marginal propensity to consume medical expenses
Description: Defined as dollar change in medical-expense consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: MPC_e18400
Long Name: Marginal propensity to consume state-and-local taxes
Description: Defined as dollar change in state-and-local-taxes consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: MPC_e19800
Long Name: Marginal propensity to consume charity cash contributions
Description: Defined as dollar change in charity-cash-contribution consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: MPC_e20400
Long Name: Marginal propensity to consume miscellaneous deduction expenses
Description: Defined as dollar change in miscellaneous-deduction-expense consumption divided by dollar change in income. Typical value is in [0,1] range.
Default Value:
2013: 0.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_housing_value
Long Name: Consumption value of housing benefits
Description: Consumption value per dollar of housing benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_snap_value
Long Name: Consumption value of SNAP benefits
Description: Consumption value per dollar of SNAP benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_tanf_value
Long Name: Consumption value of TANF benefits
Description: Consumption value per dollar of TANF benefits, some of which are cash benefits and some of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_vet_value
Long Name: Consumption value of veterans benefits
Description: Consumption value per dollar of veterans benefits, some of which are in-kind benefits (only about 48% are cash benefits).
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_wic_value
Long Name: Consumption value of WIC benefits
Description: Consumption value per dollar of WIC benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_mcare_value
Long Name: Consumption value of Medicare benefits
Description: Consumption value per dollar of Medicare benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_mcaid_value
Long Name: Consumption value of Medicaid benefits
Description: Consumption value per dollar of Medicaid benefits, all of which are in-kind benefits.
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 2
Out-of-Range Action: error

Assumption Parameter — Consumption
tc Name: BEN_other_value
Long Name: Consumption value of other benefits
Description: Consumption value per dollar of other benefits, some of which are in-kind benefits (somewhere between 52% and 76% are in-kind benefits).
Default Value:
2013: 1.0
Valid Range: min = 0 and max = 1
Out-of-Range Action: error

diff --git a/environment.yml b/environment.yml index e3ac2b454..e6239ffbf 100644 --- a/environment.yml +++ b/environment.yml @@ -1,4 +1,6 @@ name: taxcalc-dev +channels: + - conda-forge dependencies: - python - "numpy>=1.14" @@ -12,3 +14,4 @@ dependencies: - pycodestyle - pylint - coverage +- "paramtools>=0.14.0" diff --git a/setup.py b/setup.py index 836e480aa..f6979e5d9 100755 --- a/setup.py +++ b/setup.py @@ -31,7 +31,10 @@ 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Topic :: Software Development :: Libraries :: Python Modules'], - 'tests_require': ['pytest'] + 'tests_require': ['pytest'], + 'entry_points': { + 'console_scripts': ['tc=taxcalc.cli.tc:cli_tc_main'] + } } setup(**config) diff --git a/taxcalc/calcfunctions.py b/taxcalc/calcfunctions.py index 8dc383455..eb08d982a 100644 --- a/taxcalc/calcfunctions.py +++ b/taxcalc/calcfunctions.py @@ -1773,19 +1773,19 @@ def ComputeBenefit(calc, ID_switch): # the types of itemized deductions covered under the BenefitSurtax no_ID_calc = copy.deepcopy(calc) if ID_switch[0]: - no_ID_calc.policy_param('ID_Medical_hc', 1.) + no_ID_calc.policy_param('ID_Medical_hc', [1.]) if ID_switch[1]: - no_ID_calc.policy_param('ID_StateLocalTax_hc', 1.) + no_ID_calc.policy_param('ID_StateLocalTax_hc', [1.]) if ID_switch[2]: - no_ID_calc.policy_param('ID_RealEstate_hc', 1.) + no_ID_calc.policy_param('ID_RealEstate_hc', [1.]) if ID_switch[3]: - no_ID_calc.policy_param('ID_Casualty_hc', 1.) + no_ID_calc.policy_param('ID_Casualty_hc', [1.]) if ID_switch[4]: - no_ID_calc.policy_param('ID_Miscellaneous_hc', 1.) + no_ID_calc.policy_param('ID_Miscellaneous_hc', [1.]) if ID_switch[5]: - no_ID_calc.policy_param('ID_InterestPaid_hc', 1.) + no_ID_calc.policy_param('ID_InterestPaid_hc', [1.]) if ID_switch[6]: - no_ID_calc.policy_param('ID_Charity_hc', 1.) + no_ID_calc.policy_param('ID_Charity_hc', [1.]) no_ID_calc._calc_one_year() # pylint: disable=protected-access diff_iitax = no_ID_calc.array('iitax') - calc.array('iitax') benefit = np.where(diff_iitax > 0., diff_iitax, 0.) diff --git a/taxcalc/calculator.py b/taxcalc/calculator.py index 41696abec..9de9eb514 100644 --- a/taxcalc/calculator.py +++ b/taxcalc/calculator.py @@ -10,6 +10,7 @@ import copy import numpy as np import pandas as pd +import paramtools from taxcalc.calcfunctions import (TaxInc, SchXYZTax, GainsTax, AGIsurtax, NetInvIncTax, AMT, EI_PayrollTax, Adj, DependentCare, ALD_InvInc_ec_base, CapGains, @@ -281,7 +282,11 @@ def policy_param(self, param_name, param_value=None): return None (which can be ignored). """ if param_value is None: - return getattr(self.__policy, param_name) + val = getattr(self.__policy, param_name) + if param_name.startswith("_"): + return val + else: + return val[0] # drop down a dimension. setattr(self.__policy, param_name, param_value) return None @@ -1165,24 +1170,26 @@ def lines(text, num_indent_spaces, max_line_length=77): for year in years: baseline.set_year(year) updated.set_year(year) - mdata_base = baseline.metadata() - mdata_upda = updated.metadata() - mdata_base_keys = mdata_base.keys() - mdata_upda_keys = mdata_upda.keys() - assert set(mdata_base_keys) == set(mdata_upda_keys) + assert set(baseline.keys()) == set(updated.keys()) params_with_diff = list() - for pname in mdata_base_keys: - base_value = mdata_base[pname]['value'] - upda_value = mdata_upda[pname]['value'] - if upda_value != base_value: + for pname in baseline.keys(): + upda_value = getattr(updated, pname) + base_value = getattr(baseline, pname) + if ( + (isinstance(upda_value, np.ndarray) and + np.allclose(upda_value, base_value)) or + (not isinstance(upda_value, np.ndarray) and + upda_value != base_value) + ): params_with_diff.append(pname) if params_with_diff: + mdata_base = baseline.specification(meta_data=True) # write year doc += '{}:\n'.format(year) for pname in sorted(params_with_diff): # write updated value line - pval = mdata_upda[pname]['value'] - if mdata_base[pname]['value_type'] == 'boolean': + pval = getattr(updated, pname).tolist()[0] + if mdata_base[pname]['type'] == 'bool': if isinstance(pval, list): pval = [bool(item) for item in pval] else: @@ -1190,11 +1197,24 @@ def lines(text, num_indent_spaces, max_line_length=77): doc += ' {} : {}\n'.format(pname, pval) # ... write optional param-vector-index line if isinstance(pval, list): - pval = mdata_base[pname].get('vi_vals', []) - pval = [str(item) for item in pval] - doc += ' ' * (4 + len(pname)) + '{}\n'.format(pval) + labels = paramtools.consistent_labels( + [mdata_base[pname]["value"][0]] + ) + label = None + for _label in labels: + if _label not in ("value", "year"): + label = _label + break + if label: + lv = baseline._stateless_label_grid[label] + lv = [ + str(item) for item in lv + ] + doc += ' ' * ( + 4 + len(pname) + ) + '{}\n'.format(lv) # ... write param-name line - name = mdata_base[pname]['long_name'] + name = mdata_base[pname]['title'] for line in lines('name: ' + name, 6): doc += ' ' + line # ... write param-description line @@ -1203,21 +1223,18 @@ def lines(text, num_indent_spaces, max_line_length=77): doc += ' ' + line # ... write param-baseline-value line if isinstance(baseline, Policy): - pval = mdata_base[pname]['value'] - ptype = mdata_base[pname]['value_type'] + pval = getattr(baseline, pname).tolist()[0] + ptype = mdata_base[pname]['type'] if isinstance(pval, list): - if ptype == 'boolean': + if ptype == 'bool': pval = [bool(item) for item in pval] - elif ptype == 'boolean': + elif ptype == 'bool': pval = bool(pval) doc += ' baseline_value: {}\n'.format(pval) else: # if baseline is GrowDiff object # each GrowDiff parameter has zero as default value doc += ' baseline_value: 0.0\n' del mdata_base - del mdata_upda - del mdata_base_keys - del mdata_upda_keys return doc # begin main logic of reform_documentation diff --git a/taxcalc/consumption.json b/taxcalc/consumption.json index 43bea766b..5ed79ebf3 100644 --- a/taxcalc/consumption.json +++ b/taxcalc/consumption.json @@ -1,112 +1,285 @@ { + "schema": { + "labels": { + "year": { + "type": "int", + "validators": { + "range": { + "min": 2013, + "max": 2030 + } + } + }, + "MARS": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "single", + "mjoint", + "mseparate", + "headhh", + "widow" + ] + } + } + }, + "idedtype": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "med", + "sltx", + "retx", + "cas", + "misc", + "int", + "char" + ] + } + } + }, + "EIC": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "0kids", + "1kid", + "2kids", + "3+kids" + ] + } + } + } + }, + "additional_members": { + "section_1": { + "type": "str" + }, + "section_2": { + "type": "str" + }, + "start_year": { + "type": "int" + }, + "indexable": { + "type": "bool" + }, + "indexed": { + "type": "bool" + }, + "compatible_data": { + "type": "compatible_data" + } + } + }, "MPC_e17500": { - "long_name": "Marginal propensity to consume medical expenses", + "title": "Marginal propensity to consume medical expenses", "description": "Defined as dollar change in medical-expense consumption divided by dollar change in income. Typical value is in [0,1] range.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "MPC_e18400": { - "start_year": 2013, - "long_name": "Marginal propensity to consume state-and-local taxes", + "title": "Marginal propensity to consume state-and-local taxes", "description": "Defined as dollar change in state-and-local-taxes consumption divided by dollar change in income. Typical value is in [0,1] range.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": 0, "max": 1} + "start_year": 2013, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "MPC_e19800": { - "start_year": 2013, - "long_name": "Marginal propensity to consume charity cash contributions", + "title": "Marginal propensity to consume charity cash contributions", "description": "Defined as dollar change in charity-cash-contribution consumption divided by dollar change in income. Typical value is in [0,1] range.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": 0, "max": 1} + "start_year": 2013, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "MPC_e20400": { - "start_year": 2013, - "long_name": "Marginal propensity to consume miscellaneous deduction expenses", + "title": "Marginal propensity to consume miscellaneous deduction expenses", "description": "Defined as dollar change in miscellaneous-deduction-expense consumption divided by dollar change in income. Typical value is in [0,1] range.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": 0, "max": 1} + "start_year": 2013, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "BEN_housing_value": { - "long_name": "Consumption value of housing benefits", + "title": "Consumption value of housing benefits", "description": "Consumption value per dollar of housing benefits, all of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "BEN_snap_value": { - "long_name": "Consumption value of SNAP benefits", + "title": "Consumption value of SNAP benefits", "description": "Consumption value per dollar of SNAP benefits, all of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "BEN_tanf_value": { - "long_name": "Consumption value of TANF benefits", + "title": "Consumption value of TANF benefits", "description": "Consumption value per dollar of TANF benefits, some of which are cash benefits and some of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "BEN_vet_value": { - "long_name": "Consumption value of veterans benefits", + "title": "Consumption value of veterans benefits", "description": "Consumption value per dollar of veterans benefits, some of which are in-kind benefits (only about 48% are cash benefits).", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 2} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 2 + } + } }, - "BEN_wic_value": { - "long_name": "Consumption value of WIC benefits", + "title": "Consumption value of WIC benefits", "description": "Consumption value per dollar of WIC benefits, all of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } }, - "BEN_mcare_value": { - "long_name": "Consumption value of Medicare benefits", + "title": "Consumption value of Medicare benefits", "description": "Consumption value per dollar of Medicare benefits, all of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 2} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 2 + } + } }, - "BEN_mcaid_value": { - "long_name": "Consumption value of Medicaid benefits", + "title": "Consumption value of Medicaid benefits", "description": "Consumption value per dollar of Medicaid benefits, all of which are in-kind benefits.", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 2} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 2 + } + } }, - "BEN_other_value": { - "long_name": "Consumption value of other benefits", + "title": "Consumption value of other benefits", "description": "Consumption value per dollar of other benefits, some of which are in-kind benefits (somewhere between 52% and 76% are in-kind benefits).", - "value_type": "real", - "value_yrs": [2013], - "value": [1.0], - "valid_values": {"min": 0, "max": 1} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + } } -} +} \ No newline at end of file diff --git a/taxcalc/decorators.py b/taxcalc/decorators.py index 42be3a30c..ac638f4b9 100644 --- a/taxcalc/decorators.py +++ b/taxcalc/decorators.py @@ -142,6 +142,9 @@ def hl_func(x_0, x_1, x_2, ...): fstr.write(" (" + ", ".join(outs) + ") = \\\n") fstr.write(" " + "applied_f(") for ppp, attr in zip(pm_or_pf, args_out + args_in): + # Bring Policy parameter values down a dimension. + if ppp == "pm": + attr += "[0]" fstr.write("get_values(" + ppp + "." + attr + ")" + ", ") fstr.write(")\n") fstr.write(" header = [") diff --git a/taxcalc/growdiff.json b/taxcalc/growdiff.json index ac2c290fe..5fbf89fec 100644 --- a/taxcalc/growdiff.json +++ b/taxcalc/growdiff.json @@ -1,233 +1,503 @@ { + "schema": { + "labels": { + "year": { + "type": "int", + "validators": { + "range": { + "min": 2013, + "max": 2030 + } + } + }, + "MARS": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "single", + "mjoint", + "mseparate", + "headhh", + "widow" + ] + } + } + }, + "idedtype": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "med", + "sltx", + "retx", + "cas", + "misc", + "int", + "char" + ] + } + } + }, + "EIC": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "0kids", + "1kid", + "2kids", + "3+kids" + ] + } + } + } + }, + "additional_members": { + "section_1": { + "type": "str" + }, + "section_2": { + "type": "str" + }, + "start_year": { + "type": "int" + }, + "indexable": { + "type": "bool" + }, + "indexed": { + "type": "bool" + }, + "compatible_data": { + "type": "compatible_data" + } + } + }, "ABOOK": { - "long_name": "ABOOK additive difference from default projection", + "title": "ABOOK additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABOOK extrapolates input variables: e07300 and e07400.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ACGNS": { - "long_name": "ACGNS additive difference from default projection", + "title": "ACGNS additive difference from default projection", "description": "Default projection is in growfactors.csv file. ACGNS extrapolates input variables: e01200, p22250, p23250, e24515 and e24518.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ACPIM": { - "long_name": "ACPIM additive difference from default projection", + "title": "ACPIM additive difference from default projection", "description": "Default projection is in growfactors.csv file. ACPIM extrapolates input variables: e03270, e03290 and e17500.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ACPIU": { - "long_name": "ACPIU additive difference from default projection", + "title": "ACPIU additive difference from default projection", "description": "Default projection is in growfactors.csv file. ACPIU is the price inflation rate used to inflate many policy parameters. Note that non-zero values of this parameter will not affect historically known values of policy parameters.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ADIVS": { - "long_name": "ADIVS additive difference from default projection", + "title": "ADIVS additive difference from default projection", "description": "Default projection is in growfactors.csv file. ADIVS extrapolates input variables: e00600 and e00650.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "AINTS": { - "long_name": "AINTS additive difference from default projection", + "title": "AINTS additive difference from default projection", "description": "Default projection is in growfactors.csv file. AINTS extrapolates input variables: e00300 and e00400.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "AIPD": { - "long_name": "AIPD additive difference from default projection", + "title": "AIPD additive difference from default projection", "description": "Default projection is in growfactors.csv file. AIPD extrapolates input variables: e19200.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASCHCI": { - "long_name": "ASCHCI additive difference from default projection", + "title": "ASCHCI additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASCHCI extrapolates input variables: e00900, e00900p and e00900s when they are positive.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASCHCL": { - "long_name": "ASCHCL additive difference from default projection", + "title": "ASCHCL additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASCHCL extrapolates input variables: e00900, e00900p and e00900s when they are negative.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASCHEI": { - "long_name": "ASCHEI additive difference from default projection", + "title": "ASCHEI additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASCHEI extrapolates input variables: e02000 when positive, and e26270, k1bx14p, k1bx14s and e27200 for all values.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASCHEL": { - "long_name": "ASCHEL additive difference from default projection", + "title": "ASCHEL additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASCHEL extrapolates input variable: e02000 when negative.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASCHF": { - "long_name": "ASCHF additive difference from default projection", + "title": "ASCHF additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASCHF extrapolates input variables: e02100, e02100p and e02100s.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ASOCSEC": { - "long_name": "ASOCSEC additive difference from default projection", + "title": "ASOCSEC additive difference from default projection", "description": "Default projection is in growfactors.csv file. ASOCSEC extrapolates input variable: e02400.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ATXPY": { - "long_name": "ATXPY additive difference from default projection", + "title": "ATXPY additive difference from default projection", "description": "Default projection is in growfactors.csv file. ATXPY extrapolates input variables: e00700, e00800, e01400, e01500, e01700, e03150, e03210, e03220, e03230, e03300, e03400, e03500, e07240, e07260, p08000, e09700, e09800, e09900, e11200, e18400, e18500, e19800, e20100, e20400, g20500, e07600, e32800, e58990, e62900, e87530, e87521 and cmbtp.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "AUCOMP": { - "long_name": "AUCOMP additive difference from default projection", + "title": "AUCOMP additive difference from default projection", "description": "Default projection is in growfactors.csv file. AUCOMP extrapolates input variable: e02300.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "AWAGE": { - "long_name": "AWAGE additive difference from default projection", + "title": "AWAGE additive difference from default projection", "description": "Default projection is in growfactors.csv file. AWAGE extrapolates input variables: e00200, e00200p and e00200s. Also, AWAGE is the wage growth rate used to inflate the OASDI maximum taxable earnings policy parameter, _SS_Earnings_c. Note that non-zero values of this parameter will not affect historically known values of _SS_Earnings_c.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ABENOTHER": { - "long_name": "ABENOTHER additive difference from default projection", + "title": "ABENOTHER additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENOTHER extrapolates input variable other_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ABENMCARE": { - "long_name": "ABENMCARE additive difference from default projection", + "title": "ABENMCARE additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENMCARE extrapolates input variable mcare_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENMCAID": { - "long_name": "ABENMCAID additive difference from default projection", + "title": "ABENMCAID additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENMCAID extrapolates input variable mcaid_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENSSI": { - "long_name": "ABENSSI additive difference from default projection", + "title": "ABENSSI additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENSSI extrapolates input variable ssi_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENSNAP": { - "long_name": "ABENSNAP additive difference from default projection", + "title": "ABENSNAP additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENSNAP extrapolates input variable snap_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENWIC": { - "long_name": "ABENWIC additive difference from default projection", + "title": "ABENWIC additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENWIC extrapolates input variable wic_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENHOUSING": { - "long_name": "ABENHOUSING additive difference from default projection", + "title": "ABENHOUSING additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENHOUSING extrapolates input variable housing_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - - "ABENTANF": { - "long_name": "ABENTANF additive difference from default projection", + "title": "ABENTANF additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENTANF extrapolates input variable tanf_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } }, - "ABENVET": { - "long_name": "ABENVET additive difference from default projection", + "title": "ABENVET additive difference from default projection", "description": "Default projection is in growfactors.csv file. ABENVET extrapolates input variable vet_ben.", - "value_type": "real", - "value_yrs": [2013], - "value": [0.0], - "valid_values": {"min": -10, "max": 10} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -10, + "max": 10 + } + } } - -} +} \ No newline at end of file diff --git a/taxcalc/growdiff.py b/taxcalc/growdiff.py index 909e2f724..143c0ee01 100644 --- a/taxcalc/growdiff.py +++ b/taxcalc/growdiff.py @@ -61,8 +61,8 @@ def has_any_response(self): Returns true if any parameter is non-zero for any year; returns false if all parameters are zero in all years. """ - for param in self._vals: - values = getattr(self, param) + for param in self: + values = getattr(self, f"_{param}") for year in np.ndindex(values.shape): val = values[year] if val != 0.0: diff --git a/taxcalc/parameters.py b/taxcalc/parameters.py index 6b5913ee2..7a192be49 100644 --- a/taxcalc/parameters.py +++ b/taxcalc/parameters.py @@ -1,863 +1,579 @@ -""" -Tax-Calculator abstract base parameters class. -""" -# CODING-STYLE CHECKS: -# pycodestyle parameters.py -# pylint --disable=locally-disabled parameters.py - +import copy import os import re -import abc -from collections import OrderedDict -import requests +from collections import defaultdict + +import marshmallow as ma +import paramtools as pt import numpy as np -from taxcalc.utils import read_egg_json, json_to_dict +import requests + +import taxcalc +from taxcalc.utils import json_to_dict + + +class CompatibleDataSchema(ma.Schema): + """ + Schema for Compatible data object + { + "compatible_data": {"data1": bool, "data2": bool, ...} + } + """ + + puf = ma.fields.Boolean() + cps = ma.fields.Boolean() + +pt.register_custom_type( + "compatible_data", + ma.fields.Nested(CompatibleDataSchema()) +) -class Parameters(): + +class Parameters(pt.Parameters): """ - Inherit from this class for Policy, Consumption, GrowDiff, and - other groups of parameters that need to have a set_year method. - Override this __init__ method and DEFAULTS_FILE_NAME and - DEFAULTS_FILE_PATH in the inheriting class. + Base Parameters class that wraps ParamTools, providing parameter indexing + for tax policy in the adjust method and backwards-compatible preserving + layer that supports Tax-Calculator's conventional reform formatting style + as well as convenience methods like set_Year for classes operating on this + one. + + The defaults file path may be set through the defaults class attribute + variable or through the old DEFAULTS_FILE_NAME/DEFAULTS_FILE_PATH work + flow. + + A custom getter method is implemented so that the value of a parameter + over all allowed years can conveniently be retrieved by adding an + underscore before the variable name (e.g. EITC_c vs _EITC_c). + + Note: Like all pt.Parameters classes the values of attributes + corresponding to a parameter value on this class are ephemeral and the only + way to make permanent changes to this class'sstate is through the set_state + or adjust methods. + """ - # pylint: disable=too-many-instance-attributes + defaults = None + array_first = True + label_to_extend = "year" + uses_extend_func = True - __metaclass__ = abc.ABCMeta + REMOVED_PARAMS = None + REDEFINED_PARAMS = None + WAGE_INDEXED_PARAMS = () + # Legacy class attrs DEFAULTS_FILE_NAME = None DEFAULTS_FILE_PATH = None + JSON_START_YEAR = None + LAST_KNOWN_YEAR = None + + def __init__(self, start_year=None, num_years=None, last_known_year=None, + removed=None, redefined=None, wage_indexed=None, **kwargs): + # In case we need to wait for this to be called from the + # initialize method for legacy reasons. + if not start_year or not num_years: + return + self._wage_growth_rates = None + self._inflation_rates = None + if ( + self.defaults is None and + self.DEFAULTS_FILE_PATH is not None and + self.DEFAULTS_FILE_NAME + ): + self.defaults = os.path.join( + self.DEFAULTS_FILE_PATH, + self.DEFAULTS_FILE_NAME + ) - def __init__(self): - # convert JSON in DEFAULTS_FILE_NAME into self._vals dictionary - assert self.DEFAULTS_FILE_NAME is not None - assert self.DEFAULTS_FILE_PATH is not None - file_path = os.path.join(self.DEFAULTS_FILE_PATH, - self.DEFAULTS_FILE_NAME) - if os.path.isfile(file_path): - with open(file_path) as pfile: - json_text = pfile.read() - vals = json_to_dict(json_text) - else: # find file in conda package - vals = read_egg_json(self.DEFAULTS_FILE_NAME) # pragma: no cover - # add leading underscore character to each parameter name - self._vals = OrderedDict() - for pname in vals: - self._vals['_' + pname] = vals[pname] - del vals - # declare several scalar variables - self._current_year = 0 - self._start_year = 0 - self._end_year = 0 - self._num_years = 0 - self._last_known_year = 0 - # declare optional _inflation_rates and _wage_growth_rates - self._inflation_rates = list() - self._wage_growth_rates = list() - self._wage_indexed = None - # declare removed and redefined parameters - self._removed = None - self._redefined = None - # declare parameter warning/error variables - self.parameter_warnings = '' - self.parameter_errors = '' - - def initialize(self, start_year, num_years, last_known_year=None, - removed=None, redefined=None, wage_indexed=None): - """ - Called from subclass __init__ function. - """ - # pylint: disable=too-many-arguments - # check arguments - assert start_year >= 0 - assert num_years >= 1 - end_year = start_year + num_years - 1 - assert last_known_year is None or isinstance(last_known_year, int) - assert removed is None or isinstance(removed, dict) - assert redefined is None or isinstance(redefined, dict) - assert wage_indexed is None or isinstance(wage_indexed, list) - # remember arguments - self._current_year = start_year - self._start_year = start_year - self._num_years = num_years - self._end_year = end_year if last_known_year is None: self._last_known_year = start_year else: assert last_known_year >= start_year - assert last_known_year <= end_year + assert last_known_year <= self.LAST_BUDGET_YEAR self._last_known_year = last_known_year - if removed is None: - self._removed = dict() - else: - self._removed = removed - if redefined is None: - self._redefined = dict() - else: - self._redefined = redefined - if wage_indexed is None: - self._wage_indexed = list() - else: - self._wage_indexed = wage_indexed - # set default parameter values - self._apply_cpi_offset_to_inflation_rates() - self._set_default_vals() - def inflation_rates(self): - """ - Override this method in subclass when appropriate. - """ - return self._inflation_rates + self._removed_params = removed or self.REMOVED_PARAMS + self._redefined_params = redefined or self.REDEFINED_PARAMS - def wage_growth_rates(self): - """ - Override this method in subclass when appropriate. - """ - return self._wage_growth_rates + self._wage_indexed = wage_indexed or self.WAGE_INDEXED_PARAMS - @property - def num_years(self): - """ - Parameters class number of parameter years property. - """ - return self._num_years + if ( + (start_year or self.JSON_START_YEAR) and + "initial_state" not in kwargs + ): + kwargs["initial_state"] = { + "year": start_year or self.JSON_START_YEAR + } + super().__init__(**kwargs) + self._init_values = { + param: copy.deepcopy(data["value"]) + for param, data in self.read_params(self.defaults).items() + if param != "schema" + } - @property - def current_year(self): - """ - Parameters class current calendar year property. - """ - return self._current_year - - @property - def start_year(self): - """ - Parameters class first parameter year property. - """ - return self._start_year - - @property - def last_known_year(self): + def adjust(self, params_or_path, print_warnings=True, **kwargs): """ - Parameters class last known parameter year property. - """ - return self._last_known_year + Implements custom warning and error handling. - @property - def end_year(self): - """ - Parameters class last parameter year property. - """ - return self._end_year + If print_warnings is True, warnings are printed out and if + print_warnings is False, nothing is printed. - def set_year(self, year): + ParamTools throws an error if a warning is triggered and + ignore_warnings is False. This method circumvents this behavior. """ - Set parameters to their values for the specified calendar year. + if print_warnings: + _data = copy.deepcopy(self._data) + kwargs["ignore_warnings"] = False + else: + kwargs["ignore_warnings"] = True + self._warnings = {} + try: + return self.adjust_with_indexing(params_or_path, **kwargs) + except pt.ValidationError as ve: + if self.errors: + raise ve + if print_warnings: + print("WARNING:") + print(self.warnings) + kwargs["ignore_warnings"] = True + self._data = _data + _warnings = copy.deepcopy(self._warnings) + self._warnings = {} + self._errors = {} + adjustment = self.adjust_with_indexing(params_or_path, **kwargs) + self._warnings = _warnings + return adjustment + + def adjust_with_indexing(self, params_or_path, **kwargs): + """ + Custom adjust method that handles special indexing logic. The logic + is: + + 1. If "CPI_offset" is adjusted, revert all values of indexed parameters + to the 'known' values: + a. The current values of parameters that are being adjusted are + deleted after the first year in which CPI_offset is adjusted. + b. The current values of parameters that are not being adjusted + (i.e. are not in params) are deleted after the last known year. + After the 'unknown' values have been deleted, the last known value + is extrapolated through the budget window. If there are indexed + parameters in the adjustment, they will be included in the final + adjustment call (unless their indexed status is changed). + 2. If the "indexed" status is updated for any parameter: + a. If a parameter has values that are being adjusted before + the indexed status is adjusted, update those parameters first. + b. Extend the values of that parameter to the year in which + the status is changed. + c. Change the indexed status for the parameter. + d. Update parameter values in adjustment that are adjusted after + the year in which the indexed status changes. + e. Using the new "-indexed" status, extend the values of that + parameter through the remaining years or until the -indexed + status changes again. + 3. Update all parameters that are not indexing related, i.e. they are + not "CPI_offset" or do not end with "-indexed". + 4. Return parsed adjustment with all adjustments, including "-indexed" + parameters. + + Notable side-effects: + - All values of indexed parameters, including default values, are + wiped out after the first year in which the "CPI_offset" is + changed. This is only necessary because Tax-Calculator + hard-codes inflated values. If Tax-Calculator only hard-coded + values that were changed for non-inflation related reasons, + then this would not be necessary for default values. + - All values of a parameter whose indexed status is adjusted are + wiped out after the year in which the value is adjusted for the + same hard-coding reason. + """ + # Temporarily turn off extra ops during the intermediary adjustments + # so that expensive and unnecessary operations are not run. + label_to_extend = self.label_to_extend + array_first = self.array_first + self.array_first = False + + params = self.read_params(params_or_path) + + # Check if CPI_offset is adjusted. If so, reset values of all indexed + # parameters after year where CPI_offset is changed. If CPI_offset is + # changed multiple times, then reset values after the first year in + # which the CPI_offset is changed. + needs_reset = [] + if params.get("CPI_offset") is not None: + # Update CPI_offset with new value. + cpi_adj = super().adjust( + {"CPI_offset": params["CPI_offset"]}, **kwargs + ) + # turn off extend now that CPI_offset has been updated. + self.label_to_extend = None + # Get first year in which CPI_offset is changed. + cpi_min_year = min( + cpi_adj["CPI_offset"], key=lambda vo: vo["year"] + ) + # Apply new CPI_offset values to inflation rates + rate_adjustment_vals = self.select_gte( + "CPI_offset", year=cpi_min_year["year"] + ) + for cpi_vo in rate_adjustment_vals: + self._inflation_rates[ + cpi_vo["year"] - self.start_year + ] += cpi_vo["value"] + # 1. Delete all unknown values. + # 1.a For revision, these are years specified after cpi_min_year. + init_vals = {} + to_delete = {} + for param in params: + if param == "CPI_offset" or param in self._wage_indexed: + continue + if param.endswith("-indexed"): + param = param.split("-indexed")[0] + if self._data[param].get("indexed", False): + init_vals[param] = pt.select_lte( + self._init_values[param], + True, + {"year": cpi_min_year["year"]}, + ) + to_delete[param] = self.select_gt( + param, year=cpi_min_year["year"] + ) + needs_reset.append(param) + self.delete(to_delete, **kwargs) + super().adjust(init_vals, **kwargs) + + # 1.b For all others, these are years after last_known_year. + init_vals = {} + to_delete = {} + last_known_year = max(cpi_min_year["year"], self._last_known_year) + for param in self._data: + if ( + param in params or + param == "CPI_offset" or + param in self._wage_indexed + ): + continue + if self._data[param].get("indexed", False): + init_vals[param] = pt.select_lte( + self._init_values[param], + True, + {"year": last_known_year} + ) + to_delete[param] = self.select_gt( + param, year=last_known_year + ) + needs_reset.append(param) + + self.delete(to_delete, **kwargs) + super().adjust(init_vals, **kwargs) + + self.extend(label="year") + + # 2. Handle -indexed parameters. + self.label_to_extend = None + index_affected = set([]) + for param, values in params.items(): + if param.endswith("-indexed"): + base_param = param.split("-indexed")[0] + if not self._data[base_param].get("indexable", None): + msg = f"Parameter {base_param} is not indexable." + raise pt.ValidationError( + {"errors": {base_param: msg}}, labels=None + ) + index_affected |= {param, base_param} + indexed_changes = {} + if isinstance(values, bool): + indexed_changes[self.start_year] = values + elif isinstance(values, list): + for vo in values: + indexed_changes[vo.get("year", self.start_year)] = vo[ + "value" + ] + else: + msg = ( + "Index adjustment parameter must be a boolean or " + "list." + ) + raise pt.ValidationError( + {"errors": {base_param: msg}}, labels=None + ) + # 2.a Adjust values less than first year in which index status + # was changed. + if base_param in params: + min_index_change_year = min(indexed_changes.keys()) + vos = pt.select_lt( + params[base_param], + False, + {"year": min_index_change_year}, + ) + if vos: + min_adj_year = min(vos, key=lambda vo: vo["year"])[ + "year" + ] + self.delete( + { + base_param: self.select_gt( + base_param, year=min_adj_year + ) + } + ) + super().adjust({base_param: vos}, **kwargs) + self.extend( + params=[base_param], + label="year", + label_values=list( + range(self.start_year, min_index_change_year) + ), + ) - Parameters - ---------- - year: integer - calendar year for which to set current_year and parameter values + for year in sorted(indexed_changes): + indexed_val = indexed_changes[year] + # Get and delete all default values after year where + # indexed status changed. + self.delete( + {base_param: self.select_gt(base_param, year=year)} + ) + + # 2.b Extend values for this parameter to the year where + # the indexed status changes. + if year > self.start_year: + self.extend( + params=[base_param], + label="year", + label_values=list( + range(self.start_year, year + 1) + ), + ) - Raises - ------ - ValueError: - if year is not in [start_year, end_year] range. + # 2.c Set indexed status. + self._data[base_param]["indexed"] = indexed_val - Returns - ------- - nothing: void - """ - if year < self.start_year or year > self.end_year: - msg = 'year {} passed to set_year() must be in [{},{}] range.' - raise ValueError(msg.format(year, self.start_year, self.end_year)) - self._current_year = year - iyr = year - self._start_year - for name in self._vals: - arr = getattr(self, name) - setattr(self, name[1:], arr[iyr]) + # 2.d Adjust with values greater than or equal to current + # year in params + if base_param in params: + vos = pt.select_gte( + params[base_param], False, {"year": year} + ) + super().adjust({base_param: vos}, **kwargs) + + # 2.e Extend values through remaining years. + self.extend(params=[base_param], label="year") + + needs_reset.append(base_param) + # Re-instate ops. + self.label_to_extend = label_to_extend + self.array_first = array_first + + # Filter out "-indexed" params. + nonindexed_params = { + param: val + for param, val in params.items() + if param not in index_affected + } + + needs_reset = set(needs_reset) - set(nonindexed_params.keys()) + if needs_reset: + self._set_state(params=needs_reset) + + # 3. Do adjustment for all non-indexing related parameters. + adj = super().adjust(nonindexed_params, **kwargs) + + # 4. Add indexing params back for return to user. + adj.update( + { + param: val + for param, val in params.items() + if param in index_affected + } + ) + return adj - def metadata(self): + def get_index_rate(self, param, label_to_extend_val): """ - Returns ordered dictionary of all parameter information based on - DEFAULTS_FILE_NAME contents with each parameter's 'start_year', - 'value_yrs', and 'value' key values updated so that they contain - just the current_year information. + Initalize indexing data and return the indexing rate value + depending on the parameter name and label_to_extend_val, the value of + label_to_extend. + Returns: rate to use for indexing. """ - mdata = OrderedDict() - for pname, pdata in self._vals.items(): - name = pname[1:] - mdata[name] = pdata - mdata[name]['start_year'] = '{}'.format(self.current_year) - mdata[name]['value_yrs'] = ['{}'.format(self.current_year)] - valraw = getattr(self, name) - if isinstance(valraw, np.ndarray): - val = valraw.tolist() - else: - val = valraw - mdata[name]['value'] = val - return mdata + if not self._inflation_rates or not self._wage_growth_rates: + self.set_rates() + if param in self._wage_indexed: + return self.wage_growth_rates(year=label_to_extend_val) + else: + return self.inflation_rates(year=label_to_extend_val) - @staticmethod - def years_in_revision(revision): + def set_rates(self): """ - Return list of years in specified revision dictionary, which is - assumed to have a param:year:value format. + This method is implemented by classes inheriting + Parameters. """ - assert isinstance(revision, dict) - years = list() - for _, paramdata in revision.items(): - assert isinstance(paramdata, dict) - for year, _ in paramdata.items(): - assert isinstance(year, int) - if year not in years: - years.append(year) - return years + raise NotImplementedError() - # ----- begin private methods of Parameters class ----- + def wage_growth_rates(self, year=None): + if year is not None: + return self._wage_growth_rates[year - self.start_year] + return self._wage_growth_rates or [] - def _set_default_vals(self, known_years=999999): - """ - Called by initialize method and from some subclass methods. - """ - # pylint: disable=too-many-branches,too-many-nested-blocks - assert isinstance(known_years, (int, dict)) - if isinstance(known_years, int): - known_years_is_int = True - elif isinstance(known_years, dict): - known_years_is_int = False - for name, data in self._vals.items(): - valtype = data['value_type'] - values = data['value'] - indexed = data.get('indexed', False) - if indexed: - if name in self._wage_indexed: - index_rates = self.wage_growth_rates() - else: - index_rates = self.inflation_rates() - if known_years_is_int: - values = values[:known_years] + def inflation_rates(self, year=None): + if year is not None: + return self._inflation_rates[year - self.start_year] + return self._inflation_rates or [] + + # alias methods below + def initialize(self, start_year, num_years, last_known_year=None, + removed=None, redefined=None, wage_indexed=None, + **kwargs): + """ + Legacy method for initializing a Parameters instance. Projects + should use the __init__ method in the future. + """ + # case where project hasn't been initialized yet. + if getattr(self, "_data", None) is None: + return Parameters.__init__( + self, start_year, num_years, last_known_year=last_known_year, + removed=removed, redefined=redefined, + wage_indexed=wage_indexed, **kwargs + ) + + def _update(self, revision, print_warnings, raise_errors): + """ + A translation layer on top of Parameters.adjust. Projects + that have historically used the `_update` method with + Tax-Calculator styled adjustments can continue to do so + without making any changes to how they handle adjustments. + + Converts reforms that are compatible with Tax-Calculator: + + adjustment = { + "standard_deduction": {2024: [10000.0, 10000.0]}, + "ss_rate": {2024: 0.2} + } + + into reforms that are compatible with ParamTools: + + { + 'standard_deduction': [ + {'year': 2024, 'marital_status': 'single', 'value': 10000.0}, + {'year': 2024, 'marital_status': 'joint', 'value': 10000.0} + ], + 'ss_rate': [{'year': 2024, 'value': 0.2}]} + } + + """ + if not isinstance(revision, dict): + raise pt.ValidationError( + {"errors": {"schema": "Revision must be a dictionary."}}, + None + ) + new_params = defaultdict(list) + for param, val in revision.items(): + if not isinstance(param, str): + msg = f"Parameter {param} is not a string." + raise pt.ValidationError( + {"errors": {"schema": msg}}, + None + ) + if ( + param not in self._data and + param.split("-indexed")[0] not in self._data + ): + if self._removed_params and param in self._removed_params: + msg = f"{param} {self._removed_params[param]}" + elif ( + self._redefined_params and param in self._redefined_params + ): + msg = self._redefined_params[param] else: - values = values[:known_years[name]] - else: - index_rates = None - setattr(self, name, - self._expand_array(values, valtype, - inflate=indexed, - inflation_rates=index_rates, - num_years=self._num_years)) - self.set_year(self._start_year) - - def _update(self, revision_, print_warnings, raise_errors): - """ - Update parameters using specified revision_ dictionary and - leave current_year unchanged. - - Parameters - ---------- - revision_: parameter-changes dictionary in param:year:value format - Each param primary key must be a string; - each year secondary key must be an integer; and - each value item must be either - a real/integer/boolean/string value for a scalar parameter - or - a list of real/integer/boolean/string values for a vector param. - - print_warnings: boolean - if True, prints warnings when parameter_warnings exists; - if False, does not print warnings when parameter_warnings exists - and leaves warning handling to caller of _update method. - - raise_errors: boolean - if True, raises ValueError when parameter_errors exists; - if False, does not raise ValueError when parameter_errors exists - and leaves error handling to caller of _update method. - - Raises - ------ - ValueError: - if revision_ is not a dictionary. - if each revision_ primary key is not a valid parameter name. - if each revision_ secondary key is not an integet. - if minimum year in revision_ is less than current_year. - if maximum year in revision_ is greater than end_year. - if _validate_names_types generates errors - if _validate_values generates errors and raise_errors is True - - Returns - ------- - nothing: void - """ - # pylint: disable=too-many-locals,too-many-branches - # check revisions_ type and whether empty - if not isinstance(revision_, dict): - raise ValueError('ERROR: YYYY PARAM revision_ is not a dictionary') - if not revision_: - return # no revisions provided to update parameters - # convert revision_ to revision with year:param:value format - revision = dict() - for name, namedata in revision_.items(): - if not isinstance(name, str): - msg = 'ERROR: KEY {} is not a string parameter name' - raise ValueError(msg.format(name)) - if not isinstance(namedata, dict): - msg = 'ERROR: KEY {} VAL {} is not a year:value dictionary' - raise ValueError(msg.format(name, namedata)) - for year, yeardata in namedata.items(): - if not isinstance(year, int): - msg = 'ERROR: KEY {} YEAR {} is not an integer year' - raise ValueError(msg.format(name, year)) - if year not in revision: - revision[year] = dict() - revision[year][name] = yeardata - # check range of revision years - revision_years = list(revision.keys()) - first_revision_year = min(revision_years) - if first_revision_year < self.current_year: - msg = 'ERROR: {} YEAR revision provision in YEAR < current_year={}' - raise ValueError(msg.format(first_revision_year, - self.current_year)) - last_revision_year = max(revision_years) - if last_revision_year > self.end_year: - msg = 'ERROR: {} YEAR revision provision in YEAR > end_year={}' - raise ValueError(msg.format(last_revision_year, self.end_year)) - # add leading underscore character to each parameter name in revision - revision = Parameters._add_underscores(revision) - # add brackets around each value element in revision - revision = Parameters._add_brackets(revision) - # validate revision parameter names and types - self.parameter_warnings = '' - self.parameter_errors = '' - self._validate_names_types(revision) - if self.parameter_errors: - raise ValueError(self.parameter_errors) - # optionally apply CPI_offset to inflation_rates and re-initialize - known_years = self._apply_cpi_offset_in_revision(revision) - if known_years is not None: - self._set_default_vals(known_years=known_years) - # implement the revision year by year - precall_current_year = self.current_year - revision_parameters = set() - for year in sorted(revision_years): - self.set_year(year) - revision_parameters.update(revision[year].keys()) - self._update_for_year({year: revision[year]}) - self.set_year(precall_current_year) - # validate revision parameter values - self._validate_values(revision_parameters) - if self.parameter_warnings and print_warnings: - print(self.parameter_warnings) - if self.parameter_errors and raise_errors: - raise ValueError('\n' + self.parameter_errors) - - def _update_for_year(self, year_mods): - """ - Private method used by Parameters._update method. - """ - # pylint: disable=too-many-locals - # check YEAR value in the single YEAR:MODS dictionary parameter - assert isinstance(year_mods, dict) - assert len(year_mods.keys()) == 1 - year = list(year_mods.keys())[0] - assert year == self.current_year - # check that MODS is a dictionary - assert isinstance(year_mods[year], dict) - # implement reform provisions included in the single YEAR:MODS pair - num_years_to_expand = (self.start_year + self.num_years) - year - all_names = set(year_mods[year].keys()) # no duplicate keys in a dict - used_names = set() # set of used parameter names in MODS dict - for name, values in year_mods[year].items(): - # determine indexing status of parameter with name for year - if name.endswith('-indexed'): - continue # handle elsewhere in this method - vals_indexed = self._vals[name].get('indexed', False) - valtype = self._vals[name].get('value_type') - name_plus_indexed = name + '-indexed' - if name_plus_indexed in year_mods[year].keys(): - used_names.add(name_plus_indexed) - indexed = year_mods[year].get(name_plus_indexed) - self._vals[name]['indexed'] = indexed # remember status - else: - indexed = vals_indexed - # set post-reform values of parameter with name - used_names.add(name) - cval = getattr(self, name, None) - wage_indexed_param = name in self._wage_indexed - index_rates = self._indexing_rates_for_update(wage_indexed_param, - year, - num_years_to_expand) - nval = self._expand_array(values, valtype, - inflate=indexed, - inflation_rates=index_rates, - num_years=num_years_to_expand) - cval[(year - self.start_year):] = nval - # handle unused parameter names, all of which end in -indexed, but - # some parameter names ending in -indexed were handled above - unused_names = all_names - used_names - for name in unused_names: - used_names.add(name) - pname = name[:-8] # root parameter name - pindexed = year_mods[year][name] - self._vals[pname]['indexed'] = pindexed # remember status - cval = getattr(self, pname, None) - pvalues = [cval[year - self.start_year]] - wage_indexed_param = pname in self._wage_indexed - index_rates = self._indexing_rates_for_update(wage_indexed_param, - year, - num_years_to_expand) - valtype = self._vals[pname].get('value_type') - nval = self._expand_array(pvalues, valtype, - inflate=pindexed, - inflation_rates=index_rates, - num_years=num_years_to_expand) - cval[(year - self.start_year):] = nval - # confirm that all names have been used - assert len(used_names) == len(all_names) - # implement updated parameters for year - self.set_year(year) - - def _validate_names_types(self, revision): - """ - Check validity of parameter names and parameter types used - in the specified revision dictionary, which is assumed to - have a year:param:value format - """ - # pylint: disable=too-many-branches,too-many-nested-blocks - # pylint: disable=too-many-statements,too-many-locals - assert isinstance(self._vals, dict) - param_names = set(self._vals.keys()) - for year in sorted(revision.keys()): - for name in revision[year]: - if name.endswith('-indexed'): - if isinstance(revision[year][name], bool): - pname = name[:-8] # root parameter name - if pname not in param_names: - if pname in self._removed: - msg = self._removed[pname] - else: - msg = 'is an unknown parameter name' - self.parameter_errors += ( - 'ERROR: {} {} '.format(year, name[1:]) + - msg + '\n' + msg = f"Parameter {param} does not exist." + raise pt.ValidationError( + {"errors": {"schema": msg}}, + None + ) + if param.endswith("-indexed"): + for year, yearval in val.items(): + new_params[param] += [{"year": year, "value": yearval}] + elif isinstance(val, dict): + for year, yearval in val.items(): + val = getattr(self, param) + if ( + self._data[param].get("type", None) == "str" and + isinstance(yearval, str) + ): + new_params[param] += [{"value": yearval}] + continue + + yearval = np.array(yearval) + if ( + getattr(val, "shape", None) and + yearval.shape != val[0].shape + ): + exp_dims = val[0].shape + if exp_dims == tuple(): + msg = ( + f"{param} is not an array " + f"parameter." + ) + elif yearval.shape: + msg = ( + f"{param} has {yearval.shape[0]} elements " + f"but should only have {exp_dims[0]} " + f"elements." ) else: - # check if root parameter is indexable - indexable = self._vals[pname].get('indexable', - False) - if not indexable: - msg = '{} {} parameter is not indexable' - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, pname[1:]) + '\n' - ) - else: - msg = '{} {} parameter is not true or false' - self.parameter_errors += ( - 'ERROR: ' + msg.format(year, name[1:]) + '\n' - ) - else: # if name does not end with '-indexed' - if name not in param_names: - if name in self._removed: - msg = self._removed[name] - else: - msg = 'is an unknown parameter name' - self.parameter_errors += ( - 'ERROR: {} {} '.format(year, name[1:]) + msg + '\n' - ) - else: - # check parameter value type avoiding use of isinstance - # because isinstance(True, (int,float)) is True, which - # makes it impossible to check float parameters - valtype = self._vals[name]['value_type'] - assert isinstance(revision[year][name], list) - pvalue = revision[year][name][0] - if isinstance(pvalue, list): - scalar = False # parameter value is a list - if not self._vals[name].get('vi_vals', []): - msg = ('{} {} with value {} ' - 'should be a scalar parameter') - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, name[1:], pvalue) + - '\n' - ) - # following is not true but is needed to - # avoid errors below - scalar = True - else: - scalar = True # parameter value is a scalar - if self._vals[name].get('vi_vals', []): - msg = ('{} {} with value {} ' - 'should be a vector parameter') - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, name[1:], pvalue) + - '\n' - ) - pvalue = [pvalue] # make scalar a single-item list - # pylint: disable=consider-using-enumerate - for idx in range(0, len(pvalue)): - if scalar: - pname = name - else: - col = self._vals[name]['vi_vals'][idx] - pname = '{}[{}]'.format(name, col) - pval = pvalue[idx] - # pylint: disable=unidiomatic-typecheck - if valtype == 'real': - if type(pval) != float and type(pval) != int: - msg = '{} {} value {} is not a number' - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, pname[1:], pval) + - '\n' - ) - elif valtype == 'boolean': - if type(pval) != bool: - msg = '{} {} value {} is not boolean' - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, pname[1:], pval) + - '\n' - ) - elif valtype == 'integer': - if type(pval) != int: - msg = '{} {} value {} is not integer' - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, pname[1:], pval) + - '\n' - ) - elif valtype == 'string': - if type(pval) != str: - msg = '{} {} value {} is not a string' - self.parameter_errors += ( - 'ERROR: ' + - msg.format(year, pname[1:], pval) + - '\n' - ) - del param_names - - def _validate_values(self, parameters_set): - """ - Check values of parameters in specified parameter_set using - range information from DEFAULTS_FILE_NAME JSON file. - """ - # pylint: disable=too-many-statements,too-many-locals - # pylint: disable=too-many-branches,too-many-nested-blocks - assert isinstance(parameters_set, set) - parameters = sorted(parameters_set) - syr = self.start_year - for pname in parameters: - if pname.endswith('-indexed'): - continue # *-indexed parameter values validated elsewhere - if pname in self._redefined: - msg = self._redefined[pname] - self.parameter_warnings += msg + '\n' - pvalue = getattr(self, pname) - if self._vals[pname]['value_type'] == 'string': - valid_options = self._vals[pname]['valid_values']['options'] - for idx in np.ndindex(pvalue.shape): - if pvalue[idx] not in valid_options: - msg = "{} {} value '{}' not in {}" - fullmsg = '{}: {}\n'.format( - 'ERROR', - msg.format(idx[0] + syr, - pname[1:], - pvalue[idx], - valid_options) + msg = ( + f"{param} is an array parameter with " + f"{exp_dims[0]} elements." + ) + raise pt.ValidationError( + {"errors": {"schema": msg}}, + None ) - self.parameter_errors += fullmsg - else: # parameter does not have string type - for vop, vval in self._vals[pname]['valid_values'].items(): - if isinstance(vval, str): - vvalue = getattr(self, '_' + vval) - else: - vvalue = np.full(pvalue.shape, vval) - assert pvalue.shape == vvalue.shape - assert len(pvalue.shape) <= 2 - if len(pvalue.shape) == 2: - scalar = False # parameter value is a vector - else: - scalar = True # parameter value is a scalar - for idx in np.ndindex(pvalue.shape): - out_of_range = False - if vop == 'min' and pvalue[idx] < vvalue[idx]: - out_of_range = True - msg = '{} {} value {} < min value {}' - extra = self._vals[pname].get('invalid_minmsg', '') - if extra: - msg += ' {}'.format(extra) - if vop == 'max' and pvalue[idx] > vvalue[idx]: - out_of_range = True - msg = '{} {} value {} > max value {}' - extra = self._vals[pname].get('invalid_maxmsg', '') - if extra: - msg += ' {}'.format(extra) - if out_of_range: - action = self._vals[pname].get('invalid_action', - 'stop') - if scalar: - name = pname - else: - col = self._vals[pname]['vi_vals'][idx[1]] - name = '{}[{}]'.format(pname, col) - if extra: - msg += '[{}]'.format(col) - if action == 'warn': - fullmsg = '{}: {}\n'.format( - 'WARNING', - msg.format(idx[0] + syr, - name, - pvalue[idx], - vvalue[idx]) - ) - self.parameter_warnings += fullmsg - if action == 'stop': - fullmsg = '{}: {}\n'.format( - 'ERROR', - msg.format(idx[0] + syr, - name[1:], - pvalue[idx], - vvalue[idx]) - ) - self.parameter_errors += fullmsg - del parameters - - STRING_DTYPE = 'U16' - - @staticmethod - def _expand_array(xxx, xxx_type, inflate, inflation_rates, num_years): - """ - Private method called only within this abstract base class. - Dispatch to either _expand_1d or _expand_2d given dimension of xxx. - - Parameters - ---------- - xxx : value to expand - xxx must be either a scalar list or a 1D numpy array, or - xxx must be either a list of scalar lists or a 2D numpy array - - xxx_type : string ('real', 'boolean', 'integer', 'string') - - inflate: boolean - As we expand, inflate values if this is True, otherwise, just copy - - inflation_rates: list of inflation rates - Annual decimal inflation rates - num_years: int - Number of budget years to expand + value_objects = self.from_array( + param, + yearval.reshape((1, *yearval.shape)), + year=year + ) + new_params[param] += value_objects + else: + msg = ( + f"{param} must be a year:value dictionary " + f"if you are not using the new adjust method." + ) + raise pt.ValidationError( + {"errors": {"schema": msg}}, + None + ) + return self.adjust( + new_params, + print_warnings=print_warnings, + raise_errors=raise_errors + ) - Returns - ------- - expanded numpy array with specified type - """ - assert isinstance(xxx, (list, np.ndarray)) - if isinstance(xxx, list): - if xxx_type == 'real': - xxx = np.array(xxx, np.float64) - elif xxx_type == 'boolean': - xxx = np.array(xxx, np.bool_) - elif xxx_type == 'integer': - xxx = np.array(xxx, np.int16) - elif xxx_type == 'string': - xxx = np.array(xxx, np.dtype(Parameters.STRING_DTYPE)) - assert len(xxx.shape) == 1, \ - 'string parameters must be scalar (not vector)' - dim = len(xxx.shape) - assert dim in (1, 2) - if dim == 1: - return Parameters._expand_1d(xxx, inflate, inflation_rates, - num_years) - return Parameters._expand_2d(xxx, inflate, inflation_rates, - num_years) + def set_year(self, year): + self.set_state(year=year) - @staticmethod - def _expand_1d(xxx, inflate, inflation_rates, num_years): - """ - Private method called only from _expand_array method. - Expand the given data xxx to account for given number of budget years. - If necessary, pad out additional years by increasing the last given - year using the given inflation_rates list. - """ - if not isinstance(xxx, np.ndarray): - raise ValueError('_expand_1d expects xxx to be a numpy array') - if len(xxx) >= num_years: - return xxx - string_type = xxx.dtype == Parameters.STRING_DTYPE - if string_type: - ans = np.array(['' for i in range(0, num_years)], - dtype=xxx.dtype) - else: - ans = np.zeros(num_years, dtype=xxx.dtype) - ans[:len(xxx)] = xxx - if string_type: - extra = [str(xxx[-1]) for i in - range(1, num_years - len(xxx) + 1)] - else: - if inflate: - extra = [] - cur = xxx[-1] - for i in range(0, num_years - len(xxx)): - cur *= (1. + inflation_rates[i + len(xxx) - 1]) - cur = round(cur, 2) if cur < 9e99 else 9e99 - extra.append(cur) - else: - extra = [float(xxx[-1]) for i in - range(1, num_years - len(xxx) + 1)] - ans[len(xxx):] = extra - return ans + @property + def current_year(self): + return self.label_grid["year"][0] - @staticmethod - def _expand_2d(xxx, inflate, inflation_rates, num_years): - """ - Private method called only from _expand_array method. - Expand the given data to account for the given number of budget years. - For 2D arrays, we expand out the number of rows until we have num_years - number of rows. For each expanded row, we inflate using the given - inflation rates list. - """ - if not isinstance(xxx, np.ndarray): - raise ValueError('_expand_2d expects xxx to be a numpy array') - if xxx.shape[0] >= num_years: - return xxx - ans = np.zeros((num_years, xxx.shape[1]), dtype=xxx.dtype) - ans[:len(xxx), :] = xxx - for i in range(xxx.shape[0], ans.shape[0]): - for j in range(ans.shape[1]): - if inflate: - cur = (ans[i - 1, j] * - (1. + inflation_rates[i - 1])) - cur = round(cur, 2) if cur < 9e99 else 9e99 - ans[i, j] = cur - else: - ans[i, j] = ans[i - 1, j] - return ans + @property + def start_year(self): + return self._stateless_label_grid["year"][0] - def _indexing_rates_for_update(self, param_is_wage_indexed, - calyear, num_years_to_expand): - """ - Private method called only by the private Parameter._update method. - """ - if param_is_wage_indexed: - rates = self.wage_growth_rates() - else: - rates = self.inflation_rates() - if rates: - expanded_rates = [rates[(calyear - self.start_year) + i] - for i in range(0, num_years_to_expand)] - return expanded_rates - return None + @property + def end_year(self): + return self._stateless_label_grid["year"][-1] - @staticmethod - def _add_underscores(update_dict): - """ - Returns dictionary that adds leading underscore character to - each parameter name in specified update_dict, which is assumed - to have a year:param:value format. - """ - updict = dict() - for year, yeardata in update_dict.items(): - updict[year] = dict() - for pname, pvalue in yeardata.items(): - updict[year]['_' + pname] = pvalue - return updict + @property + def num_years(self): + return self.end_year - self.start_year + 1 - @staticmethod - def _add_brackets(update_dict): - """ - Returns dictionary that adds brackets around each - data element (value) in specified update_dict, which - is assumed to have a year:param:value format. - """ - updict = dict() - for year, yeardata in update_dict.items(): - updict[year] = dict() - for pname, pvalue in yeardata.items(): - if pname.endswith('-indexed'): - updict[year][pname] = pvalue # no added brackets - else: - updict[year][pname] = [pvalue] - return updict + @property + def parameter_warnings(self): + return self.errors or "" - def _apply_cpi_offset_to_inflation_rates(self): - """ - Called from Parameters.initialize method. - Does nothing if CPI_offset parameter is not in self._vals dictionary. - """ - if '_CPI_offset' not in self._vals: - return - nyrs = self.num_years - ovalues = self._vals['_CPI_offset']['value'] - if len(ovalues) < nyrs: # extrapolate last known value - ovalues = ovalues + ovalues[-1:] * (nyrs - len(ovalues)) - for idx in range(0, nyrs): - infrate = round(self._inflation_rates[idx] + ovalues[idx], 6) - self._inflation_rates[idx] = infrate - - def _apply_cpi_offset_in_revision(self, revision): - """ - Apply CPI offset to inflation rates and - revert indexed parameter values in preparation for re-indexing. - Also, return known_years which is dictionary with indexed policy - parameter names as keys and known_years as values. For indexed - parameters included in revision, the known_years value is equal to: - (first_cpi_offset_year - start_year + 1). For indexed parameters - not included in revision, the known_years value is equal to: - (max(first_cpi_offset_year, last_known_year) - start_year + 1). - """ - # pylint: disable=too-many-branches - # determine if CPI_offset is in specified revision; if not, return - cpi_offset_in_revision = False - for year in revision: - for name in revision[year]: - if name == '_CPI_offset': - cpi_offset_in_revision = True - break # out of loop - if not cpi_offset_in_revision: - return None - # extrapolate CPI_offset revision - self.set_year(self.start_year) - first_cpi_offset_year = 0 - for year in sorted(revision.keys()): - self.set_year(year) - if '_CPI_offset' in revision[year]: - if first_cpi_offset_year == 0: - first_cpi_offset_year = year - orevision = {'_CPI_offset': revision[year]['_CPI_offset']} - self._update_for_year({year: orevision}) - self.set_year(self.start_year) - assert first_cpi_offset_year > 0 - # adjust inflation rates - cpi_offset = getattr(self, '_CPI_offset') - first_cpi_offset_ix = first_cpi_offset_year - self.start_year - for idx in range(first_cpi_offset_ix, self.num_years): - infrate = round(self._inflation_rates[idx] + cpi_offset[idx], 6) - self._inflation_rates[idx] = infrate - # revert indexed parameter values to policy_current_law.json values - for name in self._vals.keys(): - if self._vals[name]['indexed']: - setattr(self, name, self._vals[name]['value']) - # construct and return known_years dictionary - known_years = dict() - kyrs_in_revision = (first_cpi_offset_year - self.start_year + 1) - kyrs_not_in_revision = ( - max(first_cpi_offset_year, self.last_known_year) - - self.start_year + 1 - ) - for year in sorted(revision.keys()): - for name in revision[year]: - if name.endswith('-indexed'): - name = name[:-8] - if self._vals[name]['indexed']: - if name not in known_years: - known_years[name] = kyrs_in_revision - for name in self._vals.keys(): - if self._vals[name]['indexed']: - if name not in known_years: - known_years[name] = kyrs_not_in_revision - return known_years + @property + def parameter_errors(self): + return self.errors or "" @staticmethod def _read_json_revision(obj, topkey): @@ -865,12 +581,10 @@ def _read_json_revision(obj, topkey): Read JSON revision specified by obj and topkey returning a single revision dictionary suitable for use with the Parameters._update method. - The obj function argument can be None or a string, where the string contains a local filename, a URL beginning with 'http' pointing to a valid JSON file hosted online, or valid JSON text. - The topkey argument must be a string containing the top-level key in a compound-revision JSON text for which a revision dictionary is returned. If the specified topkey is not among @@ -927,3 +641,37 @@ def convert_year_to_int(syr_dict): single_dict = full_dict # convert string year to integer year in dictionary and return return convert_year_to_int(single_dict) + + def metadata(self): + return self.specification(meta_data=True, use_state=False) + + @staticmethod + def years_in_revision(revision): + """ + Return list of years in specified revision dictionary, which is + assumed to have a param:year:value format. + """ + assert isinstance(revision, dict) + years = list() + for _, paramdata in revision.items(): + assert isinstance(paramdata, dict) + for year, _ in paramdata.items(): + assert isinstance(year, int) + if year not in years: + years.append(year) + return years + + def __getattr__(self, attr): + """ + Allows the user to get the value of a parameter over all years, + not just the ones that are active. + """ + if ( + attr.startswith("_") and + attr[1:] in super().__getattribute__("_data") + ): + return self.to_array( + attr[1:], year=list(range(self.start_year, self.end_year + 1)) + ) + else: + raise AttributeError(f"{attr} not definied.") diff --git a/taxcalc/policy.py b/taxcalc/policy.py index 96da0e8df..d2a7a9d18 100644 --- a/taxcalc/policy.py +++ b/taxcalc/policy.py @@ -6,6 +6,8 @@ # pylint --disable=locally-disabled policy.py import os +import json +import numpy as np from taxcalc.parameters import Parameters from taxcalc.growfactors import GrowFactors @@ -45,39 +47,31 @@ class instance: Policy # (1) specify which Policy parameters have been removed or renamed REMOVED_PARAMS = { # following five parameters removed in PR 2223 merged on 2019-02-06 - '_DependentCredit_Child_c': 'is a removed parameter name', - '_DependentCredit_Nonchild_c': 'is a removed parameter name', - '_DependentCredit_before_CTC': 'is a removed parameter name', - '_FilerCredit_c': 'is a removed parameter name', - '_ALD_InvInc_ec_base_RyanBrady': 'is a removed parameter name', + 'DependentCredit_Child_c': 'is a removed parameter name', + 'DependentCredit_Nonchild_c': 'is a removed parameter name', + 'DependentCredit_before_CTC': 'is a removed parameter name', + 'FilerCredit_c': 'is a removed parameter name', + 'ALD_InvInc_ec_base_RyanBrady': 'is a removed parameter name', # TODO: following parameter renamed in PR 2292 merged on 2019-04-15 - '_cpi_offset': 'was renamed CPI_offset in release 2.0.0', + 'cpi_offset': 'was renamed CPI_offset in release 2.0.0', # TODO: following parameters renamed in PR 2345 merged on 2019-06-24 - '_PT_excl_rt': + 'PT_excl_rt': 'was renamed PT_qbid_rt in release 2.4.0', - '_PT_excl_wagelim_thd': + 'PT_excl_wagelim_thd': 'was renamed PT_qbid_taxinc_thd in release 2.4.0', - '_PT_excl_wagelim_prt': + 'PT_excl_wagelim_prt': 'was renamed PT_qbid_taxinc_gap in release 2.4.0', - '_PT_excl_wagelim_rt': + 'PT_excl_wagelim_rt': 'was renamed PT_qbid_w2_wages_rt in release 2.4.0' } # (2) specify which Policy parameters have been redefined recently - REDEFINED_PARAMS = { - # TODO: remove the CTC_c name:message pair sometime later in 2019 - '_CTC_c': 'CTC_c was redefined in release 1.0.0' - } + REDEFINED_PARAMS = {} # (3) specify which Policy parameters are wage (rather than price) indexed - WAGE_INDEXED_PARAMS = [ - '_SS_Earnings_c', - '_SS_Earnings_thd' - ] + WAGE_INDEXED_PARAMS = ['SS_Earnings_c', 'SS_Earnings_thd'] - def __init__(self, gfactors=None, only_reading_defaults=False): + def __init__(self, gfactors=None, only_reading_defaults=False, **kwargs): # put JSON contents of DEFAULTS_FILE_NAME into self._vals dictionary super().__init__() - if only_reading_defaults: - return # handle gfactors argument if gfactors is None: self._gfactors = GrowFactors() @@ -89,24 +83,12 @@ def __init__(self, gfactors=None, only_reading_defaults=False): syr = Policy.JSON_START_YEAR lyr = Policy.LAST_BUDGET_YEAR nyrs = Policy.DEFAULT_NUM_YEARS - self._inflation_rates = self._gfactors.price_inflation_rates(syr, lyr) - self._wage_growth_rates = self._gfactors.wage_growth_rates(syr, lyr) + self._inflation_rates = None + self._wage_growth_rates = None self.initialize(syr, nyrs, Policy.LAST_KNOWN_YEAR, Policy.REMOVED_PARAMS, Policy.REDEFINED_PARAMS, - Policy.WAGE_INDEXED_PARAMS) - - def inflation_rates(self): - """ - Returns list of price inflation rates starting with JSON_START_YEAR. - """ - return self._inflation_rates - - def wage_growth_rates(self): - """ - Returns list of wage growth rates starting with JSON_START_YEAR. - """ - return self._wage_growth_rates + Policy.WAGE_INDEXED_PARAMS, **kwargs) @staticmethod def read_json_reform(obj): @@ -121,18 +103,49 @@ def read_json_reform(obj): def implement_reform(self, reform, print_warnings=True, raise_errors=True): """ - Implement specified policy reform and leave current_year unchanged. - See Parameters._update for argument documentation and details about - the expected structure of the reform dictionary. + Implement reform using Tax-Calculator syled reforms/adjustments. Users + may also use the adjust method with ParamTools styled reforms. """ - self._update(reform, print_warnings, raise_errors) + # need to do conversion: + return self._update(reform, print_warnings, raise_errors) @staticmethod def parameter_list(): """ Returns list of parameter names in the policy_current_law.json file. """ - policy = Policy(only_reading_defaults=True) - plist = list(policy._vals.keys()) # pylint: disable=protected-access - del policy - return plist + path = os.path.join( + Policy.DEFAULTS_FILE_PATH, + Policy.DEFAULTS_FILE_NAME + ) + with open(path) as f: + defaults = json.loads(f.read()) # pylint: disable=protected-access + return [k for k in defaults if k != "schema"] + + def set_rates(self): + """Initialize taxcalc indexing data.""" + cpi_vals = [vo["value"] for vo in self._data["CPI_offset"]["value"]] + # extend cpi_offset values through budget window if they + # have not been extended already. + cpi_vals = cpi_vals + cpi_vals[-1:] * ( + self.end_year - self.start_year + 1 - len(cpi_vals) + ) + cpi_offset = { + (self.start_year + ix): val + for ix, val in enumerate(cpi_vals) + } + + self._gfactors = GrowFactors() + + self._inflation_rates = [ + np.round(rate + cpi_offset[self.start_year + ix], 4) + for ix, rate in enumerate( + self._gfactors.price_inflation_rates( + self.start_year, self.end_year + ) + ) + ] + + self._wage_growth_rates = self._gfactors.wage_growth_rates( + self.start_year, self.end_year + ) diff --git a/taxcalc/policy_current_law.json b/taxcalc/policy_current_law.json index 55f57baf8..c97c13502 100644 --- a/taxcalc/policy_current_law.json +++ b/taxcalc/policy_current_law.json @@ -1,6689 +1,16729 @@ { + "schema": { + "labels": { + "year": { + "type": "int", + "validators": { + "range": { + "min": 2013, + "max": 2030 + } + } + }, + "MARS": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "single", + "mjoint", + "mseparate", + "headhh", + "widow" + ] + } + } + }, + "idedtype": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "med", + "sltx", + "retx", + "cas", + "misc", + "int", + "char" + ] + } + } + }, + "EIC": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "0kids", + "1kid", + "2kids", + "3+kids" + ] + } + } + } + }, + "additional_members": { + "section_1": { + "type": "str" + }, + "section_2": { + "type": "str" + }, + "start_year": { + "type": "int" + }, + "indexable": { + "type": "bool" + }, + "indexed": { + "type": "bool" + }, + "compatible_data": { + "type": "compatible_data" + } + } + }, "CPI_offset": { - "long_name": "Decimal offset ADDED to unchained CPI to get parameter indexing rate", + "title": "Decimal offset ADDED to unchained CPI to get parameter indexing rate", "description": "Values are zero before 2017; reforms that introduce indexing with chained CPI would have values around -0.0025 beginning in the year before the first year policy parameters will have values computed with chained CPI.", + "notes": "See April 2013 CBO report entitled 'What Would Be the Effect on the Deficit of Using the Chained CPI to Index Benefit Programs and the Tax Code?', which includes this: 'The chained CPI grows more slowly than the traditional CPI does: an average of about 0.25 percentage points more slowly per year over the past decade.' ", "section_1": "Parameter Indexing", "section_2": "Offsets", - "irs_ref": "", - "notes": "See April 2013 CBO report entitled 'What Would Be the Effect on the Deficit of Using the Chained CPI to Index Benefit Programs and the Tax Code?', which includes this: 'The chained CPI grows more slowly than the traditional CPI does: an average of about 0.25 percentage points more slowly per year over the past decade.' ", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - -0.0025], - "valid_values": {"min": -0.005, "max": 0.005}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": -0.0025 + } + ], + "validators": { + "range": { + "min": -0.005, + "max": 0.005 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "FICA_ss_trt": { - "long_name": "Social Security payroll tax rate", + "title": "Social Security payroll tax rate", "description": "Social Security FICA rate, including both employer and employee.", + "notes": "", "section_1": "Payroll Taxes", "section_2": "Social Security FICA", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.124], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.124 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "SS_Earnings_c": { - "long_name": "Maximum taxable earnings (MTE) for Social Security", + "title": "Maximum taxable earnings (MTE) for Social Security", "description": "Individual earnings below this amount are subjected to Social Security (OASDI) payroll tax.", + "notes": "This parameter is indexed by the rate of growth in average wages, not by the price inflation rate.", "section_1": "Payroll Taxes", "section_2": "Social Security FICA", - "irs_ref": "W-2, Box 4, instructions", - "notes": "This parameter is indexed by the rate of growth in average wages, not by the price inflation rate.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [113700.0, - 117000.0, - 118500.0, - 118500.0, - 127200.0, - 128400.0, - 132900.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 113700.0 + }, + { + "year": 2014, + "value": 117000.0 + }, + { + "year": 2015, + "value": 118500.0 + }, + { + "year": 2016, + "value": 118500.0 + }, + { + "year": 2017, + "value": 127200.0 + }, + { + "year": 2018, + "value": 128400.0 + }, + { + "year": 2019, + "value": 132900.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "SS_Earnings_thd": { - "long_name": "Additional Taxable Earnings Threshold for Social Security", + "title": "Additional Taxable Earnings Threshold for Social Security", "description": "Individual earnings above this threshold are subjected to Social Security (OASDI) payroll tax, in addition to earnings below the maximum taxable earnings threshold.", + "notes": "", "section_1": "Payroll Taxes", "section_2": "Social Security FICA", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [9e99], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "FICA_mc_trt": { - "long_name": "Medicare payroll tax rate", + "title": "Medicare payroll tax rate", "description": "Medicare FICA rate, including both employer and employee.", + "notes": "", "section_1": "Payroll Taxes", "section_2": "Medicare FICA", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.029], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.029 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMEDT_ec": { - "long_name": "Additional Medicare tax earnings exclusion", + "title": "Additional Medicare tax earnings exclusion", "description": "The Additional Medicare Tax rate, AMEDT_rt, applies to all earnings in excess of this excluded amount.", + "notes": "", "section_1": "Payroll Taxes", "section_2": "Additional Medicare FICA", - "irs_ref": "Form 8959, line 5, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[200000.0, 250000.0, 125000.0, 200000.0, 200000.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 250000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 125000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 200000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMEDT_rt": { - "long_name": "Additional Medicare tax rate", + "title": "Additional Medicare tax rate", "description": "This is the rate applied to the portion of Medicare wages, RRTA compensation and self-employment income exceeding the Additional Medicare Tax earning exclusion.", + "notes": "", "section_1": "Payroll Taxes", "section_2": "Additional Medicare FICA", - "irs_ref": "Form 8959, line 7, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.009], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.009 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "SS_thd50": { - "long_name": "Threshold for Social Security benefit taxability 1", + "title": "Threshold for Social Security benefit taxability 1", "description": "The first threshold for Social Security benefit taxability: if taxpayers have provisional income greater than this threshold, up to 50% of their Social Security benefit will be subject to tax under current law.", + "notes": "", "section_1": "Social Security Taxability", "section_2": "Threshold For Social Security Benefit Taxability 1", - "irs_ref": "Form 1040, line 5a&b, calculation (Worksheet, line 8)", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[25000.0, 32000.0, 25000.0, 25000.0, 25000.0]], - "valid_values": {"min": 0, "max": "SS_thd85"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for SS_thd85", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 25000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 32000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 25000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 25000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 25000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "SS_thd85" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "SS_percentage1": { - "long_name": "Social Security taxable income decimal fraction 1", + "title": "Social Security taxable income decimal fraction 1", "description": "Under current law if their provisional income is above the first threshold for Social Security taxability but below the second threshold, taxpayers need to apply this fraction to both the excess of their provisional income over the first threshold and their Social Security benefits, and then include the smaller one in their AGI.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 1040, line 5b, instructions (Social Security Worksheets, line 2 & 13)", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.5], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.5 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "SS_thd85": { - "long_name": "Threshold for Social Security benefit taxability 2", + "title": "Threshold for Social Security benefit taxability 2", "description": "The second threshold for Social Security taxability: if taxpayers have provisional income greater than this threshold, up to 85% of their Social Security benefit will be subject to tax under current law.", + "notes": "", "section_1": "Social Security Taxability", "section_2": "Threshold For Social Security Benefit Taxability 2", - "irs_ref": "Form 1040, line 5a&b, calculation (Worksheet, add line 10 values to line 8).", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[34000.0, 44000.0, 34000.0, 34000.0, 34000.0]], - "valid_values": {"min": "SS_thd50", "max": 9e99}, - "invalid_minmsg": "for SS_thd50", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 34000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 44000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 34000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 34000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 34000.0 + } + ], + "validators": { + "range": { + "min": "SS_thd50", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "SS_percentage2": { - "long_name": "Social Security taxable income decimal fraction 2", + "title": "Social Security taxable income decimal fraction 2", "description": "Under current law if their provisional income is above the second threshold for Social Security taxability, taxpayers need to apply this fraction to both the excess of their provisional income over the second threshold and their social security benefits, and then include the smaller one in their AGI.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 1040, line 5b, instructions (Social Security Worksheets, line 15)", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.85], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.85 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_StudentLoan_hc": { - "long_name": "Adjustment for student loan interest haircut", + "title": "Adjustment for student loan interest haircut", "description": "This decimal fraction can be applied to limit the student loan interest adjustment allowed.", + "notes": "The final adjustment amount will be (1-Haircut)*StudentLoanInterest.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 1), line 33", - "notes": "The final adjustment amount will be (1-Haircut)*StudentLoanInterest.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_SelfEmploymentTax_hc": { - "long_name": "Adjustment for self-employment tax haircut", + "title": "Adjustment for self-employment tax haircut", "description": "This decimal fraction, if greater than zero, reduces the employer equivalent portion of self-employment adjustment.", + "notes": "The final adjustment amount would be (1-Haircut)*SelfEmploymentTaxAdjustment.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 4), line 57", - "notes": "The final adjustment amount would be (1-Haircut)*SelfEmploymentTaxAdjustment.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_SelfEmp_HealthIns_hc": { - "long_name": "Adjustment for self employed health insurance haircut", + "title": "Adjustment for self employed health insurance haircut", "description": "This decimal fraction, if greater than zero, reduces the health insurance adjustment for self-employed taxpayers.", + "notes": "The final adjustment amount would be (1-Haircut)*SelfEmployedHealthInsuranceAdjustment.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 4), line 61", - "notes": "The final adjustment amount would be (1-Haircut)*SelfEmployedHealthInsuranceAdjustment.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_KEOGH_SEP_hc": { - "long_name": "Adjustment for contributions to either KEOGH or SEP plan haircut", + "title": "Adjustment for contributions to either KEOGH or SEP plan haircut", "description": "Under current law, contributions to Keogh or SEP plans can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.", + "notes": "The final adjustment amount is (1-Haircut)*KEOGH_SEP_Contributinos.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 1), line 28", - "notes": "The final adjustment amount is (1-Haircut)*KEOGH_SEP_Contributinos.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_EarlyWithdraw_hc": { - "long_name": "Adjustment for early withdrawal penalty haircut", + "title": "Adjustment for early withdrawal penalty haircut", "description": "Under current law, early withdraw penalty can be fully deducted from gross income. This haircut can be used to limit the adjustment allowed.", + "notes": "The final adjustment amount is (1-Haircut)*EarlyWithdrawPenalty.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 1), line 30", - "notes": "The final adjustment amount is (1-Haircut)*EarlyWithdrawPenalty.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "ALD_AlimonyPaid_hc": { - "long_name": "Adjustment for alimony-paid haircut", + "title": "Adjustment for alimony-paid haircut", "description": "Under pre-TCJA law, the full amount of alimony paid is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.", + "notes": "The final adjustment amount would be (1-Haircut)*AlimonyPaid.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 1), line 31", - "notes": "The final adjustment amount would be (1-Haircut)*AlimonyPaid.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 1.0 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ALD_AlimonyReceived_hc": { - "long_name": "Adjustment for alimony-received haircut", + "title": "Adjustment for alimony-received haircut", "description": "Under pre-TCJA law, none of alimony received is taken as an adjustment from gross income in arriving at AGI. This haircut can be used to change the deduction allowed.", + "notes": "The final adjustment amount would be (1-Haircut)*AlimonyReceived.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "Form 1040 (Schedule 1), line 11 (new with TCJA)", - "notes": "The final adjustment amount would be (1-Haircut)*AlimonyReceived.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + }, + { + "year": 2014, + "value": 1.0 + }, + { + "year": 2015, + "value": 1.0 + }, + { + "year": 2016, + "value": 1.0 + }, + { + "year": 2017, + "value": 1.0 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 0.0 + }, + { + "year": 2026, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ALD_EducatorExpenses_hc": { - "long_name": "Deduction for educator expenses haircut", + "title": "Deduction for educator expenses haircut", "description": "If greater than zero, this decimal fraction reduces the portion of educator expenses that can be deducted from AGI.", + "notes": "The final adjustment amount would be (1-Haircut)*EducatorExpenses.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "", - "notes": "The final adjustment amount would be (1-Haircut)*EducatorExpenses.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "ALD_HSADeduction_hc": { - "long_name": "Deduction for HSA deduction haircut", + "title": "Deduction for HSA deduction haircut", "description": "If greater than zero, this decimal fraction reduces the portion of a taxpayer's HSA deduction that can be deducted from AGI.", + "notes": "The final adjustment amount would be (1-Haircut)*HSA_Deduction.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "", - "notes": "The final adjustment amount would be (1-Haircut)*HSA_Deduction.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "ALD_IRAContributions_hc": { - "long_name": "Deduction for IRA contributions haircut", + "title": "Deduction for IRA contributions haircut", "description": "If greater than zero, this decimal fraction reduces the portion of IRA contributions that can be deducted from AGI.", + "notes": "The final adjustment amount would be (1-Haircut)*IRA_Contribution.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "", - "notes": "The final adjustment amount would be (1-Haircut)*IRA_Contribution.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_DomesticProduction_hc": { - "long_name": "Deduction for domestic production activity haircut", + "title": "Deduction for domestic production activity haircut", "description": "If greater than zero, this decimal fraction reduces the portion of domestic production activity that can be deducted from AGI.", + "notes": "The final adjustment amount would be (1-Haircut)*DomesticProductionActivity.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "", - "notes": "The final adjustment amount would be (1-Haircut)*DomesticProductionActivity.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 1.0 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ALD_Tuition_hc": { - "long_name": "Deduction for tuition and fees haircut", + "title": "Deduction for tuition and fees haircut", "description": "If greater than zero, this decimal fraction reduces the portion of tuition and fees that can be deducted from AGI.", + "notes": "The final adjustment amount would be (1-Haircut)*TuitionFees.", "section_1": "Above The Line Deductions", "section_2": "Misc. Adjustment Haircuts", - "irs_ref": "", - "notes": "The final adjustment amount would be (1-Haircut)*TuitionFees.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ALD_InvInc_ec_rt": { - "long_name": "Investment income exclusion rate haircut", + "title": "Investment income exclusion rate haircut", "description": "Decimal fraction of investment income base that can be excluded from AGI.", + "notes": "The final taxable investment income will be (1-_ALD_InvInc_ec_rt)*investment_income_base. Even though the excluded portion of investment income is not included in AGI, it still is included in investment income used to calculate the Net Investment Income Tax and Earned Income Tax Credit.", "section_1": "Above The Line Deductions", "section_2": "Misc. Exclusions", - "irs_ref": "Form 1040, line 2a", - "notes": "The final taxable investment income will be (1-_ALD_InvInc_ec_rt)*investment_income_base. Even though the excluded portion of investment income is not included in AGI, it still is included in investment income used to calculate the Net Investment Income Tax and Earned Income Tax Credit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_Dependents_hc": { - "long_name": "Deduction for childcare costs haircut", + "title": "Deduction for childcare costs haircut", "description": "This decimal fraction, if greater than zero, reduces the portion of childcare costs that can be deducted from AGI.", + "notes": "The final adjustment would be (1-Haircut)*AverageChildcareCosts.", "section_1": "Above The Line Deductions", "section_2": "Child And Elderly Care", - "irs_ref": "", - "notes": "The final adjustment would be (1-Haircut)*AverageChildcareCosts.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ALD_Dependents_Child_c": { - "long_name": "National average childcare costs: ceiling for available childcare deduction.", + "title": "National average childcare costs: ceiling for available childcare deduction.", "description": "The weighted average of childcare costs in the US. 7165 is the weighted average from the 'Child Care in America: 2016 State Fact Sheets'.", + "notes": "This is a weighted average of childcare costs in each state", "section_1": "Above The Line Deductions", "section_2": "Child And Elderly Care", - "irs_ref": "", - "notes": "This is a weighted average of childcare costs in each state", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ALD_Dependents_Elder_c": { - "long_name": "Ceiling for elderly care deduction proposed in Trump's tax plan", + "title": "Ceiling for elderly care deduction proposed in Trump's tax plan", "description": "A taxpayer can take an above the line deduction up to this amount if they have an elderly dependent. The Trump 2016 campaign proposal was for $5000.", + "notes": "", "section_1": "Above The Line Deductions", "section_2": "Child And Elderly Care", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ALD_Dependents_thd": { - "long_name": "Maximum level of income to qualify for the dependent care deduction", + "title": "Maximum level of income to qualify for the dependent care deduction", "description": "A taxpayer can only claim the dependent care deduction if their total income is below this level. The Trump 2016 campaign proposal was for 250000 single, 500000 joint, 250000 separate, 500000 head of household].", + "notes": "", "section_1": "Above The Line Deductions", "section_2": "Child And Elderly Care", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ALD_BusinessLosses_c": { - "long_name": "Maximum amount of business losses deductible", + "title": "Maximum amount of business losses deductible", "description": "Business losses in excess of this amount may not be deducted from AGI.", + "notes": "", "section_1": "Above The Line Deductions", "section_2": "Misc. Exclusions", - "irs_ref": "Form 461, line 15, in-line", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [250000.0, 500000.0, 250000.0, 250000.0, 500000.0], - [255000.0, 510000.0, 255000.0, 255000.0, 510000.0], - [259029.0, 518058.0, 259029.0, 259029.0, 518058.0], - [264675.83, 529351.66, 264675.83, 264675.83, 529351.66], - [270683.97, 541367.95, 270683.97, 270683.97, 541367.95], - [276936.77, 553873.55, 276936.77, 276936.77, 553873.55], - [283084.77, 566169.54, 283084.77, 283084.77, 566169.54], - [289199.4, 578398.8, 289199.4, 289199.4, 578398.8], - [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 250000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 250000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 250000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 500000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 255000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 510000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 255000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 255000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 510000.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_em": { - "long_name": "Personal and dependent exemption amount", + "title": "Personal and dependent exemption amount", "description": "Subtracted from AGI in the calculation of taxable income, per taxpayer and dependent.", + "notes": "", "section_1": "Personal Exemptions", "section_2": "Personal And Dependent Exemption Amount", - "irs_ref": "Form 1040, line 42. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [3900.00, - 3950.00, - 4000.00, - 4050.00, - 4050.00, - 0.00, - 0.00, - 0.00, - 0.00, - 0.00, - 0.00, - 0.00, - 0.00, - 4880.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 3900.0 + }, + { + "year": 2014, + "value": 3950.0 + }, + { + "year": 2015, + "value": 4000.0 + }, + { + "year": 2016, + "value": 4050.0 + }, + { + "year": 2017, + "value": 4050.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + }, + { + "year": 2026, + "value": 4880.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_em_ps": { - "long_name": "Personal exemption phaseout starting income", + "title": "Personal exemption phaseout starting income", "description": "If taxpayers' AGI is above this level, their personal exemption will start to decrease at the personal exemption phaseout rate (PEP provision).", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 1040, line 42, instruction (Worksheet).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[250000.0, 300000.0, 150000.0, 275000.0, 300000.0], - [254200.0, 305050.0, 152525.0, 279650.0, 305050.0], - [258250.0, 309900.0, 154950.0, 284040.0, 309900.0], - [259400.0, 311300.0, 155650.0, 285350.0, 311300.0], - [261500.0, 313800.0, 156900.0, 287650.0, 313800.0], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [316457.0, 379748.0, 189874.0, 348102.0, 379748.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 250000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 300000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 150000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 275000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 300000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 254200.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 305050.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 152525.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 279650.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 305050.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 258250.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 309900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 154950.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 284040.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 309900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 259400.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 311300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 155650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 285350.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 311300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 261500.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 313800.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 156900.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 287650.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 313800.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "single", + "value": 316457.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 379748.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 189874.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 348102.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 379748.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_prt": { - "long_name": "Personal exemption phaseout rate", + "title": "Personal exemption phaseout rate", "description": "Personal exemption amount will decrease by this rate for each dollar of AGI exceeding exemption phaseout start.", + "notes": "", "section_1": "Personal Exemptions", "section_2": "Personal Exemption Phaseout Rate", - "irs_ref": "Form 1040, line 42, instruction (Worksheet).", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.02], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.02 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "II_no_em_nu18": { - "long_name": "Repeal personal exemptions for dependents under age 18", + "title": "Repeal personal exemptions for dependents under age 18", "description": "Total personal exemptions will be decreased by the number of dependents under the age of 18.", + "notes": "", "section_1": "Personal Exemptions", "section_2": "Repeal for Dependents Under Age 18", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "STD": { - "long_name": "Standard deduction amount", + "title": "Standard deduction amount", "description": "Amount filing unit can use as a standard deduction.", + "notes": "", "section_1": "Standard Deduction", "section_2": "Standard Deduction Amount", - "irs_ref": "Form 1040, line 8, instructions. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[6100.00, 12200.00, 6100.00, 8950.00, 12200.00], - [6200.00, 12400.00, 6200.00, 9100.00, 12400.00], - [6300.00, 12600.00, 6300.00, 9250.00, 12600.00], - [6300.00, 12600.00, 6300.00, 9300.00, 12600.00], - [6350.00, 12700.00, 6350.00, 9350.00, 12700.00], - [12000.0, 24000.0, 12000.0, 18000.0, 24000.0], - [12200.0, 24400.0, 12200.0, 18350.0, 24400.0], - [12392.76, 24785.52, 12392.76, 18639.93, 24785.52], - [12662.92, 25325.84, 12662.92, 19046.28, 25325.84], - [12950.37, 25900.74, 12950.37, 19478.63, 25900.74], - [13249.52, 26499.05, 13249.52, 19928.59, 26499.05], - [13543.66, 27087.33, 13543.66, 20371.0, 27087.33], - [13836.21, 27672.41, 13836.21, 20811.02, 27672.41], - [7651.0, 15303.0, 7651.0, 11266.0, 15303.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 6100.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 12200.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 6100.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 8950.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 12200.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 6200.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 12400.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 6200.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9100.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 12400.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 6300.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 12600.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 6300.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9250.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 12600.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 6300.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 12600.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 6300.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9300.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 12600.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 6350.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 12700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 6350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9350.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 12700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 12000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 24000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 12000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 18000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 24000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 12200.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 24400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 12200.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 18350.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 24400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 7651.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 15303.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 7651.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 11266.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 15303.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "STD_Dep": { - "long_name": "Standard deduction for dependents", + "title": "Standard deduction for dependents", "description": "This is the maximum standard deduction for dependents.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 1040, line 8, instructions. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1000.0, - 1000.0, - 1050.0, - 1050.0, - 1050.0, - 1050.0, - 1100.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 1000.0 + }, + { + "year": 2014, + "value": 1000.0 + }, + { + "year": 2015, + "value": 1050.0 + }, + { + "year": 2016, + "value": 1050.0 + }, + { + "year": 2017, + "value": 1050.0 + }, + { + "year": 2018, + "value": 1050.0 + }, + { + "year": 2019, + "value": 1100.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "STD_Aged": { - "long_name": "Additional standard deduction for blind and aged", + "title": "Additional standard deduction for blind and aged", "description": "To get the standard deduction for aged or blind individuals, taxpayers need to add this value to regular standard deduction.", + "notes": "", "section_1": "Standard Deduction", "section_2": "Additional Standard Deduction For Blind And Aged", - "irs_ref": "Form 1040, line 8, calculation (the difference of the two tables given in the instruction).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[1500.0, 1200.0, 1200.0, 1500.0, 1500.0], - [1550.0, 1200.0, 1200.0, 1550.0, 1550.0], - [1550.0, 1250.0, 1250.0, 1550.0, 1550.0], - [1550.0, 1250.0, 1250.0, 1550.0, 1550.0], - [1550.0, 1250.0, 1250.0, 1550.0, 1550.0], - [1600.0, 1300.0, 1300.0, 1600.0, 1300.0], - [1650.0, 1300.0, 1300.0, 1650.0, 1300.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 1500.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 1200.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 1200.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 1500.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 1500.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 1550.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 1200.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 1200.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 1550.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 1550.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 1550.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 1250.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 1250.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 1550.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 1550.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 1550.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 1250.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 1250.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 1550.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 1550.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 1550.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 1250.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 1250.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 1550.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 1550.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 1600.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 1300.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 1300.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 1600.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 1300.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 1650.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 1300.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 1300.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 1650.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 1300.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "STD_allow_charity_ded_nonitemizers": { - "long_name": "Allow standard deduction filers to take the charitable contributions deduction", + "title": "Allow standard deduction filers to take the charitable contributions deduction", "description": "Extends the charitable contributions deduction to taxpayers who take the standard deduction. The same ceilings, floor, and haircuts applied to itemized deduction for charitable contributions also apply here.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "II_credit": { - "long_name": "Personal refundable credit maximum amount", + "title": "Personal refundable credit maximum amount", "description": "This credit amount is fully refundable and is phased out based on AGI. It is available to tax units who would otherwise not file.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Personal Refundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_credit_ps": { - "long_name": "Personal refundable credit phaseout start", + "title": "Personal refundable credit phaseout start", "description": "The personal refundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Personal Refundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_credit_prt": { - "long_name": "Personal refundable credit phaseout rate", + "title": "Personal refundable credit phaseout rate", "description": "The personal refundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_ps threshold.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Personal Refundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "II_credit_nr": { - "long_name": "Personal nonrefundable credit maximum amount", + "title": "Personal nonrefundable credit maximum amount", "description": "This credit amount is not refundable and is phased out based on AGI.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Personal Nonrefundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_credit_nr_ps": { - "long_name": "Personal nonrefundable credit phaseout start", + "title": "Personal nonrefundable credit phaseout start", "description": "The personal nonrefundable credit amount will be reduced for taxpayers with AGI higher than this threshold level.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Personal Nonrefundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_credit_nr_prt": { - "long_name": "Personal nonrefundable credit phaseout rate", + "title": "Personal nonrefundable credit phaseout rate", "description": "The personal nonrefundable credit amount will be reduced at this rate for each dollar of AGI exceeding the II_credit_nr_ps threshold.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Personal Nonrefundable Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Medical_frt": { - "long_name": "Floor (as a decimal fraction of AGI) for deductible medical expenses.", + "title": "Floor (as a decimal fraction of AGI) for deductible medical expenses.", "description": "Taxpayers are eligible to deduct the portion of their medical expenses exceeding this fraction of AGI.", + "notes": "When using PUF data, lowering this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.", "section_1": "Itemized Deductions", "section_2": "Medical Expenses", - "irs_ref": "Form 1040 Schedule A, line 3, in-line. ", - "notes": "When using PUF data, lowering this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.100, - 0.100, - 0.100, - 0.100, - 0.075, - 0.075, - 0.075], - "valid_values": {"min": 0.075, "max": 0.100}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "warn", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.1 + }, + { + "year": 2014, + "value": 0.1 + }, + { + "year": 2015, + "value": 0.1 + }, + { + "year": 2016, + "value": 0.1 + }, + { + "year": 2017, + "value": 0.075 + }, + { + "year": 2018, + "value": 0.075 + }, + { + "year": 2019, + "value": 0.075 + } + ], + "validators": { + "range": { + "min": 0.075, + "max": 0.1, + "level": "warn" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Medical_frt_add4aged": { - "long_name": "Addon floor (as a decimal fraction of AGI) for deductible medical expenses for elderly filing units.", + "title": "Addon floor (as a decimal fraction of AGI) for deductible medical expenses for elderly filing units.", "description": "Elderly taxpayers have this fraction added to the value of the regular floor rate for deductible medical expenses. This fraction was -0.025 from 2013 to 2016, but that was temporary and it changed to zero beginning in 2017.", + "notes": "When using PUF data, changing this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.", "section_1": "Itemized Deductions", "section_2": "Medical Expenses", - "irs_ref": "Form 1040 Schedule A, line 3, in-line. ", - "notes": "When using PUF data, changing this parameter value may produce unexpected results because PUF e17500 variable is zero below the floor.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [-0.025, - -0.025, - -0.025, - -0.025, - 0.0], - "valid_values": {"min": -0.025, "max": 0.0}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "warn", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": -0.025 + }, + { + "year": 2014, + "value": -0.025 + }, + { + "year": 2015, + "value": -0.025 + }, + { + "year": 2016, + "value": -0.025 + }, + { + "year": 2017, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -0.025, + "max": 0.0, + "level": "warn" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Medical_hc": { - "long_name": "Medical expense deduction haircut", + "title": "Medical expense deduction haircut", "description": "This decimal fraction can be applied to limit the amount of medical expense deduction allowed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Medical Expenses", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Medical_c": { - "long_name": "Ceiling on the amount of medical expense deduction allowed (dollars)", + "title": "Ceiling on the amount of medical expense deduction allowed (dollars)", "description": "The amount of medical expense deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Medical Expenses", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_StateLocalTax_hc": { - "long_name": "State and local income and sales taxes deduction haircut.", + "title": "State and local income and sales taxes deduction haircut.", "description": "This decimal fraction reduces the state and local income and sales tax deduction.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State And Local Income And Sales Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_StateLocalTax_crt": { - "long_name": "Ceiling (as a decimal fraction of AGI) for the combination of all state and local income and sales tax deductions.", + "title": "Ceiling (as a decimal fraction of AGI) for the combination of all state and local income and sales tax deductions.", "description": "The total deduction for state and local taxes is capped at this fraction of AGI.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State And Local Income And Sales Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [9e99], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_StateLocalTax_c": { - "long_name": "Ceiling on the amount of state and local income and sales taxes deduction allowed (dollars)", + "title": "Ceiling on the amount of state and local income and sales taxes deduction allowed (dollars)", "description": "The amount of state and local income and sales taxes deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State And Local Income And Sales Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_RealEstate_hc": { - "long_name": "State, local, and foreign real estate taxes deduction haircut.", + "title": "State, local, and foreign real estate taxes deduction haircut.", "description": "This decimal fraction reduces real estate taxes paid eligible to deduct in itemized deduction.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State, Local, And Foreign Real Estate Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_RealEstate_crt": { - "long_name": "Ceiling (as a decimal fraction of AGI) for the combination of all state, local, and foreign real estate tax deductions.", + "title": "Ceiling (as a decimal fraction of AGI) for the combination of all state, local, and foreign real estate tax deductions.", "description": "The total deduction for all real estate taxes is capped at this fraction of AGI.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State, Local, And Foreign Real Estate Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [9e99], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_RealEstate_c": { - "long_name": "Ceiling on the amount of state, local, and foreign real estate taxes deduction allowed (dollars)", + "title": "Ceiling on the amount of state, local, and foreign real estate taxes deduction allowed (dollars)", "description": "The amount of real estate taxes deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State, Local, And Foreign Real Estate Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_AllTaxes_hc": { - "long_name": "State and local income, sales, and real estate tax deduction haircut.", + "title": "State and local income, sales, and real estate tax deduction haircut.", "description": "This decimal fraction reduces all state and local taxes paid eligible to deduct in itemized deduction.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State And Local Taxes And Real Estate Taxes", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_AllTaxes_c": { - "long_name": "Ceiling on the amount of state and local income, sales and real estate tax deductions allowed (dollars)", + "title": "Ceiling on the amount of state and local income, sales and real estate tax deductions allowed (dollars)", "description": "The amount of state and local income, sales and real estate tax deductions is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "State And Local Taxes And Real Estate Taxes", - "irs_ref": "Form 1040 Schedule A, line 5e, in-line.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [10000.0, 10000.0, 5000.0, 10000.0, 10000.0], - [9e+99, 9e+99, 9e+99, 9e+99, 9e+99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 10000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 10000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 5000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 10000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 10000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 10000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 10000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 5000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 10000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 10000.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_InterestPaid_hc": { - "long_name": "Interest paid deduction haircut", + "title": "Interest paid deduction haircut", "description": "This decimal fraction can be applied to limit the amount of interest paid deduction allowed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Interest Paid", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_InterestPaid_c": { - "long_name": "Ceiling on the amount of interest paid deduction allowed (dollars)", + "title": "Ceiling on the amount of interest paid deduction allowed (dollars)", "description": "The amount of interest paid deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Interest Paid", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Charity_crt_all": { - "long_name": "Ceiling (as a decimal fraction of AGI) for all charitable contribution deductions", + "title": "Ceiling (as a decimal fraction of AGI) for all charitable contribution deductions", "description": "The total deduction for charity is capped at this fraction of AGI.", + "notes": "When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "Pub. 526, Limits on Deductions: 50% Limit Organizations. ", - "notes": "When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.6, - 0.6, - 0.6, - 0.6, - 0.6, - 0.6, - 0.6, - 0.6, - 0.5], - "valid_values": {"min": 0, "max": 0.6}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "warn", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.5 + }, + { + "year": 2014, + "value": 0.5 + }, + { + "year": 2015, + "value": 0.5 + }, + { + "year": 2016, + "value": 0.5 + }, + { + "year": 2017, + "value": 0.5 + }, + { + "year": 2018, + "value": 0.6 + }, + { + "year": 2019, + "value": 0.6 + }, + { + "year": 2026, + "value": 0.5 + } + ], + "validators": { + "range": { + "min": 0, + "max": 0.6, + "level": "warn" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Charity_crt_noncash": { - "long_name": "Ceiling (as a decimal fraction of AGI) for noncash charitable contribution deductions", + "title": "Ceiling (as a decimal fraction of AGI) for noncash charitable contribution deductions", "description": "The deduction for noncash charity contributions is capped at this fraction of AGI.", + "notes": "When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "Pub 526, Limits on Deductions: Special 30% Limit for Capital Gain Property. ", - "notes": "When using PUF data, raising this parameter value may produce unexpected results because in PUF data the variables e19800 and e20100 are already capped.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.3], - "valid_values": {"min": 0, "max": 0.3}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "warn", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.3 + } + ], + "validators": { + "range": { + "min": 0, + "max": 0.3, + "level": "warn" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Charity_frt": { - "long_name": "Floor (as a decimal fraction of AGI) for deductible charitable contributions.", + "title": "Floor (as a decimal fraction of AGI) for deductible charitable contributions.", "description": "Taxpayers are eligible to deduct the portion of their charitable expense exceeding this fraction of AGI.", + "notes": "This parameter allows for implementation of Option 52 from https://www.cbo.gov/sites/default/files/cbofiles/attachments/49638-BudgetOptions.pdf.", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "", - "notes": "This parameter allows for implementation of Option 52 from https://www.cbo.gov/sites/default/files/cbofiles/attachments/49638-BudgetOptions.pdf.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Charity_hc": { - "long_name": "Charity expense deduction haircut", + "title": "Charity expense deduction haircut", "description": "This decimal fraction can be applied to limit the amount of charity expense deduction allowed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Charity_c": { - "long_name": "Ceiling on the amount of charity expense deduction allowed (dollars)", + "title": "Ceiling on the amount of charity expense deduction allowed (dollars)", "description": "The amount of charity expense deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Charity_f": { - "long_name": "Floor on the amount of charity expense deduction allowed (dollars)", + "title": "Floor on the amount of charity expense deduction allowed (dollars)", "description": "Only charitable giving in excess of this dollar amount is eligible for a deduction.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Charity", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Casualty_frt": { - "long_name": "Floor (as a decimal fraction of AGI) for deductible casualty loss.", + "title": "Floor (as a decimal fraction of AGI) for deductible casualty loss.", "description": "Taxpayers are eligible to deduct the portion of their gross casualty losses exceeding this fraction of AGI.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Casualty", - "irs_ref": "Form 4684, line 17, in-line.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.1], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.1 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "ID_Casualty_hc": { - "long_name": "Casualty expense deduction haircut", + "title": "Casualty expense deduction haircut", "description": "This decimal fraction can be applied to limit the amount of casualty expense deduction allowed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Casualty", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 1.0 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ID_Casualty_c": { - "long_name": "Ceiling on the amount of casualty expense deduction allowed (dollars)", + "title": "Ceiling on the amount of casualty expense deduction allowed (dollars)", "description": "The amount of casualty expense deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Casualty", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ID_Miscellaneous_frt": { - "long_name": "Floor (as a decimal fraction of AGI) for deductible miscellaneous expenses.", + "title": "Floor (as a decimal fraction of AGI) for deductible miscellaneous expenses.", "description": "Taxpayers are eligible to deduct the portion of their miscellaneous expense exceeding this fraction of AGI.", + "notes": "When using PUF data, lowering this parameter value may produce unexpected results because in PUF data the variable e20400 is zero below the floor.", "section_1": "Itemized Deductions", "section_2": "Miscellaneous", - "irs_ref": "Form 1040 Schedule A, line 16, instructions. ", - "notes": "When using PUF data, lowering this parameter value may produce unexpected results because in PUF data the variable e20400 is zero below the floor.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.02], - "valid_values": {"min": 0.02, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "warn", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.02 + } + ], + "validators": { + "range": { + "min": 0.02, + "max": 1, + "level": "warn" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_Miscellaneous_hc": { - "long_name": "Miscellaneous expense deduction haircut", + "title": "Miscellaneous expense deduction haircut", "description": "This decimal fraction can be applied to limit the amount of miscellaneous expense deduction allowed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Miscellaneous", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 1.0 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_Miscellaneous_c": { - "long_name": "Ceiling on the amount of miscellaneous expense deduction allowed (dollars)", + "title": "Ceiling on the amount of miscellaneous expense deduction allowed (dollars)", "description": "The amount of miscellaneous expense deduction is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Miscellaneous", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_ps": { - "long_name": "Itemized deduction phaseout AGI start (Pease provision)", + "title": "Itemized deduction phaseout AGI start (Pease provision)", "description": "The itemized deductions will be reduced for taxpayers with AGI higher than this level.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Itemized Deduction Limitation", - "irs_ref": "Form 1040 Schedule A, line 29, instructions.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[250000.0, 300000.0, 150000.0, 275000.0, 300000.0], - [254200.0, 305050.0, 152525.0, 279650.0, 305050.0], - [258250.0, 309900.0, 154950.0, 284050.0, 309900.0], - [259400.0, 311300.0, 155650.0, 285350.0, 311300.0], - [261500.0, 313800.0, 156900.0, 287650.0, 313800.0], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [315093.0, 378112.0, 189056.0, 346603.0, 378112.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 250000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 300000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 150000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 275000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 300000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 254200.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 305050.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 152525.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 279650.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 305050.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 258250.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 309900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 154950.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 284050.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 309900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 259400.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 311300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 155650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 285350.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 311300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 261500.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 313800.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 156900.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 287650.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 313800.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "single", + "value": 315093.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 378112.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 189056.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 346603.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 378112.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_prt": { - "long_name": "Itemized deduction phaseout rate (Pease provision)", + "title": "Itemized deduction phaseout rate (Pease provision)", "description": "Taxpayers will not be eligible to deduct the full amount of itemized deduction if their AGI is above the phaseout start. The deductible portion would be decreased at this rate for each dollar exceeding the start.", + "notes": "This phaseout rate cannot be lower than 0.03 for each dollar, due to limited data on non-itemizers.", "section_1": "Itemized Deductions", "section_2": "Itemized Deduction Limitation", - "irs_ref": "Schedule A, line 29, instructions. ", - "notes": "This phaseout rate cannot be lower than 0.03 for each dollar, due to limited data on non-itemizers.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.03, - 0.03, - 0.03, - 0.03, - 0.03, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.03], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.03 + }, + { + "year": 2014, + "value": 0.03 + }, + { + "year": 2015, + "value": 0.03 + }, + { + "year": 2016, + "value": 0.03 + }, + { + "year": 2017, + "value": 0.03 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + }, + { + "year": 2026, + "value": 0.03 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_crt": { - "long_name": "Itemized deduction maximum phaseout as a decimal fraction of total itemized deductions (Pease provision)", + "title": "Itemized deduction maximum phaseout as a decimal fraction of total itemized deductions (Pease provision)", "description": "The phaseout amount is capped at this fraction of the original total deduction.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Itemized Deduction Limitation", - "irs_ref": "Form 1040 Schedule A, line 17, instructions. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.8, - 0.8, - 0.8, - 0.8, - 0.8, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 1.0, - 0.8], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.8 + }, + { + "year": 2014, + "value": 0.8 + }, + { + "year": 2015, + "value": 0.8 + }, + { + "year": 2016, + "value": 0.8 + }, + { + "year": 2017, + "value": 0.8 + }, + { + "year": 2018, + "value": 1.0 + }, + { + "year": 2019, + "value": 1.0 + }, + { + "year": 2026, + "value": 0.8 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_BenefitSurtax_trt": { - "long_name": "Surtax rate on the benefits from specified itemized deductions", + "title": "Surtax rate on the benefits from specified itemized deductions", "description": "The benefit from specified itemized deductions exceeding the credit is taxed at this rate. A surtax rate of 1 strictly limits the benefit from specified itemized deductions to the specified credit. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Surtax On Itemized Deduction Benefits Above An AGI Threshold", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_BenefitSurtax_crt": { - "long_name": "Credit on itemized deduction benefit surtax (decimal fraction of AGI)", + "title": "Credit on itemized deduction benefit surtax (decimal fraction of AGI)", "description": "The surtax on specified itemized deductions applies to benefits in excess of this fraction of AGI. In http://www.nber.org/papers/w16921, Feldstein, Feenberg, and MacGuineas propose a credit of 2% of AGI against a 100% tax rate; in their proposal, however, a broader set of tax benefits, including the employer provided health exclusion, would be taxed.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Surtax On Itemized Deduction Benefits Above An AGI Threshold", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_BenefitSurtax_em": { - "long_name": "Exemption for itemized deduction benefit surtax (dollar AGI threshold)", + "title": "Exemption for itemized deduction benefit surtax (dollar AGI threshold)", "description": "This amount is subtracted from itemized deduction benefits in the calculation of the itemized deduction benefit surtax. With ID_BenefitSurtax_crt set to 0.0 and ID_BenefitSurtax_trt set to 1.0, this amount serves as a dollar limit on the value of itemized deductions.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Surtax On Itemized Deduction Benefits Above An AGI Threshold", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_BenefitSurtax_Switch": { - "long_name": "Deductions subject to the surtax on itemized deduction benefits", + "title": "Deductions subject to the surtax on itemized deduction benefits", "description": "The surtax on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Surtax On Itemized Deduction Benefits Above An AGI Threshold", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "idedtype", - "vi_vals": ["med", "sltx", "retx", "cas", "misc", "int", "char"], - "value_type": "boolean", - "value": [[true, true, true, true, true, true, true]], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "idedtype": "med", + "value": true + }, + { + "year": 2013, + "idedtype": "sltx", + "value": true + }, + { + "year": 2013, + "idedtype": "retx", + "value": true + }, + { + "year": 2013, + "idedtype": "cas", + "value": true + }, + { + "year": 2013, + "idedtype": "misc", + "value": true + }, + { + "year": 2013, + "idedtype": "int", + "value": true + }, + { + "year": 2013, + "idedtype": "char", + "value": true + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_BenefitCap_rt": { - "long_name": "Ceiling on the benefits from itemized deductions; decimal fraction of total deductible expenses", + "title": "Ceiling on the benefits from itemized deductions; decimal fraction of total deductible expenses", "description": "The benefit from specified itemized deductions is capped at this percent of the total deductible expenses.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_BenefitCap_Switch": { - "long_name": "Deductions subject to the cap on itemized deduction benefits", + "title": "Deductions subject to the cap on itemized deduction benefits", "description": "The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Ceiling On The Benefit Of Itemized Deductions As A Percent Of Deductible Expenses", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "idedtype", - "vi_vals": ["med", "sltx", "retx", "cas", "misc", "int", "char"], - "value_type": "boolean", - "value": [[true, true, true, true, true, true, true]], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "idedtype": "med", + "value": true + }, + { + "year": 2013, + "idedtype": "sltx", + "value": true + }, + { + "year": 2013, + "idedtype": "retx", + "value": true + }, + { + "year": 2013, + "idedtype": "cas", + "value": true + }, + { + "year": 2013, + "idedtype": "misc", + "value": true + }, + { + "year": 2013, + "idedtype": "int", + "value": true + }, + { + "year": 2013, + "idedtype": "char", + "value": true + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_c": { - "long_name": "Ceiling on the amount of itemized deductions allowed (dollars)", + "title": "Ceiling on the amount of itemized deductions allowed (dollars)", "description": "The amount of itemized deductions is limited to this dollar amount.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Ceiling On The Amount Of Itemized Deductions Allowed", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ID_AmountCap_rt": { - "long_name": "Ceiling on the gross amount of itemized deductions allowed; decimal fraction of AGI", + "title": "Ceiling on the gross amount of itemized deductions allowed; decimal fraction of AGI", "description": "The gross allowable amount of specified itemized deductions is capped at this percent of AGI.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Ceiling On The Amount Of Itemized Deductions Allowed", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [9e99], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ID_AmountCap_Switch": { - "long_name": "Deductions subject to the cap on itemized deduction benefits", + "title": "Deductions subject to the cap on itemized deduction benefits", "description": "The cap on itemized deduction benefits applies to the benefits derived from the itemized deductions specified with this parameter.", + "notes": "", "section_1": "Itemized Deductions", "section_2": "Ceiling On The Amount Of Itemized Deductions Allowed", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "idedtype", - "vi_vals": ["med", "sltx", "retx", "cas", "misc", "int", "char"], - "value_type": "boolean", - "value": [[true, true, true, true, true, true, true]], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "idedtype": "med", + "value": true + }, + { + "year": 2013, + "idedtype": "sltx", + "value": true + }, + { + "year": 2013, + "idedtype": "retx", + "value": true + }, + { + "year": 2013, + "idedtype": "cas", + "value": true + }, + { + "year": 2013, + "idedtype": "misc", + "value": true + }, + { + "year": 2013, + "idedtype": "int", + "value": true + }, + { + "year": 2013, + "idedtype": "char", + "value": true + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CG_rt1": { - "long_name": "Long term capital gain and qualified dividends (regular/non-AMT) rate 1", + "title": "Long term capital gain and qualified dividends (regular/non-AMT) rate 1", "description": "The capital gain and dividends (stacked on top of regular income) that are below threshold 1 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 20, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CG_brk1": { - "long_name": "Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 1", + "title": "Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 1", "description": "The gains and dividends (stacked on top of regular income) below this are taxed at capital gain rate 1.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 15, in-line. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[36250.0, 72500.0, 36250.0, 48600.0, 72500.0], - [36900.0, 73800.0, 36900.0, 49400.0, 73800.0], - [37450.0, 74900.0, 37450.0, 50200.0, 74900.0], - [37650.0, 75300.0, 37650.0, 50400.0, 75300.0], - [37950.0, 75900.0, 37950.0, 50800.0, 75900.0], - [38600.0, 77200.0, 38600.0, 51700.0, 77200.0], - [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]], - "valid_values": {"min": 0, "max": "CG_brk2"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for CG_brk2", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 72500.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 48600.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 72500.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 73800.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 49400.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 73800.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 74900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 50200.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 74900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 75300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 50400.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 75300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 75900.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 50800.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 75900.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 38600.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 77200.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 38600.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 51700.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 77200.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 39375.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 78750.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 39375.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 52750.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 78750.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "CG_brk2" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CG_rt2": { - "long_name": "Long term capital gain and qualified dividends (regular/non-AMT) rate 2", + "title": "Long term capital gain and qualified dividends (regular/non-AMT) rate 2", "description": "The capital gain and dividends (stacked on top of regular income) that are below threshold 2 and above threshold 1 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 29, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.15], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.15 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CG_brk2": { - "long_name": "Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 2", + "title": "Top of long-term capital gains and qualified dividends (regular/non-AMT) tax bracket 2", "description": "The gains and dividends (stacked on top of regular income) below this and above top of bracket 1 are taxed at capital gain rate 2.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 24, in-line. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[400000.0, 450000.0, 225000.0, 425000.0, 450000.0], - [406750.0, 457600.0, 228800.0, 432200.0, 457600.0], - [413200.0, 464850.0, 232425.0, 439000.0, 464850.0], - [415050.0, 466950.0, 233475.0, 441000.0, 466950.0], - [418400.0, 470700.0, 235350.0, 444550.0, 470700.0], - [425800.0, 479000.0, 239500.0, 452400.0, 479000.0], - [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]], - "valid_values": {"min": "CG_brk1", "max": "CG_brk3"}, - "invalid_minmsg": "for CG_brk1", - "invalid_maxmsg": "for CG_brk3", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 400000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 450000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 225000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 425000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 450000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 406750.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 457600.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 228800.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 432200.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 457600.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 413200.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 464850.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 232425.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 439000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 464850.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 415050.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 466950.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 233475.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 441000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 466950.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 418400.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 470700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 235350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 444550.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 470700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 425800.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 479000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 239500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 452400.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 479000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 434550.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 488850.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 244425.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 461700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 488850.0 + } + ], + "validators": { + "range": { + "min": "CG_brk1", + "max": "CG_brk3" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CG_rt3": { - "long_name": "Long term capital gain and qualified dividends (regular/non-AMT) rate 3", + "title": "Long term capital gain and qualified dividends (regular/non-AMT) rate 3", "description": "The capital gain and dividends (stacked on top of regular income) that are above threshold 2 and below threshold 3 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 32, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.20], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.2 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CG_brk3": { - "long_name": "Top of long-term capital gains and qualified dividend tax (regular/non-AMT) bracket 3", + "title": "Top of long-term capital gains and qualified dividend tax (regular/non-AMT) bracket 3", "description": "The gains and dividends (stacked on top of regular income) below this and above top of bracket 2 are taxed at the capital gain rate 3; above this they are taxed at capital gain rate 4. Default value is essentially infinity.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 1040 Schedule D tax worksheet, line 24, in-line. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": "CG_brk2", "max": 9e99}, - "invalid_minmsg": "for CG_brk2", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": "CG_brk2", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CG_rt4": { - "long_name": "Long term capital gain and qualified dividends (regular/non-AMT) rate 4", + "title": "Long term capital gain and qualified dividends (regular/non-AMT) rate 4", "description": "The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Regular - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_CG_rt1": { - "long_name": "Long term capital gain and qualified dividends (AMT) rate 1", + "title": "Long term capital gain and qualified dividends (AMT) rate 1", "description": "Capital gain and qualified dividends (stacked on top of regular income) below threshold 1 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 6251, line 47, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_CG_brk1": { - "long_name": "Top of long-term capital gains and qualified dividends (AMT) tax bracket 1", + "title": "Top of long-term capital gains and qualified dividends (AMT) tax bracket 1", "description": "The gains and dividends, stacked last, of AMT taxable income below this are taxed at AMT capital gain rate 1.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 6251, line 19, in-line. ", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[36250.0, 72500.0, 36250.0, 48600.0, 72500.0], - [36900.0, 73800.0, 36900.0, 49400.0, 73800.0], - [37450.0, 74900.0, 37450.0, 50200.0, 74900.0], - [37650.0, 75300.0, 37650.0, 50400.0, 75300.0], - [37950.0, 75900.0, 37950.0, 50800.0, 75900.0], - [38600.0, 77200.0, 38600.0, 51700.0, 77200.0], - [39375.0, 78750.0, 39375.0, 52750.0, 78750.0]], - "valid_values": {"min": 0, "max": "AMT_CG_brk2"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for AMT_CG_brk2", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 72500.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 48600.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 72500.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 73800.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 49400.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 73800.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 74900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 50200.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 74900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 75300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 50400.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 75300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 75900.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 50800.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 75900.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 38600.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 77200.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 38600.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 51700.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 77200.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 39375.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 78750.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 39375.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 52750.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 78750.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "AMT_CG_brk2" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_CG_rt2": { - "long_name": "Long term capital gain and qualified dividends (AMT) rate 2", - "section_1": "Capital Gains And Dividends", - "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", + "title": "Long term capital gain and qualified dividends (AMT) rate 2", "description": "Capital gain and qualified dividend (stacked on top of regular income) below threshold 2 and above threshold 1 are taxed at this rate.", - "irs_ref": "Form 6251, line 31, in-line. ", "notes": "", - "value_yrs": [2013], + "section_1": "Capital Gains And Dividends", + "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.15], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.15 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_CG_brk2": { - "long_name": "Top of long-term capital gains and qualified dividends (AMT) tax bracket 2", + "title": "Top of long-term capital gains and qualified dividends (AMT) tax bracket 2", "description": "The gains and dividends, stacked last, of AMT taxable income below this threshold and above bracket 1 are taxed at AMT capital gain rate 2.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "notes": "", - "irs_ref": "Form 6251, line 25, in-line. ", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[400000.0, 450000.0, 225000.0, 425000.0, 450000.0], - [406750.0, 457600.0, 228800.0, 432200.0, 457600.0], - [413200.0, 464850.0, 232425.0, 439000.0, 464850.0], - [415050.0, 466950.0, 233475.0, 441000.0, 466950.0], - [418400.0, 470700.0, 235350.0, 444550.0, 470700.0], - [425800.0, 479000.0, 239500.0, 452400.0, 479000.0], - [434550.0, 488850.0, 244425.0, 461700.0, 488850.0]], - "valid_values": {"min": "AMT_CG_brk1", "max": "AMT_CG_brk3"}, - "invalid_minmsg": "for AMT_CG_brk1", - "invalid_maxmsg": "for AMT_CG_brk3", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 400000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 450000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 225000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 425000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 450000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 406750.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 457600.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 228800.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 432200.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 457600.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 413200.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 464850.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 232425.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 439000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 464850.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 415050.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 466950.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 233475.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 441000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 466950.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 418400.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 470700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 235350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 444550.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 470700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 425800.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 479000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 239500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 452400.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 479000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 434550.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 488850.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 244425.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 461700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 488850.0 + } + ], + "validators": { + "range": { + "min": "AMT_CG_brk1", + "max": "AMT_CG_brk3" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_CG_rt3": { - "long_name": "Long term capital gain and qualified dividends (AMT) rate 3", + "title": "Long term capital gain and qualified dividends (AMT) rate 3", "description": "The capital gain and qualified dividend (stacked on top of regular income) above threshold 2 and below threshold 3 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "Form 6251, line 34, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.20], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.2 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_CG_brk3": { - "long_name": "Long term capital gain and qualified dividends (AMT) threshold 3", + "title": "Long term capital gain and qualified dividends (AMT) threshold 3", "description": "The gains and dividends, stacked last, of AMT taxable income below this and above bracket 2 are taxed at capital gain rate 3; above thisthey are taxed at AMT capital gain rate 4. Default value is essentially infinity.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": "AMT_CG_brk2", "max": 9e99}, - "invalid_minmsg": "for AMT_CG_brk2", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": "AMT_CG_brk2", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_CG_rt4": { - "long_name": "Long term capital gain and qualified dividends (AMT) rate 4", + "title": "Long term capital gain and qualified dividends (AMT) rate 4", "description": "The capital gain and dividends (stacked on top of regular income) that are above threshold 3 are taxed at this rate.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "AMT - Long Term Capital Gains And Qualified Dividends", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CG_nodiff": { - "long_name": "Long term capital gains and qualified dividends taxed no differently than regular taxable income", + "title": "Long term capital gains and qualified dividends taxed no differently than regular taxable income", "description": "Specifies whether or not long term capital gains and qualified dividends are taxed like regular taxable income.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Tax All Capital Gains And Dividends The Same As Regular Taxable Income", - "irs_ref": "Current-law value is zero implying different tax treatment in Schedule D and AMT; a value of one implies same tax treatment in both regular and alternative minimum tax rules, but the same treatment can differ for regular and AMT.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CG_ec": { - "long_name": "Dollar amount of all capital gains and qualified dividends that are excluded from AGI.", + "title": "Dollar amount of all capital gains and qualified dividends that are excluded from AGI.", "description": "Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Tax All Capital Gains And Dividends The Same As Regular Taxable Income", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CG_reinvest_ec_rt": { - "long_name": "Fraction of all capital gains and qualified dividends in excess of the dollar exclusion that are excluded from AGI.", + "title": "Fraction of all capital gains and qualified dividends in excess of the dollar exclusion that are excluded from AGI.", "description": "Positive value used only if long term capital gains and qualified dividends taxed no differently than regular taxable income. To limit the exclusion to capital gains and dividends invested within one year, set to statutory exclusion rate times the fraction of capital gains and qualified dividends in excess of the exclusion that are assumed to be reinvested within the year.", + "notes": "", "section_1": "Capital Gains And Dividends", "section_2": "Tax All Capital Gains And Dividends The Same As Regular Taxable Income", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "II_rt1": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 1", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 1", "description": "The lowest tax rate, applied to the portion of taxable income below tax bracket 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.1 + }, + { + "year": 2014, + "value": 0.1 + }, + { + "year": 2015, + "value": 0.1 + }, + { + "year": 2016, + "value": 0.1 + }, + { + "year": 2017, + "value": 0.1 + }, + { + "year": 2018, + "value": 0.1 + }, + { + "year": 2019, + "value": 0.1 + }, + { + "year": 2026, + "value": 0.1 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk1": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 1", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 1", "description": "Taxable income below this threshold is taxed at tax rate 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 44, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[8925.00, 17850.00, 8925.00, 12750.00, 17850.00], - [9075.00, 18150.00, 9075.00, 12950.00, 18150.00], - [9225.00, 18450.00, 9225.00, 13150.00, 18450.00], - [9275.00, 18550.00, 9275.00, 13250.00, 18550.00], - [9325.00, 18650.00, 9325.00, 13350.00, 18650.00], - [9525.0, 19050.0, 9525.0, 13600.0, 19050.0], - [9700.0, 19400.0, 9700.0, 13850.0, 19400.0], - [9853.26, 19706.52, 9853.26, 14068.83, 19706.52], - [10068.06, 20136.12, 10068.06, 14375.53, 20136.12], - [10296.61, 20593.21, 10296.61, 14701.86, 20593.21], - [10534.46, 21068.92, 10534.46, 15041.47, 21068.92], - [10768.32, 21536.65, 10768.32, 15375.39, 21536.65], - [11000.92, 22001.84, 11000.92, 15707.5, 22001.84], - [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]], - "valid_values": {"min": 0, "max": "II_brk2"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for II_brk2", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 8925.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 17850.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 8925.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 12750.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 17850.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 9075.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 18150.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9075.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 12950.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 18150.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 9225.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 18450.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9225.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 13150.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 18450.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 9275.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 18550.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9275.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 13250.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 18550.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 9325.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 18650.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9325.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 13350.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 18650.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 9525.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 19050.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9525.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 13600.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 19050.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 9700.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 19400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9700.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 13850.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 19400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 11236.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 22472.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 11236.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 16086.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 22472.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "II_brk2" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt2": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 2", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 2", "description": "The second lowest tax rate, applied to the portion of taxable income below tax bracket 2 and above tax bracket 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.15, - 0.15, - 0.15, - 0.15, - 0.15, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.15], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.15 + }, + { + "year": 2014, + "value": 0.15 + }, + { + "year": 2015, + "value": 0.15 + }, + { + "year": 2016, + "value": 0.15 + }, + { + "year": 2017, + "value": 0.15 + }, + { + "year": 2018, + "value": 0.12 + }, + { + "year": 2019, + "value": 0.12 + }, + { + "year": 2026, + "value": 0.15 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk2": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 2", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 2", "description": "Income below this threshold and above tax bracket 1 is taxed at tax rate 2.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[36250.00, 72500.00, 36250.00, 48600.00, 72500.00], - [36900.00, 73800.00, 36900.00, 49400.00, 73800.00], - [37450.00, 74900.00, 37450.00, 50200.00, 74900.00], - [37650.00, 75300.00, 37650.00, 50400.00, 75300.00], - [37950.00, 75900.00, 37950.00, 50800.00, 75900.00], - [38700.0, 77400.0, 38700.0, 51800.0, 77400.0], - [39475.0, 78950.0, 39475.0, 52850.0, 78950.0], - [40098.7, 80197.41, 40098.7, 53685.03, 80197.41], - [40972.86, 81945.71, 40972.86, 54855.36, 81945.71], - [41902.94, 83805.88, 41902.94, 56100.58, 83805.88], - [42870.9, 85741.8, 42870.9, 57396.5, 85741.8], - [43822.63, 87645.26, 43822.63, 58670.71, 87645.26], - [44769.2, 89538.4, 44769.2, 59937.99, 89538.4], - [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]], - "valid_values": {"min": "II_brk1", "max": "II_brk3"}, - "invalid_minmsg": "for II_brk1", - "invalid_maxmsg": "for II_brk3", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 72500.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 48600.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 72500.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 73800.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 49400.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 73800.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 74900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 50200.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 74900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 75300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 50400.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 75300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 75900.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 50800.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 75900.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 38700.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 77400.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 38700.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 51800.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 77400.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 39475.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 78950.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 39475.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 52850.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 78950.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 45728.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 91455.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 45728.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 61211.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 91455.0 + } + ], + "validators": { + "range": { + "min": "II_brk1", + "max": "II_brk3" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt3": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 3", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 3", "description": "The third lowest tax rate, applied to the portion of taxable income below tax bracket 3 and above tax bracket 2.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.25], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.25 + }, + { + "year": 2014, + "value": 0.25 + }, + { + "year": 2015, + "value": 0.25 + }, + { + "year": 2016, + "value": 0.25 + }, + { + "year": 2017, + "value": 0.25 + }, + { + "year": 2018, + "value": 0.22 + }, + { + "year": 2019, + "value": 0.22 + }, + { + "year": 2026, + "value": 0.25 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk3": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 3", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 3", "description": "Income below this threshold and above tax bracket 2 is taxed at tax rate 3.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[87850.00, 146400.00, 73200.00, 125450.00, 146400.00], - [89350.00, 148850.00, 74425.00, 127550.00, 148850.00], - [90750.00, 151200.00, 75600.00, 129600.00, 151200.00], - [91150.00, 151900.00, 75950.00, 130150.00, 151900.00], - [91900.00, 153100.00, 76550.00, 131200.00, 153100.00], - [82500.0, 165000.0, 82500.0, 82500.0, 165000.0], - [84200.0, 168400.0, 84200.0, 84200.0, 168400.0], - [85530.36, 171060.72, 85530.36, 85530.36, 171060.72], - [87394.92, 174789.84, 87394.92, 87394.92, 174789.84], - [89378.79, 178757.57, 89378.79, 89378.79, 178757.57], - [91443.44, 182886.87, 91443.44, 91443.44, 182886.87], - [93473.48, 186946.96, 93473.48, 93473.48, 186946.96], - [95492.51, 190985.02, 95492.51, 95492.51, 190985.02], - [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]], - "valid_values": {"min": "II_brk2", "max": "II_brk4"}, - "invalid_minmsg": "for II_brk2", - "invalid_maxmsg": "for II_brk4", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 87850.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 146400.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 73200.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 125450.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 146400.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 89350.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 148850.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 74425.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 127550.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 148850.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 90750.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 151200.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 75600.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 129600.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 151200.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 91150.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 151900.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 75950.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 130150.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 151900.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 91900.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 153100.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 76550.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 131200.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 153100.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 165000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 165000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 168400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 168400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 110735.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 184477.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 92239.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 158089.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 184477.0 + } + ], + "validators": { + "range": { + "min": "II_brk2", + "max": "II_brk4" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt4": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 4", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 4", "description": "The tax rate applied to the portion of taxable income below tax bracket 4 and above tax bracket 3.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.28, - 0.28, - 0.28, - 0.28, - 0.28, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.28], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.28 + }, + { + "year": 2014, + "value": 0.28 + }, + { + "year": 2015, + "value": 0.28 + }, + { + "year": 2016, + "value": 0.28 + }, + { + "year": 2017, + "value": 0.28 + }, + { + "year": 2018, + "value": 0.24 + }, + { + "year": 2019, + "value": 0.24 + }, + { + "year": 2026, + "value": 0.28 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk4": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 4", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 4", "description": "Income below this threshold and above tax bracket 3 is taxed at tax rate 4.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Tax Rate Schedules).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[183250.00, 223050.00, 111525.00, 203150.00, 223050.00], - [186350.00, 226850.00, 113425.00, 206600.00, 226850.00], - [189300.00, 230450.00, 115225.00, 209850.00, 230450.00], - [190150.00, 231450.00, 115725.00, 210800.00, 231450.00], - [191650.00, 233350.00, 116675.00, 212500.00, 233350.00], - [157500.0, 315000.0, 157500.0, 157500.0, 315000.0], - [160725.0, 321450.0, 160725.0, 160700.0, 321450.0], - [163264.46, 326528.91, 163264.46, 163239.06, 326528.91], - [166823.62, 333647.24, 166823.62, 166797.67, 333647.24], - [170610.52, 341221.03, 170610.52, 170583.98, 341221.03], - [174551.62, 349103.24, 174551.62, 174524.47, 349103.24], - [178426.67, 356853.33, 178426.67, 178398.91, 356853.33], - [182280.68, 364561.36, 182280.68, 182252.33, 364561.36], - [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]], - "valid_values": {"min": "II_brk3", "max": "II_brk5"}, - "invalid_minmsg": "for II_brk3", - "invalid_maxmsg": "for II_brk5", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 183250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 223050.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 111525.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 203150.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 223050.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 186350.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 226850.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 113425.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 206600.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 226850.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 189300.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 230450.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 115225.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 209850.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 230450.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 190150.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 231450.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 115725.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 210800.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 231450.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 191650.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 233350.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 116675.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 212500.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 233350.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 315000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 315000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 160725.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 321450.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 160725.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 160700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 321450.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 230928.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 281174.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 140587.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 256051.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 281174.0 + } + ], + "validators": { + "range": { + "min": "II_brk3", + "max": "II_brk5" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt5": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 5", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 5", "description": "The third highest tax rate, applied to the portion of taxable income below tax bracket 5 and above tax bracket 4.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.33], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.33 + }, + { + "year": 2014, + "value": 0.33 + }, + { + "year": 2015, + "value": 0.33 + }, + { + "year": 2016, + "value": 0.33 + }, + { + "year": 2017, + "value": 0.33 + }, + { + "year": 2018, + "value": 0.32 + }, + { + "year": 2019, + "value": 0.32 + }, + { + "year": 2026, + "value": 0.33 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk5": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 5", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket (upper threshold) 5", "description": "Income below this threshold and above tax bracket 4 is taxed at tax rate 5.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[398350.00, 398350.00, 199175.00, 398350.00, 398350.00], - [405100.00, 405100.00, 202550.00, 405100.00, 405100.00], - [411500.00, 411500.00, 205750.00, 411500.00, 411500.00], - [413350.00, 413350.00, 206675.00, 413350.00, 413350.00], - [416700.00, 416700.00, 208350.00, 416700.00, 416700.00], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [204100.0, 408200.0, 204100.0, 204100.0, 408200.0], - [207324.78, 414649.56, 207324.78, 207324.78, 414649.56], - [211844.46, 423688.92, 211844.46, 211844.46, 423688.92], - [216653.33, 433306.66, 216653.33, 216653.33, 433306.66], - [221658.02, 443316.04, 221658.02, 221658.02, 443316.04], - [226578.83, 453157.66, 226578.83, 226578.83, 453157.66], - [231472.93, 462945.86, 231472.93, 231472.93, 462945.86], - [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]], - "valid_values": {"min": "II_brk4", "max": "II_brk6"}, - "invalid_minmsg": "for II_brk4", - "invalid_maxmsg": "for II_brk6", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 199175.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 398350.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 202550.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 405100.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 205750.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 411500.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 206675.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 413350.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 208350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 416700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 400000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 400000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 408200.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 408200.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 251050.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 502101.0 + } + ], + "validators": { + "range": { + "min": "II_brk4", + "max": "II_brk6" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt6": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 6", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 6", "description": "The second higher tax rate, applied to the portion of taxable income below tax bracket 6 and above tax bracket 5.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.35 + }, + { + "year": 2014, + "value": 0.35 + }, + { + "year": 2015, + "value": 0.35 + }, + { + "year": 2016, + "value": 0.35 + }, + { + "year": 2017, + "value": 0.35 + }, + { + "year": 2018, + "value": 0.35 + }, + { + "year": 2019, + "value": 0.35 + }, + { + "year": 2026, + "value": 0.35 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk6": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket 6", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket 6", "description": "Income below this threshold and above tax bracket 5 is taxed at tax rate 6.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[400000.00, 450000.00, 225000.00, 425000.00, 450000.00], - [406750.00, 457600.00, 228800.00, 432200.00, 457600.00], - [413200.00, 464850.00, 232425.00, 439000.00, 464850.00], - [415050.00, 466950.00, 233475.00, 441000.00, 466950.00], - [418400.00, 470700.00, 235350.00, 444550.00, 470700.00], - [500000.0, 600000.0, 300000.0, 500000.0, 600000.0], - [510300.0, 612350.0, 306175.0, 510300.0, 612350.0], - [518362.74, 622025.13, 311012.56, 518362.74, 622025.13], - [529663.05, 635585.28, 317792.64, 529663.05, 635585.28], - [541686.4, 650013.06, 325006.53, 541686.4, 650013.06], - [554199.35, 665028.37, 332514.18, 554199.35, 665028.37], - [566502.58, 679792.0, 339896.0, 566502.58, 679792.0], - [578739.04, 694475.5, 347237.75, 578739.04, 694475.5], - [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]], - "valid_values": {"min": "II_brk5", "max": "II_brk7"}, - "invalid_minmsg": "for II_brk5", - "invalid_maxmsg": "for II_brk7", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 400000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 450000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 225000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 425000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 450000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 406750.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 457600.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 228800.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 432200.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 457600.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 413200.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 464850.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 232425.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 439000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 464850.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 415050.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 466950.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 233475.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 441000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 466950.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 418400.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 470700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 235350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 444550.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 470700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 600000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 300000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 600000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 612350.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 306175.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 612350.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 504149.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 567168.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 283584.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 535659.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 567168.0 + } + ], + "validators": { + "range": { + "min": "II_brk5", + "max": "II_brk7" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt7": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 7", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 7", "description": "The tax rate applied to the portion of taxable income below tax bracket 7 and above tax bracket 6.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.396, - 0.396, - 0.396, - 0.396, - 0.396, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.396], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.396 + }, + { + "year": 2014, + "value": 0.396 + }, + { + "year": 2015, + "value": 0.396 + }, + { + "year": 2016, + "value": 0.396 + }, + { + "year": 2017, + "value": 0.396 + }, + { + "year": 2018, + "value": 0.37 + }, + { + "year": 2019, + "value": 0.37 + }, + { + "year": 2026, + "value": 0.396 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_brk7": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax bracket 7", + "title": "Personal income (regular/non-AMT/non-pass-through) tax bracket 7", "description": "Income below this threshold and above tax bracket 6 is taxed at tax rate 7; income above this threshold is taxed at tax rate 8. Default value is essentially infinity.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": "II_brk6", "max": 9e99}, - "invalid_minmsg": "for II_brk6", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": "II_brk6", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "II_rt8": { - "long_name": "Personal income (regular/non-AMT/non-pass-through) tax rate 8", + "title": "Personal income (regular/non-AMT/non-pass-through) tax rate 8", "description": "The tax rate applied to the portion of taxable income above tax bracket 7.", + "notes": "", "section_1": "Personal Income", "section_2": "Regular: Non-AMT, Non-Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "PT_rt1": { - "long_name": "Pass-through income tax rate 1", + "title": "Pass-through income tax rate 1", "description": "The lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10, - 0.10], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.1 + }, + { + "year": 2014, + "value": 0.1 + }, + { + "year": 2015, + "value": 0.1 + }, + { + "year": 2016, + "value": 0.1 + }, + { + "year": 2017, + "value": 0.1 + }, + { + "year": 2018, + "value": 0.1 + }, + { + "year": 2019, + "value": 0.1 + }, + { + "year": 2026, + "value": 0.1 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk1": { - "long_name": "Pass-through income tax bracket (upper threshold) 1", + "title": "Pass-through income tax bracket (upper threshold) 1", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold is taxed at tax rate 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[8925.00, 17850.00, 8925.00, 12750.00, 17850.00], - [9075.00, 18150.00, 9075.00, 12950.00, 18150.00], - [9225.00, 18450.00, 9225.00, 13150.00, 18450.00], - [9275.00, 18550.00, 9275.00, 13250.00, 18550.00], - [9325.00, 18650.00, 9325.00, 13350.00, 18650.00], - [9525.0, 19050.0, 9525.0, 13600.0, 19050.0], - [9700.0, 19400.0, 9700.0, 13850.0, 19400.0], - [9853.26, 19706.52, 9853.26, 14068.83, 19706.52], - [10068.06, 20136.12, 10068.06, 14375.53, 20136.12], - [10296.61, 20593.21, 10296.61, 14701.86, 20593.21], - [10534.46, 21068.92, 10534.46, 15041.47, 21068.92], - [10768.32, 21536.65, 10768.32, 15375.39, 21536.65], - [11000.92, 22001.84, 11000.92, 15707.5, 22001.84], - [11236.0, 22472.0, 11236.0, 16086.0, 22472.0]], - "valid_values": {"min": 0, "max": "PT_brk2"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for PT_brk2", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 8925.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 17850.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 8925.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 12750.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 17850.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 9075.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 18150.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9075.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 12950.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 18150.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 9225.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 18450.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9225.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 13150.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 18450.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 9275.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 18550.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9275.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 13250.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 18550.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 9325.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 18650.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9325.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 13350.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 18650.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 9525.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 19050.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9525.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 13600.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 19050.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 9700.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 19400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9700.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 13850.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 19400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 11236.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 22472.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 11236.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 16086.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 22472.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "PT_brk2" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt2": { - "long_name": "Pass-through income tax rate 2", + "title": "Pass-through income tax rate 2", "description": "The second lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 2 and above tax bracket 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.15, - 0.15, - 0.15, - 0.15, - 0.15, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.12, - 0.15], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.15 + }, + { + "year": 2014, + "value": 0.15 + }, + { + "year": 2015, + "value": 0.15 + }, + { + "year": 2016, + "value": 0.15 + }, + { + "year": 2017, + "value": 0.15 + }, + { + "year": 2018, + "value": 0.12 + }, + { + "year": 2019, + "value": 0.12 + }, + { + "year": 2026, + "value": 0.15 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk2": { - "long_name": "Pass-through income tax bracket (upper threshold) 2", + "title": "Pass-through income tax bracket (upper threshold) 2", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 1 is taxed at tax rate 2.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[36250.00, 72500.00, 36250.00, 48600.00, 72500.00], - [36900.00, 73800.00, 36900.00, 49400.00, 73800.00], - [37450.00, 74900.00, 37450.00, 50200.00, 74900.00], - [37650.00, 75300.00, 37650.00, 50400.00, 75300.00], - [37950.00, 75900.00, 37950.00, 50800.00, 75900.00], - [38700.0, 77400.0, 38700.0, 51800.0, 77400.0], - [39475.0, 78950.0, 39475.0, 52850.0, 78950.0], - [40098.7, 80197.41, 40098.7, 53685.03, 80197.41], - [40972.86, 81945.71, 40972.86, 54855.36, 81945.71], - [41902.94, 83805.88, 41902.94, 56100.58, 83805.88], - [42870.9, 85741.8, 42870.9, 57396.5, 85741.8], - [43822.63, 87645.26, 43822.63, 58670.71, 87645.26], - [44769.2, 89538.4, 44769.2, 59937.99, 89538.4], - [45728.0, 91455.0, 45728.0, 61211.0, 91455.0]], - "valid_values": {"min": "PT_brk1", "max": "PT_brk3"}, - "invalid_minmsg": "for PT_brk1", - "invalid_maxmsg": "for PT_brk3", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 72500.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 36250.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 48600.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 72500.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 73800.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 36900.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 49400.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 73800.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 74900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 37450.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 50200.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 74900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 75300.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 37650.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 50400.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 75300.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 75900.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 37950.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 50800.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 75900.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 38700.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 77400.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 38700.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 51800.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 77400.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 39475.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 78950.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 39475.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 52850.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 78950.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 45728.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 91455.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 45728.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 61211.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 91455.0 + } + ], + "validators": { + "range": { + "min": "PT_brk1", + "max": "PT_brk3" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt3": { - "long_name": "Pass-through income tax rate 3", + "title": "Pass-through income tax rate 3", "description": "The third lowest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 3 and above tax bracket 2.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.22, - 0.25], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.25 + }, + { + "year": 2014, + "value": 0.25 + }, + { + "year": 2015, + "value": 0.25 + }, + { + "year": 2016, + "value": 0.25 + }, + { + "year": 2017, + "value": 0.25 + }, + { + "year": 2018, + "value": 0.22 + }, + { + "year": 2019, + "value": 0.22 + }, + { + "year": 2026, + "value": 0.25 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk3": { - "long_name": "Pass-through income tax bracket (upper threshold) 3", + "title": "Pass-through income tax bracket (upper threshold) 3", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 2 is taxed at tax rate 3.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[87850.00, 146400.00, 73200.00, 125450.00, 146400.00], - [89350.00, 148850.00, 74425.00, 127550.00, 148850.00], - [90750.00, 151200.00, 75600.00, 129600.00, 151200.00], - [91150.00, 151900.00, 75950.00, 130150.00, 151900.00], - [91900.00, 153100.00, 76550.00, 131200.00, 153100.00], - [82500.0, 165000.0, 82500.0, 82500.0, 165000.0], - [84200.0, 168400.0, 84200.0, 84200.0, 168400.0], - [85530.36, 171060.72, 85530.36, 85530.36, 171060.72], - [87394.92, 174789.84, 87394.92, 87394.92, 174789.84], - [89378.79, 178757.57, 89378.79, 89378.79, 178757.57], - [91443.44, 182886.87, 91443.44, 91443.44, 182886.87], - [93473.48, 186946.96, 93473.48, 93473.48, 186946.96], - [95492.51, 190985.02, 95492.51, 95492.51, 190985.02], - [110735.0, 184477.0, 92239.0, 158089.0, 184477.0]], - "valid_values": {"min": "PT_brk2", "max": "PT_brk4"}, - "invalid_minmsg": "for PT_brk2", - "invalid_maxmsg": "for PT_brk4", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 87850.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 146400.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 73200.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 125450.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 146400.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 89350.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 148850.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 74425.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 127550.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 148850.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 90750.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 151200.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 75600.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 129600.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 151200.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 91150.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 151900.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 75950.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 130150.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 151900.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 91900.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 153100.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 76550.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 131200.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 153100.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 165000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 82500.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 165000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 168400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 84200.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 168400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 110735.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 184477.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 92239.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 158089.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 184477.0 + } + ], + "validators": { + "range": { + "min": "PT_brk2", + "max": "PT_brk4" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt4": { - "long_name": "Pass-through income tax rate 4", + "title": "Pass-through income tax rate 4", "description": "The tax rate applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 4 and above tax bracket 3.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.28, - 0.28, - 0.28, - 0.28, - 0.28, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.24, - 0.28], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.28 + }, + { + "year": 2014, + "value": 0.28 + }, + { + "year": 2015, + "value": 0.28 + }, + { + "year": 2016, + "value": 0.28 + }, + { + "year": 2017, + "value": 0.28 + }, + { + "year": 2018, + "value": 0.24 + }, + { + "year": 2019, + "value": 0.24 + }, + { + "year": 2026, + "value": 0.28 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk4": { - "long_name": "Pass-through income tax bracket (upper threshold) 4", + "title": "Pass-through income tax bracket (upper threshold) 4", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 3 is taxed at tax rate 4.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[183250.00, 223050.00, 111525.00, 203150.00, 223050.00], - [186350.00, 226850.00, 113425.00, 206600.00, 226850.00], - [189300.00, 230450.00, 115225.00, 209850.00, 230450.00], - [190150.00, 231450.00, 115725.00, 210800.00, 231450.00], - [191650.00, 233350.00, 116675.00, 212500.00, 233350.00], - [157500.0, 315000.0, 157500.0, 157500.0, 315000.0], - [160725.0, 321450.0, 160725.0, 160700.0, 321450.0], - [163264.46, 326528.91, 163264.46, 163239.06, 326528.91], - [166823.62, 333647.24, 166823.62, 166797.67, 333647.24], - [170610.52, 341221.03, 170610.52, 170583.98, 341221.03], - [174551.62, 349103.24, 174551.62, 174524.47, 349103.24], - [178426.67, 356853.33, 178426.67, 178398.91, 356853.33], - [182280.68, 364561.36, 182280.68, 182252.33, 364561.36], - [230928.0, 281174.0, 140587.0, 256051.0, 281174.0]], - "valid_values": {"min": "PT_brk3", "max": "PT_brk5"}, - "invalid_minmsg": "for PT_brk3", - "invalid_maxmsg": "for PT_brk5", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 183250.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 223050.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 111525.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 203150.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 223050.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 186350.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 226850.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 113425.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 206600.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 226850.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 189300.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 230450.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 115225.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 209850.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 230450.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 190150.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 231450.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 115725.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 210800.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 231450.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 191650.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 233350.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 116675.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 212500.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 233350.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 315000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 315000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 160725.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 321450.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 160725.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 160700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 321450.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 230928.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 281174.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 140587.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 256051.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 281174.0 + } + ], + "validators": { + "range": { + "min": "PT_brk3", + "max": "PT_brk5" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt5": { - "long_name": "Pass-through income tax rate 5", + "title": "Pass-through income tax rate 5", "description": "The third highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 5 and above tax bracket 4.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.33, - 0.33, - 0.33, - 0.33, - 0.33, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.32, - 0.33], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.33 + }, + { + "year": 2014, + "value": 0.33 + }, + { + "year": 2015, + "value": 0.33 + }, + { + "year": 2016, + "value": 0.33 + }, + { + "year": 2017, + "value": 0.33 + }, + { + "year": 2018, + "value": 0.32 + }, + { + "year": 2019, + "value": 0.32 + }, + { + "year": 2026, + "value": 0.33 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk5": { - "long_name": "Pass-through income tax bracket (upper threshold) 5", + "title": "Pass-through income tax bracket (upper threshold) 5", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 4 is taxed at tax rate 5.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[398350.00, 398350.00, 199175.00, 398350.00, 398350.00], - [405100.00, 405100.00, 202550.00, 405100.00, 405100.00], - [411500.00, 411500.00, 205750.00, 411500.00, 411500.00], - [413350.00, 413350.00, 206675.00, 413350.00, 413350.00], - [416700.00, 416700.00, 208350.00, 416700.00, 416700.00], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [204100.0, 408200.0, 204100.0, 204100.0, 408200.0], - [207324.78, 414649.56, 207324.78, 207324.78, 414649.56], - [211844.46, 423688.92, 211844.46, 211844.46, 423688.92], - [216653.33, 433306.66, 216653.33, 216653.33, 433306.66], - [221658.02, 443316.04, 221658.02, 221658.02, 443316.04], - [226578.83, 453157.66, 226578.83, 226578.83, 453157.66], - [231472.93, 462945.86, 231472.93, 231472.93, 462945.86], - [502101.0, 502101.0, 251050.0, 502101.0, 502101.0]], - "valid_values": {"min": "PT_brk4", "max": "PT_brk6"}, - "invalid_minmsg": "for PT_brk4", - "invalid_maxmsg": "for PT_brk6", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 199175.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 398350.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 398350.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 202550.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 405100.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 405100.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 205750.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 411500.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 411500.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 206675.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 413350.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 413350.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 208350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 416700.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 416700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 400000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 400000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 408200.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 204100.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 408200.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 251050.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 502101.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 502101.0 + } + ], + "validators": { + "range": { + "min": "PT_brk4", + "max": "PT_brk6" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt6": { - "long_name": "Pass-through income tax rate 6", + "title": "Pass-through income tax rate 6", "description": "The second higher tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 6 and above tax bracket 5.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35, - 0.35], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.35 + }, + { + "year": 2014, + "value": 0.35 + }, + { + "year": 2015, + "value": 0.35 + }, + { + "year": 2016, + "value": 0.35 + }, + { + "year": 2017, + "value": 0.35 + }, + { + "year": 2018, + "value": 0.35 + }, + { + "year": 2019, + "value": 0.35 + }, + { + "year": 2026, + "value": 0.35 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk6": { - "long_name": "Pass-through income tax bracket (upper threshold) 6", + "title": "Pass-through income tax bracket (upper threshold) 6", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 5 is taxed at tax rate 6.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[400000.00, 450000.00, 225000.00, 425000.00, 450000.00], - [406750.00, 457600.00, 228800.00, 432200.00, 457600.00], - [413200.00, 464850.00, 232425.00, 439000.00, 464850.00], - [415050.00, 466950.00, 233475.00, 441000.00, 466950.00], - [418400.00, 470700.00, 235350.00, 444550.00, 470700.00], - [500000.0, 600000.0, 300000.0, 500000.0, 600000.0], - [510300.0, 612350.0, 306175.0, 510300.0, 612350.0], - [518362.74, 622025.13, 311012.56, 518362.74, 622025.13], - [529663.05, 635585.28, 317792.64, 529663.05, 635585.28], - [541686.4, 650013.06, 325006.53, 541686.4, 650013.06], - [554199.35, 665028.37, 332514.18, 554199.35, 665028.37], - [566502.58, 679792.0, 339896.0, 566502.58, 679792.0], - [578739.04, 694475.5, 347237.75, 578739.04, 694475.5], - [504149.0, 567168.0, 283584.0, 535659.0, 567168.0]], - "valid_values": {"min": "PT_brk5", "max": "PT_brk7"}, - "invalid_minmsg": "for PT_brk5", - "invalid_maxmsg": "for PT_brk7", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 400000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 450000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 225000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 425000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 450000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 406750.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 457600.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 228800.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 432200.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 457600.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 413200.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 464850.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 232425.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 439000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 464850.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 415050.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 466950.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 233475.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 441000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 466950.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 418400.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 470700.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 235350.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 444550.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 470700.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 600000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 300000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 600000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 612350.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 306175.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 612350.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 504149.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 567168.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 283584.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 535659.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 567168.0 + } + ], + "validators": { + "range": { + "min": "PT_brk5", + "max": "PT_brk7" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt7": { - "long_name": "Pass-through income tax rate 7", + "title": "Pass-through income tax rate 7", "description": "The highest tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations below tax bracket 7 and above tax bracket 6.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 1040, line 11, instruction (Schedule XYZ)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.396, - 0.396, - 0.396, - 0.396, - 0.396, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.37, - 0.396], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.396 + }, + { + "year": 2014, + "value": 0.396 + }, + { + "year": 2015, + "value": 0.396 + }, + { + "year": 2016, + "value": 0.396 + }, + { + "year": 2017, + "value": 0.396 + }, + { + "year": 2018, + "value": 0.37 + }, + { + "year": 2019, + "value": 0.37 + }, + { + "year": 2026, + "value": 0.396 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_brk7": { - "long_name": "Extra pass-through income tax bracket", + "title": "Extra pass-through income tax bracket", "description": "Income from sole proprietorships, partnerships and S-corporations below this threshold and above tax bracket 6 is taxed at tax rate 7. Default value is essentially infinity.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": "PT_brk6", "max": 9e99}, - "invalid_minmsg": "for PT_brk6", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2026, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": "PT_brk6", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_rt8": { - "long_name": "Extra pass-through income tax rate", + "title": "Extra pass-through income tax rate", "description": "The extra tax rate, applied to the portion of income from sole proprietorships, partnerships and S-corporations above the tax bracket 7.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "PT_EligibleRate_active": { - "long_name": "Share of active business income eligible for PT rate schedule", + "title": "Share of active business income eligible for PT rate schedule", "description": "Eligibility rate of active business income for separate pass-through rates.", + "notes": "Active business income defined as e00900 + e26270", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "Active business income defined as e00900 + e26270", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "PT_EligibleRate_passive": { - "long_name": "Share of passive business income eligible for PT rate schedule", + "title": "Share of passive business income eligible for PT rate schedule", "description": "Eligibility rate of passive business income for mseparate pass-through rates.", + "notes": "Passive business income defined as e02000 - e26270", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "Passive business income defined as e02000 - e26270", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "PT_wages_active_income": { - "long_name": "Wages included in (positive) active business income eligible for PT rates", + "title": "Wages included in (positive) active business income eligible for PT rates", "description": "Whether active business income eligibility base for PT schedule for includes wages.", + "notes": "Only applies if active business income is positive", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "Only applies if active business income is positive", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": false} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": false + } }, - "PT_top_stacking": { - "long_name": "PT taxable income stacked on top of regular taxable income", + "title": "PT taxable income stacked on top of regular taxable income", "description": "Whether taxable income eligible for PT rate schedule is stacked on top of regular taxable income.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [true], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": true + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "PT_qbid_rt": { - "long_name": "Pass-through qualified business income deduction rate", + "title": "Pass-through qualified business income deduction rate", "description": "Fraction of pass-through business income that may be excluded from taxable income.", + "notes": "Applies to e00900 + e26270", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A", - "notes": "Applies to e00900 + e26270", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.2, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.2 + }, + { + "year": 2019, + "value": 0.2 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_qbid_taxinc_thd": { - "long_name": "Lower threshold of pre-QBID taxable income", + "title": "Lower threshold of pre-QBID taxable income", "description": "Pre-QBID taxable income above this lower threshold implies the QBID amount begins to be limited.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A, Line 3, in-line", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [157500.0, 315000.0, 157500.0, 157500.0, 315000.0], - [160700.0, 321400.0, 160725.0, 160700.0, 321400.0], - [163239.06, 326478.12, 163264.46, 163239.06, 326478.12], - [166797.67, 333595.34, 166823.62, 166797.67, 333595.34], - [170583.98, 341167.96, 170610.52, 170583.98, 341167.96], - [174524.47, 349048.94, 174551.62, 174524.47, 349048.94], - [178398.91, 356797.82, 178426.67, 178398.91, 356797.82], - [182252.33, 364504.66, 182280.68, 182252.33, 364504.66], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 315000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 157500.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 315000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 160700.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 321400.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 160725.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 160700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 321400.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_qbid_taxinc_gap": { - "long_name": "Dollar gap between upper and lower threshold of pre-QBID taxable income", + "title": "Dollar gap between upper and lower threshold of pre-QBID taxable income", "description": "Pre-QBID taxable income above this upper threshold implies the QBID amount is even more limited.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[1.0, 1.0, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.0, 1.0, 1.0], - [1.0, 1.0, 1.0, 1.0, 1.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [50000.0, 100000.0, 50000.0, 50000.0, 100000.0], - [1.0, 1.0, 1.0, 1.0, 1.0]], - "valid_values": {"min": 1, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 1.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 1.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 1.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 1.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 1.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 50000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 100000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 50000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 50000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 100000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 50000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 100000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 50000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 50000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 100000.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 1.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 1.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 1.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 1.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 1.0 + } + ], + "validators": { + "range": { + "min": 1, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "PT_qbid_w2_wages_rt": { - "long_name": "QBID cap rate on pass-through business W-2 wages paid", + "title": "QBID cap rate on pass-through business W-2 wages paid", "description": "QBID is capped at this fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.5, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.5 + }, + { + "year": 2019, + "value": 0.5 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": false, + "cps": false + } + }, "PT_qbid_alt_w2_wages_rt": { - "long_name": "Alternative QBID cap rate on pass-through business W-2 wages paid", + "title": "Alternative QBID cap rate on pass-through business W-2 wages paid", "description": "QBID is capped at this fraction of W-2 wages paid by the pass-through business plus some fraction of business property if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.25, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.25 + }, + { + "year": 2019, + "value": 0.25 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": false, + "cps": false + } + }, "PT_qbid_alt_property_rt": { - "long_name": "Alternative QBID cap rate on pass-through business property owned", + "title": "Alternative QBID cap rate on pass-through business property owned", "description": "QBID is capped at this fraction of business property owned plus some fraction of W-2 wages paid by the pass-through business if pre-QBID taxable income is above the QBID thresholds and the alternative cap is higher than the main wage-only cap.", + "notes": "", "section_1": "Personal Income", "section_2": "Pass-Through", - "irs_ref": "Form 8995-A", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.025, - 0.025, - 0.025, - 0.025, - 0.025, - 0.025, - 0.025, - 0.025, - 0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": false} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.025 + }, + { + "year": 2019, + "value": 0.025 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": false, + "cps": false + } + }, "AMT_em": { - "long_name": "AMT exemption amount", + "title": "AMT exemption amount", "description": "The amount of AMT taxable income exempted from AMT.", + "notes": "", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Exemption", - "irs_ref": "Form 1040 (Schedule 2), line 45, instruction (Worksheet).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[51900.00, 80800.00, 40400.00, 51900.00, 80800.00], - [52800.00, 82100.00, 41050.00, 52800.00, 82100.00], - [53600.00, 83400.00, 41700.00, 53600.00, 83400.00], - [53900.00, 83800.00, 41900.00, 53900.00, 83800.00], - [54300.00, 84500.00, 42250.00, 54300.00, 84500.00], - [70300.0, 109400.0, 54700.0, 70300.0, 109400.0], - [71700.0, 111700.0, 55850.0, 71700.0, 111700.0], - [72832.86, 113464.86, 56732.43, 72832.86, 113464.86], - [74420.62, 115938.39, 57969.2, 74420.62, 115938.39], - [76109.96, 118570.2, 59285.1, 76109.96, 118570.2], - [77868.1, 121309.17, 60654.58, 77868.1, 121309.17], - [79596.78, 124002.23, 62001.12, 79596.78, 124002.23], - [81316.07, 126680.68, 63340.34, 81316.07, 126680.68], - [65429.0, 101818.0, 50909.0, 65429.0, 101818.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 51900.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 80800.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 40400.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 51900.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 80800.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 52800.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 82100.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 41050.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 52800.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 82100.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 53600.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 83400.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 41700.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 53600.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 83400.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 53900.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 83800.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 41900.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 53900.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 83800.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 54300.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 84500.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 42250.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 54300.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 84500.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 70300.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 109400.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 54700.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 70300.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 109400.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 71700.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 111700.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 55850.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 71700.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 111700.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 65429.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 101818.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 50909.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 65429.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 101818.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_prt": { - "long_name": "AMT exemption phaseout rate", + "title": "AMT exemption phaseout rate", "description": "AMT exemption will decrease at this rate for each dollar of AMT taxable income exceeding AMT phaseout start.", + "notes": "", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Exemption", - "irs_ref": "Form 1040 (Schedule 2), line 45, instruction (Worksheet).", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.25], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.25 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_em_ps": { - "long_name": "AMT exemption phaseout start", + "title": "AMT exemption phaseout start", "description": "AMT exemption starts to decrease when AMT taxable income goes beyond this threshold.", + "notes": "", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Exemption", - "irs_ref": "Form 1040 (Schedule 2), line 45, instruction (Worksheet).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[115400.00, 153900.00, 76950.00, 115400.00, 153900.00], - [117300.00, 156500.00, 78250.00, 117300.00, 156500.00], - [119200.00, 158900.00, 79450.00, 119200.00, 158900.00], - [119700.00, 159700.00, 79850.00, 119700.00, 159700.00], - [120700.00, 160900.00, 80450.00, 120700.00, 160900.00], - [500000.0, 1000000.0, 500000.0, 500000.0, 1000000.0], - [510300.0, 1020600.0, 510300.0, 510300.0, 1020600.0], - [518362.74, 1036725.48, 518362.74, 518362.74, 1036725.48], - [529663.05, 1059326.1, 529663.05, 529663.05, 1059326.1], - [541686.4, 1083372.8, 541686.4, 541686.4, 1083372.8], - [554199.35, 1108398.71, 554199.35, 554199.35, 1108398.71], - [566502.58, 1133005.16, 566502.58, 566502.58, 1133005.16], - [578739.04, 1157478.07, 578739.04, 578739.04, 1157478.07], - [145437.0, 193876.0, 96938.0, 145437.0, 193876.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 115400.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 153900.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 76950.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 115400.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 153900.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 117300.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 156500.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 78250.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 117300.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 156500.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 119200.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 158900.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 79450.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 119200.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 158900.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 119700.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 159700.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 79850.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 119700.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 159700.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 120700.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 160900.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 80450.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 120700.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 160900.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 1020600.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 510300.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 1020600.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 145437.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 193876.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 96938.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 145437.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 193876.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_child_em": { - "long_name": "Child AMT exemption additional income base", + "title": "Child AMT exemption additional income base", "description": "The child's AMT exemption is capped by this amount plus the child's earned income.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 6251, line 5, instruction.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [7150.0, - 7250.0, - 7400.0, - 7400.0, - 7500.0, - 7600.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 7150.0 + }, + { + "year": 2014, + "value": 7250.0 + }, + { + "year": 2015, + "value": 7400.0 + }, + { + "year": 2016, + "value": 7400.0 + }, + { + "year": 2017, + "value": 7500.0 + }, + { + "year": 2018, + "value": 7600.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_child_em_c_age": { - "long_name": "Age ceiling for special AMT exemption", + "title": "Age ceiling for special AMT exemption", "description": "Individuals under this age must use the child AMT exemption rules.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 6251, line 5, instruction.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "integer", - "value": [18], - "valid_values": {"min": 0, "max": 30}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "int", + "value": [ + { + "year": 2013, + "value": 18 + } + ], + "validators": { + "range": { + "min": 0, + "max": 30 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_rt1": { - "long_name": "AMT rate 1", + "title": "AMT rate 1", "description": "The tax rate applied to the portion of AMT taxable income below the surtax threshold, AMT bracket 1.", + "notes": "", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Tax rates", - "irs_ref": "Form 6251, line 7, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.26], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.26 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_brk1": { - "long_name": "AMT bracket 1 (upper threshold)", + "title": "AMT bracket 1 (upper threshold)", "description": "AMT taxable income below this is subject to AMT rate 1 and above it is subject to AMT rate 1 + the additional AMT rate.", + "notes": "", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Tax rates", - "irs_ref": "Form 6251, line 7, instruction.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [179500.0, - 182500.0, - 185400.0, - 186300.0, - 187800.0, - 191100.0, - 194800.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 179500.0 + }, + { + "year": 2014, + "value": 182500.0 + }, + { + "year": 2015, + "value": 185400.0 + }, + { + "year": 2016, + "value": 186300.0 + }, + { + "year": 2017, + "value": 187800.0 + }, + { + "year": 2018, + "value": 191100.0 + }, + { + "year": 2019, + "value": 194800.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AMT_rt2": { - "long_name": "Additional AMT rate for AMT taxable income above AMT bracket 1", + "title": "Additional AMT rate for AMT taxable income above AMT bracket 1", "description": "The additional tax rate applied to the portion of AMT income above the AMT bracket 1.", + "notes": "This is the additional tax rate (on top of AMT rate 1) for AMT income above AMT bracket 1.", "section_1": "Personal Income", "section_2": "Alternative Minimum Tax", - "section_3": "Tax rates", - "irs_ref": "Form 6251, line 7, in-line. ", - "notes": "This is the additional tax rate (on top of AMT rate 1) for AMT income above AMT bracket 1.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.02], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.02 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AMT_em_pe": { - "long_name": "AMT exemption phaseout ending AMT taxable income for Married filing Separately", + "title": "AMT exemption phaseout ending AMT taxable income for Married filing Separately", "description": "The AMT exemption is entirely disallowed beyond this AMT taxable income level for individuals who are married but filing separately.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 6251, line 4, in-line.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [238550.0, - 242450.0, - 246250.0, - 247450.0, - 249450.0, - 718800.0, - 733700.0, - 745292.46, - 761539.84, - 778826.79, - 796817.69, - 814507.04, - 832100.39, - 300574.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 238550.0 + }, + { + "year": 2014, + "value": 242450.0 + }, + { + "year": 2015, + "value": 246250.0 + }, + { + "year": 2016, + "value": 247450.0 + }, + { + "year": 2017, + "value": 249450.0 + }, + { + "year": 2018, + "value": 718800.0 + }, + { + "year": 2019, + "value": 733700.0 + }, + { + "year": 2026, + "value": 300574.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "CDCC_c": { - "long_name": "Maximum child & dependent care credit per dependent", + "title": "Maximum child & dependent care credit per dependent", "description": "The maximum amount of credit allowed for each qualifying dependent.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Child And Dependent Care", - "irs_ref": "Form 2441, line 3, in-line.", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [3000.0], - "valid_values": {"min": 0, "max": 3000}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 3000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 3000 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CDCC_ps": { - "long_name": "Child & dependent care credit phaseout start", + "title": "Child & dependent care credit phaseout start", "description": "For taxpayers with AGI over this amount, the credit is reduced by one percentage point each $2000 of AGI over this amount.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Child And Dependent Care", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [15000.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 15000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CDCC_crt": { - "long_name": "Child & dependent care credit phaseout percentage rate ceiling", + "title": "Child & dependent care credit phaseout percentage rate ceiling", "description": "The maximum percentage rate in the AGI phaseout; this percentage rate decreases as AGI rises above the CDCC_ps level.", + "notes": "", "section_1": "Nonrefundable Credits", "section_2": "Child And Dependent Care", - "irs_ref": "Form 2241, line 8, in-line.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [35.0], - "valid_values": {"min": 0, "max": 100}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 35.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 100 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_c": { - "long_name": "Maximum nonrefundable child tax credit per child", + "title": "Maximum nonrefundable child tax credit per child", "description": "The maximum nonrefundable credit allowed for each child.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Child Tax Credit", - "irs_ref": "Form 1040, line 12, worksheet, line 1.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1000.0, - 1000.0, - 1000.0, - 1000.0, - 1000.0, - 2000.0, - 2000.0, - 2000.0, - 2000.0, - 2000.0, - 2000.0, - 2000.0, - 2000.0, - 1000.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 1000.0 + }, + { + "year": 2014, + "value": 1000.0 + }, + { + "year": 2015, + "value": 1000.0 + }, + { + "year": 2016, + "value": 1000.0 + }, + { + "year": 2017, + "value": 1000.0 + }, + { + "year": 2018, + "value": 2000.0 + }, + { + "year": 2019, + "value": 2000.0 + }, + { + "year": 2026, + "value": 1000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_c_under5_bonus": { - "long_name": "Bonus child tax credit maximum for qualifying children under five", + "title": "Bonus child tax credit maximum for qualifying children under five", "description": "The maximum amount of child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_ps": { - "long_name": "Child tax credit phaseout MAGI start", + "title": "Child tax credit phaseout MAGI start", "description": "Child tax credit begins to decrease when MAGI is above this level; read descriptions of the dependent credit amounts for how they phase out when MAGI is above this level.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Child Tax Credit", - "irs_ref": "Form 1040, line 12, worksheet, line 5.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[75000.0, 110000.0, 55000.0, 75000.0, 75000.0], - [75000.0, 110000.0, 55000.0, 75000.0, 75000.0], - [75000.0, 110000.0, 55000.0, 75000.0, 75000.0], - [75000.0, 110000.0, 55000.0, 75000.0, 75000.0], - [75000.0, 110000.0, 55000.0, 75000.0, 75000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [200000.0, 400000.0, 200000.0, 200000.0, 400000.0], - [75000.0, 110000.0, 55000.0, 75000.0, 75000.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 75000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 75000.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 75000.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 75000.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 75000.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 400000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 400000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 400000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 200000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 400000.0 + }, + { + "year": 2026, + "MARS": "single", + "value": 75000.0 + }, + { + "year": 2026, + "MARS": "mjoint", + "value": 110000.0 + }, + { + "year": 2026, + "MARS": "mseparate", + "value": 55000.0 + }, + { + "year": 2026, + "MARS": "headhh", + "value": 75000.0 + }, + { + "year": 2026, + "MARS": "widow", + "value": 75000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_prt": { - "long_name": "Child and dependent tax credit phaseout rate", + "title": "Child and dependent tax credit phaseout rate", "description": "The amount of the credit starts to decrease at this rate if MAGI is higher than child tax credit phaseout start.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Child Tax Credit", - "irs_ref": "Form 1040, line 12, instruction (child tax credit worksheet, line 7)", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.05], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.05 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ACTC_c": { - "long_name": "Maximum refundable additional child tax credit", + "title": "Maximum refundable additional child tax credit", "description": "This refundable credit is applied to child dependents and phases out exactly like the CTC amount.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Additional Child Tax Credit", - "irs_ref": "Form 1040, line 18b, Schedule 8812", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [1000.0, - 1000.0, - 1000.0, - 1000.0, - 1000.0, - 1400.0, - 1400.0, - 1400.0, - 1400.0, - 1500.0, - 1500.0, - 1500.0, - 1600.0, - 1000.0], - "valid_values": {"min": 0, "max": "CTC_c"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for CTC_c", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 1000.0 + }, + { + "year": 2014, + "value": 1000.0 + }, + { + "year": 2015, + "value": 1000.0 + }, + { + "year": 2016, + "value": 1000.0 + }, + { + "year": 2017, + "value": 1000.0 + }, + { + "year": 2018, + "value": 1400.0 + }, + { + "year": 2019, + "value": 1400.0 + }, + { + "year": 2020, + "value": 1400.0 + }, + { + "year": 2021, + "value": 1400.0 + }, + { + "year": 2022, + "value": 1500.0 + }, + { + "year": 2023, + "value": 1500.0 + }, + { + "year": 2024, + "value": 1500.0 + }, + { + "year": 2025, + "value": 1600.0 + }, + { + "year": 2026, + "value": 1000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "CTC_c" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ODC_c": { - "long_name": "Maximum nonrefundable other-dependent credit", + "title": "Maximum nonrefundable other-dependent credit", "description": "This nonrefundable credit is applied to non-child dependents and phases out along with the CTC amount.", + "notes": "Became current-law policy with passage of TCJA", "section_1": "Child/Dependent Credits", "section_2": "Other Dependent Tax Credit", - "irs_ref": "Form 1040, line 12, instruction (child tax credit worksheet, line 2)", - "notes": "Became current-law policy with passage of TCJA", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 500.0, - 500.0, - 500.0, - 500.0, - 500.0, - 500.0, - 500.0, - 500.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 500.0 + }, + { + "year": 2019, + "value": 500.0 + }, + { + "year": 2026, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "NIIT_thd": { - "long_name": "Net Investment Income Tax modified AGI threshold", + "title": "Net Investment Income Tax modified AGI threshold", "description": "If modified AGI is more than this threshold, filing unit is subject to the Net Investment Income Tax.", + "notes": "", "section_1": "Other Taxes", "section_2": "Net Investment Income Tax", - "irs_ref": "Form 8960, line 14, instructions. ", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[200000.0, 250000.0, 125000.0, 200000.0, 250000.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 200000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 250000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 125000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 200000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 250000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "NIIT_PT_taxed": { - "long_name": "Whether or not partnership and S-corp income is in NIIT base", + "title": "Whether or not partnership and S-corp income is in NIIT base", "description": "false ==> partnership and S-corp income excluded from NIIT base; true ==> partnership and S-corp income is in NIIT base.", + "notes": "", "section_1": "Other Taxes", "section_2": "Net Investment Income Tax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "NIIT_rt": { - "long_name": "Net Investment Income Tax rate", + "title": "Net Investment Income Tax rate", "description": "If modified AGI exceeds NIIT_thd, all net investment income is taxed at this rate.", + "notes": "", "section_1": "Other Taxes", "section_2": "Net Investment Income Tax", - "irs_ref": "Form 8960, line 21, in-line. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.038], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.038 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_c": { - "long_name": "Maximum earned income credit", + "title": "Maximum earned income credit", "description": "This is the maximum amount of earned income credit taxpayers are eligible for; it depends on how many kids they have.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, instruction (table).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "EIC", - "vi_vals": ["0kids", "1kid", "2kids", "3+kids"], - "value_type": "real", - "value": [[487.0, 3250.0, 5372.0, 6044.0], - [496.0, 3305.0, 5460.0, 6143.0], - [503.0, 3359.0, 5548.0, 6242.0], - [506.0, 3373.0, 5572.0, 6269.0], - [510.0, 3400.0, 5616.0, 6318.0], - [519.0, 3461.0, 5716.0, 6431.0], - [529.0, 3526.0, 5828.0, 6557.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "EIC": "0kids", + "value": 487.0 + }, + { + "year": 2013, + "EIC": "1kid", + "value": 3250.0 + }, + { + "year": 2013, + "EIC": "2kids", + "value": 5372.0 + }, + { + "year": 2013, + "EIC": "3+kids", + "value": 6044.0 + }, + { + "year": 2014, + "EIC": "0kids", + "value": 496.0 + }, + { + "year": 2014, + "EIC": "1kid", + "value": 3305.0 + }, + { + "year": 2014, + "EIC": "2kids", + "value": 5460.0 + }, + { + "year": 2014, + "EIC": "3+kids", + "value": 6143.0 + }, + { + "year": 2015, + "EIC": "0kids", + "value": 503.0 + }, + { + "year": 2015, + "EIC": "1kid", + "value": 3359.0 + }, + { + "year": 2015, + "EIC": "2kids", + "value": 5548.0 + }, + { + "year": 2015, + "EIC": "3+kids", + "value": 6242.0 + }, + { + "year": 2016, + "EIC": "0kids", + "value": 506.0 + }, + { + "year": 2016, + "EIC": "1kid", + "value": 3373.0 + }, + { + "year": 2016, + "EIC": "2kids", + "value": 5572.0 + }, + { + "year": 2016, + "EIC": "3+kids", + "value": 6269.0 + }, + { + "year": 2017, + "EIC": "0kids", + "value": 510.0 + }, + { + "year": 2017, + "EIC": "1kid", + "value": 3400.0 + }, + { + "year": 2017, + "EIC": "2kids", + "value": 5616.0 + }, + { + "year": 2017, + "EIC": "3+kids", + "value": 6318.0 + }, + { + "year": 2018, + "EIC": "0kids", + "value": 519.0 + }, + { + "year": 2018, + "EIC": "1kid", + "value": 3461.0 + }, + { + "year": 2018, + "EIC": "2kids", + "value": 5716.0 + }, + { + "year": 2018, + "EIC": "3+kids", + "value": 6431.0 + }, + { + "year": 2019, + "EIC": "0kids", + "value": 529.0 + }, + { + "year": 2019, + "EIC": "1kid", + "value": 3526.0 + }, + { + "year": 2019, + "EIC": "2kids", + "value": 5828.0 + }, + { + "year": 2019, + "EIC": "3+kids", + "value": 6557.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "EITC_rt": { - "long_name": "Earned income credit phasein rate", + "title": "Earned income credit phasein rate", "description": "Pre-phaseout credit is minimum of this rate times earnings and the maximum earned income credit.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, calculation (table: Max_EIC/Max_EIC_base_income).", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "EIC", - "vi_vals": ["0kids", "1kid", "2kids", "3+kids"], - "value_type": "real", - "value": [[0.0765, 0.3400, 0.4000, 0.4500]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "EIC": "0kids", + "value": 0.0765 + }, + { + "year": 2013, + "EIC": "1kid", + "value": 0.34 + }, + { + "year": 2013, + "EIC": "2kids", + "value": 0.4 + }, + { + "year": 2013, + "EIC": "3+kids", + "value": 0.45 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_basic_frac": { - "long_name": "Fraction of maximum earned income credit paid at zero earnings", + "title": "Fraction of maximum earned income credit paid at zero earnings", "description": "This fraction of EITC_c is always paid as a credit and one minus this fraction is applied to the phasein rate, EITC_rt. This fraction is zero under current law.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, instruction (table).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], - "indexable": false, - "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0.0, "max": 1.0}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "indexable": false, + "indexed": false, + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0.0, + "max": 1.0 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "EITC_prt": { - "long_name": "Earned income credit phaseout rate", + "title": "Earned income credit phaseout rate", "description": "Earned income credit begins to decrease at the this rate when AGI is higher than earned income credit phaseout start AGI.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, calculation (table: Max_EIC_base_income/Phaseout_Base).", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "EIC", - "vi_vals": ["0kids", "1kid", "2kids", "3+kids"], - "value_type": "real", - "value": [[0.0765, 0.1598, 0.2106, 0.2106]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "EIC": "0kids", + "value": 0.0765 + }, + { + "year": 2013, + "EIC": "1kid", + "value": 0.1598 + }, + { + "year": 2013, + "EIC": "2kids", + "value": 0.2106 + }, + { + "year": 2013, + "EIC": "3+kids", + "value": 0.2106 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_ps": { - "long_name": "Earned income credit phaseout start AGI", + "title": "Earned income credit phaseout start AGI", "description": "If AGI is higher than this threshold, the amount of EITC will start to decrease at the phaseout rate.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, instructions.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "EIC", - "vi_vals": ["0kids", "1kid", "2kids", "3+kids"], - "value_type": "real", - "value": [[7970.0, 17530.0, 17530.0, 17530.0], - [8110.0, 17830.0, 17830.0, 17830.0], - [8250.0, 18150.0, 18150.0, 18150.0], - [8270.0, 18190.0, 18190.0, 18190.0], - [8340.0, 18340.0, 18340.0, 18340.0], - [8490.0, 18660.0, 18660.0, 18660.0], - [8650.0, 19030.0, 19030.0, 19030.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "EIC": "0kids", + "value": 7970.0 + }, + { + "year": 2013, + "EIC": "1kid", + "value": 17530.0 + }, + { + "year": 2013, + "EIC": "2kids", + "value": 17530.0 + }, + { + "year": 2013, + "EIC": "3+kids", + "value": 17530.0 + }, + { + "year": 2014, + "EIC": "0kids", + "value": 8110.0 + }, + { + "year": 2014, + "EIC": "1kid", + "value": 17830.0 + }, + { + "year": 2014, + "EIC": "2kids", + "value": 17830.0 + }, + { + "year": 2014, + "EIC": "3+kids", + "value": 17830.0 + }, + { + "year": 2015, + "EIC": "0kids", + "value": 8250.0 + }, + { + "year": 2015, + "EIC": "1kid", + "value": 18150.0 + }, + { + "year": 2015, + "EIC": "2kids", + "value": 18150.0 + }, + { + "year": 2015, + "EIC": "3+kids", + "value": 18150.0 + }, + { + "year": 2016, + "EIC": "0kids", + "value": 8270.0 + }, + { + "year": 2016, + "EIC": "1kid", + "value": 18190.0 + }, + { + "year": 2016, + "EIC": "2kids", + "value": 18190.0 + }, + { + "year": 2016, + "EIC": "3+kids", + "value": 18190.0 + }, + { + "year": 2017, + "EIC": "0kids", + "value": 8340.0 + }, + { + "year": 2017, + "EIC": "1kid", + "value": 18340.0 + }, + { + "year": 2017, + "EIC": "2kids", + "value": 18340.0 + }, + { + "year": 2017, + "EIC": "3+kids", + "value": 18340.0 + }, + { + "year": 2018, + "EIC": "0kids", + "value": 8490.0 + }, + { + "year": 2018, + "EIC": "1kid", + "value": 18660.0 + }, + { + "year": 2018, + "EIC": "2kids", + "value": 18660.0 + }, + { + "year": 2018, + "EIC": "3+kids", + "value": 18660.0 + }, + { + "year": 2019, + "EIC": "0kids", + "value": 8650.0 + }, + { + "year": 2019, + "EIC": "1kid", + "value": 19030.0 + }, + { + "year": 2019, + "EIC": "2kids", + "value": 19030.0 + }, + { + "year": 2019, + "EIC": "3+kids", + "value": 19030.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "EITC_ps_MarriedJ": { - "long_name": "Extra earned income credit phaseout start AGI for married filling jointly", + "title": "Extra earned income credit phaseout start AGI for married filling jointly", "description": "This is the additional amount added on the regular phaseout start amount for taxpayers with filling status of married filing jointly.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, calculation (the difference between EIC phaseout bases of married jointly filers and other filers).", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "EIC", - "vi_vals": ["0kids", "1kid", "2kids", "3+kids"], - "value_type": "real", - "value": [[5340.0, 5340.0, 5340.0, 5340.0], - [5430.0, 5430.0, 5430.0, 5430.0], - [5500.0, 5500.0, 5500.0, 5500.0], - [5550.0, 5550.0, 5550.0, 5550.0], - [5590.0, 5590.0, 5590.0, 5590.0], - [5680.0, 5690.0, 5690.0, 5690.0], - [5800.0, 5790.0, 5790.0, 5790.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "EIC": "0kids", + "value": 5340.0 + }, + { + "year": 2013, + "EIC": "1kid", + "value": 5340.0 + }, + { + "year": 2013, + "EIC": "2kids", + "value": 5340.0 + }, + { + "year": 2013, + "EIC": "3+kids", + "value": 5340.0 + }, + { + "year": 2014, + "EIC": "0kids", + "value": 5430.0 + }, + { + "year": 2014, + "EIC": "1kid", + "value": 5430.0 + }, + { + "year": 2014, + "EIC": "2kids", + "value": 5430.0 + }, + { + "year": 2014, + "EIC": "3+kids", + "value": 5430.0 + }, + { + "year": 2015, + "EIC": "0kids", + "value": 5500.0 + }, + { + "year": 2015, + "EIC": "1kid", + "value": 5500.0 + }, + { + "year": 2015, + "EIC": "2kids", + "value": 5500.0 + }, + { + "year": 2015, + "EIC": "3+kids", + "value": 5500.0 + }, + { + "year": 2016, + "EIC": "0kids", + "value": 5550.0 + }, + { + "year": 2016, + "EIC": "1kid", + "value": 5550.0 + }, + { + "year": 2016, + "EIC": "2kids", + "value": 5550.0 + }, + { + "year": 2016, + "EIC": "3+kids", + "value": 5550.0 + }, + { + "year": 2017, + "EIC": "0kids", + "value": 5590.0 + }, + { + "year": 2017, + "EIC": "1kid", + "value": 5590.0 + }, + { + "year": 2017, + "EIC": "2kids", + "value": 5590.0 + }, + { + "year": 2017, + "EIC": "3+kids", + "value": 5590.0 + }, + { + "year": 2018, + "EIC": "0kids", + "value": 5680.0 + }, + { + "year": 2018, + "EIC": "1kid", + "value": 5690.0 + }, + { + "year": 2018, + "EIC": "2kids", + "value": 5690.0 + }, + { + "year": 2018, + "EIC": "3+kids", + "value": 5690.0 + }, + { + "year": 2019, + "EIC": "0kids", + "value": 5800.0 + }, + { + "year": 2019, + "EIC": "1kid", + "value": 5790.0 + }, + { + "year": 2019, + "EIC": "2kids", + "value": 5790.0 + }, + { + "year": 2019, + "EIC": "3+kids", + "value": 5790.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "EITC_MinEligAge": { - "long_name": "Minimum Age for Childless EITC Eligibility", + "title": "Minimum Age for Childless EITC Eligibility", "description": "For a childless filing unit, at least one individual's age needs to be no less than this age (but no greater than the EITC_MaxEligAge) in order to be eligible for an earned income tax credit.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, step 4, instructions.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "integer", - "value": [25], - "valid_values": {"min": 0, "max": 125}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "int", + "value": [ + { + "year": 2013, + "value": 25 + } + ], + "validators": { + "range": { + "min": 0, + "max": 125 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_MaxEligAge": { - "long_name": "Maximum Age for Childless EITC Eligibility", + "title": "Maximum Age for Childless EITC Eligibility", "description": "For a childless filing unit, at least one individual's age needs to be no greater than this age (but no less than the EITC_MinEligAge) in order to be eligible for an earned income tax credit.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, step 4, instructions.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "integer", - "value": [64], - "valid_values": {"min": 0, "max": 125}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "int", + "value": [ + { + "year": 2013, + "value": 64 + } + ], + "validators": { + "range": { + "min": 0, + "max": 125 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_InvestIncome_c": { - "long_name": "Maximum investment income before EITC reduction", + "title": "Maximum investment income before EITC reduction", "description": "The EITC amount is reduced when investment income exceeds this ceiling.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, instruction(step2)", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [3300.0, - 3350.0, - 3400.0, - 3400.0, - 3450.0, - 3500.0, - 3600.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 3300.0 + }, + { + "year": 2014, + "value": 3350.0 + }, + { + "year": 2015, + "value": 3400.0 + }, + { + "year": 2016, + "value": 3400.0 + }, + { + "year": 2017, + "value": 3450.0 + }, + { + "year": 2018, + "value": 3500.0 + }, + { + "year": 2019, + "value": 3600.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "EITC_excess_InvestIncome_rt": { - "long_name": "Rate of EITC reduction when investment income exceeds ceiling", + "title": "Rate of EITC reduction when investment income exceeds ceiling", "description": "The EITC amount is reduced at this rate per dollar of investment income exceeding the ceiling.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "Form 1040, line 17, instruction(step2)", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [9e99], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_indiv": { - "long_name": "EITC is computed for each spouse based on individual earnings", + "title": "EITC is computed for each spouse based on individual earnings", "description": "Current-law value is false implying EITC is filing-unit based; a value of true implies EITC is computed for each individual wage earner. The additional phaseout start for joint filers is not affected by this parameter, nor are investment income and age eligibilty rules.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "EITC_sep_filers_elig": { - "long_name": "Separate filers are eligibile for the EITC", + "title": "Separate filers are eligibile for the EITC", "description": "Current-law value is false, implying ineligibility.", + "notes": "", "section_1": "Refundable Credits", "section_2": "Earned Income Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "RPTC_c": { - "long_name": "Maximum refundable payroll tax credit", + "title": "Maximum refundable payroll tax credit", "description": "This is the maximum amount of the refundable payroll tax credit for each taxpayer/spouse.", + "notes": "Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.", "section_1": "Refundable Credits", "section_2": "Refundable Payroll Tax Credit", - "irs_ref": "", - "notes": "Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "RPTC_rt": { - "long_name": "Refundable payroll tax credit phasein rate", + "title": "Refundable payroll tax credit phasein rate", "description": "Pre-phaseout credit is minimum of this rate times earnings and the maximum refundable payroll tax credit, where earnings is defined as in FICA and SECA.", + "notes": "Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.", "section_1": "Refundable Credits", "section_2": "Refundable Payroll Tax Credit", - "irs_ref": "", - "notes": "Positive values of RPTC_c and RPTC_rt can be used to emulate a payroll tax exemption, the implied value of which is RPTC_c divided by RPTC_rt.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "LLC_Expense_c": { - "long_name": "Lifetime learning credit expense limit", + "title": "Lifetime learning credit expense limit", "description": "The maximum expense eligible for lifetime learning credit, per child.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 8863, line 11, in-line.", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [10000.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 10000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ETC_pe_Single": { - "long_name": "Education tax credit phaseout ends (Single)", + "title": "Education tax credit phaseout ends (Single)", "description": "The education tax credit will be zero for those taxpayers of single filing status with modified AGI (in thousands) higher than this level.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 8863, line 13, inline.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [63.0, - 64.0, - 65.0, - 65.0, - 66.0, - 67.0, - 68.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 63.0 + }, + { + "year": 2014, + "value": 64.0 + }, + { + "year": 2015, + "value": 65.0 + }, + { + "year": 2016, + "value": 65.0 + }, + { + "year": 2017, + "value": 66.0 + }, + { + "year": 2018, + "value": 67.0 + }, + { + "year": 2019, + "value": 68.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ETC_pe_Married": { - "long_name": "Education tax credit phaseout ends (Married)", + "title": "Education tax credit phaseout ends (Married)", "description": "The education tax credit will be zero for those taxpayers of married filing status with modified AGI level (in thousands) higher than this level.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "Form 8863, line 13, inline.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [127.0, - 128.0, - 130.0, - 131.0, - 132.0, - 134.0, - 136.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 127.0 + }, + { + "year": 2014, + "value": 128.0 + }, + { + "year": 2015, + "value": 130.0 + }, + { + "year": 2016, + "value": 131.0 + }, + { + "year": 2017, + "value": 132.0 + }, + { + "year": 2018, + "value": 134.0 + }, + { + "year": 2019, + "value": 136.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } + }, "ACTC_rt": { - "long_name": "Additional Child Tax Credit rate", + "title": "Additional Child Tax Credit rate", "description": "This is the fraction of earnings used in calculating the ACTC, which is a partially refundable credit that supplements the CTC for some taxpayers.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Additional Child Tax Credit", - "irs_ref": "Form 8812, line 8, inline.", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.15], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.15 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ACTC_rt_bonus_under5family": { - "long_name": "Bonus additional child tax credit rate for families with qualifying children under 5", + "title": "Bonus additional child tax credit rate for families with qualifying children under 5", "description": "For families with qualifying children under 5 years old, this bonus rate is added to the fraction of earnings (additional child tax credit rate) used in calculating the ACTC.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Additional Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "ACTC_Income_thd": { - "long_name": "Additional Child Tax Credit income threshold", + "title": "Additional Child Tax Credit income threshold", "description": "The portion of earned income below this threshold does not count as base for the Additional Child Tax Credit.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Additional Child Tax Credit", - "irs_ref": "Form 8812, line 7, in-line.", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019, - 2020, - 2021, - 2022, - 2023, - 2024, - 2025, - 2026], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [3000.0, - 3000.0, - 3000.0, - 3000.0, - 3000.0, - 2500.0, - 2500.0, - 2500.0, - 2500.0, - 2500.0, - 2500.0, - 2500.0, - 2500.0, - 3000.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 3000.0 + }, + { + "year": 2014, + "value": 3000.0 + }, + { + "year": 2015, + "value": 3000.0 + }, + { + "year": 2016, + "value": 3000.0 + }, + { + "year": 2017, + "value": 3000.0 + }, + { + "year": 2018, + "value": 2500.0 + }, + { + "year": 2019, + "value": 2500.0 + }, + { + "year": 2026, + "value": 3000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "ACTC_ChildNum": { - "long_name": "Additional Child Tax Credit minimum number of qualified children for different formula", + "title": "Additional Child Tax Credit minimum number of qualified children for different formula", "description": "Families with this number of qualified children or more may qualify for a different formula to calculate the Additional Child Tax Credit, which is a partially refundable credit that supplements the Child Tax Credit for some taxpayers.", + "notes": "", "section_1": "Child/Dependent Credits", "section_2": "Additional Child Tax Credit", - "irs_ref": "Form 8812, Part II. ", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "integer", - "value": [3], - "valid_values": {"min": 0, "max": 99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "int", + "value": [ + { + "year": 2013, + "value": 3 + } + ], + "validators": { + "range": { + "min": 0, + "max": 99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_c": { - "long_name": "New refundable child tax credit maximum amount per child", + "title": "New refundable child tax credit maximum amount per child", "description": "In addition to all credits currently available for dependents, this parameter gives each qualifying child a new refundable credit with this maximum amount.", + "notes": "Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_new_c_under5_bonus": { - "long_name": "Bonus new refundable child tax credit maximum for qualifying children under five", + "title": "Bonus new refundable child tax credit maximum for qualifying children under five", "description": "The maximum amount of the new refundable child tax credit allowed for each child is increased by this amount for qualifying children under 5 years old.", + "notes": "", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": true, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_new_for_all": { - "long_name": "Whether or not maximum amount of the new refundable child tax credit is available to all", + "title": "Whether or not maximum amount of the new refundable child tax credit is available to all", "description": "The maximum amount of the new refundable child tax credit does not depend on AGI when true; otherwise, see CTC_new_rt.", + "notes": "", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_rt": { - "long_name": "New refundable child tax credit amount phasein rate", + "title": "New refundable child tax credit amount phasein rate", "description": "The maximum amount of the new child tax credit is increased at this rate per dollar of positive AGI until CTC_new_c times the number of qualified children is reached if CTC_new_for_all is false; if CTC_new_for_all is true, there is no AGI limitation to the maximum amount.", + "notes": "Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "Child age qualification for the new child tax credit is the same as under current-law Child Tax Credit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_ps": { - "long_name": "New refundable child tax credit phaseout starting AGI", + "title": "New refundable child tax credit phaseout starting AGI", "description": "The total amount of new child tax credit is reduced for taxpayers with AGI higher than this level.", + "notes": "", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "CTC_new_prt": { - "long_name": "New refundable child tax credit amount phaseout rate", + "title": "New refundable child tax credit amount phaseout rate", "description": "The total amount of the new child tax credit is reduced at this rate per dollar exceeding the phaseout starting AGI, CTC_new_ps.", + "notes": "", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_refund_limited": { - "long_name": "New child tax credit refund limited to a decimal fraction of payroll taxes", + "title": "New child tax credit refund limited to a decimal fraction of payroll taxes", "description": "Specifies whether the new child tax credit refund is limited by the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt).", + "notes": "Set this parameter to true to limit the refundability or false to allow full refundability for all taxpayers.", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "Set this parameter to true to limit the refundability or false to allow full refundability for all taxpayers.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_refund_limit_payroll_rt": { - "long_name": "New child tax credit refund limit rate (decimal fraction of payroll taxes)", + "title": "New child tax credit refund limit rate (decimal fraction of payroll taxes)", "description": "The fraction of payroll taxes (employee plus employer shares, but excluding all Medicare payroll taxes) that serves as a limit to the amount of new child tax credit that can be refunded.", + "notes": "Set this parameter to zero for no refundability; set it to 9e99 for unlimited refundability for taxpayers with payroll tax liabilities.", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "Set this parameter to zero for no refundability; set it to 9e99 for unlimited refundability for taxpayers with payroll tax liabilities.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CTC_new_refund_limited_all_payroll": { - "long_name": "New child tax credit refund limit applies to all FICA taxes, not just OASDI", + "title": "New child tax credit refund limit applies to all FICA taxes, not just OASDI", "description": "Specifies whether the new child tax credit refund limit rate (_CTC_new_refund_limit_payroll_rt) applies to all FICA taxes (true) or just OASDI taxes (false).", + "notes": "If the new CTC is limited, set this parameter to true to limit the refundability to all FICA taxes or false to limit refundabiity to OASDI taxes.", "section_1": "Refundable Credits", "section_2": "New Refundable Child Tax Credit", - "irs_ref": "", - "notes": "If the new CTC is limited, set this parameter to true to limit the refundability to all FICA taxes or false to limit refundabiity to OASDI taxes.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "FST_AGI_trt": { - "long_name": "New minimum tax; rate as a decimal fraction of AGI", + "title": "New minimum tax; rate as a decimal fraction of AGI", "description": "Individual income taxes and the employee share of payroll taxes are credited against this minimum tax, so the surtax is the difference between the tax rate times AGI and the credited taxes. The new minimum tax is similar to the Fair Share Tax, except that no credits are exempted from the base.", + "notes": "", "section_1": "Surtaxes", "section_2": "New Minimum Tax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "FST_AGI_thd_lo": { - "long_name": "Minimum AGI needed to be subject to the new minimum tax", + "title": "Minimum AGI needed to be subject to the new minimum tax", "description": "A taxpayer is only subject to the new minimum tax if they exceed this level of AGI.", + "notes": "", "section_1": "Surtaxes", "section_2": "New Minimum Tax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6], - [1.0e6, 1.0e6, 0.5e6, 1.0e6, 1.0e6]], - "valid_values": {"min": 0, "max": "FST_AGI_thd_hi"}, - "invalid_minmsg": "", - "invalid_maxmsg": "for FST_AGI_thd_hi", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 500000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 1000000.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": "FST_AGI_thd_hi" + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "FST_AGI_thd_hi": { - "long_name": "AGI level at which the New Minimum Tax is fully phased in", + "title": "AGI level at which the New Minimum Tax is fully phased in", "description": "The new minimum tax will be fully phased in at this level of AGI. If there is no phase-in, this upper threshold should be set equal to the lower AGI threshold.", + "notes": "", "section_1": "Surtaxes", "section_2": "New Minimum Tax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6], - [2.0e6, 2.0e6, 1.0e6, 2.0e6, 2.0e6]], - "valid_values": {"min": "FST_AGI_thd_lo", "max": 9e99}, - "invalid_minmsg": "for FST_AGI_thd_lo", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2014, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2014, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2015, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2015, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2016, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2016, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2017, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2017, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2018, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2018, + "MARS": "widow", + "value": 2000000.0 + }, + { + "year": 2019, + "MARS": "single", + "value": 2000000.0 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 2000000.0 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 1000000.0 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 2000000.0 + }, + { + "year": 2019, + "MARS": "widow", + "value": 2000000.0 + } + ], + "validators": { + "range": { + "min": "FST_AGI_thd_lo", + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "AGI_surtax_trt": { - "long_name": "New AGI surtax rate", + "title": "New AGI surtax rate", "description": "The surtax rate is applied to the portion of Adjusted Gross Income above the AGI surtax threshold.", + "notes": "", "section_1": "Surtaxes", "section_2": "New AGI Surtax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "AGI_surtax_thd": { - "long_name": "Threshold for the new AGI surtax", + "title": "Threshold for the new AGI surtax", "description": "The aggregate gross income above this AGI surtax threshold is taxed at surtax rate on AGI.", + "notes": "", "section_1": "Surtaxes", "section_2": "New AGI Surtax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99], - [9e99, 9e99, 9e99, 9e99, 9e99]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2013, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2014, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2015, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2016, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2017, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2018, + "MARS": "widow", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "single", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mjoint", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "mseparate", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "headhh", + "value": 9e+99 + }, + { + "year": 2019, + "MARS": "widow", + "value": 9e+99 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "LST": { - "long_name": "Dollar amount of lump-sum tax", + "title": "Dollar amount of lump-sum tax", "description": "The lump-sum tax is levied on every member of a tax filing unit. The lump-sum tax is included only in combined taxes; it is not included in income or payroll taxes.", + "notes": "", "section_1": "Surtaxes", "section_2": "Lump-Sum Tax", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": -9e99, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": -9e+99, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "UBI_u18": { - "long_name": "UBI benefit for those under 18", + "title": "UBI benefit for those under 18", "description": "UBI benefit provided to people under 18.", + "notes": "", "section_1": "Universal Basic Income", "section_2": "UBI Benefits", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "UBI_1820": { - "long_name": "UBI benefit for those 18 through 20", + "title": "UBI benefit for those 18 through 20", "description": "UBI benefit provided to people 18-20 years of age.", + "notes": "", "section_1": "Universal Basic Income", "section_2": "UBI Benefits", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "UBI_21": { - "long_name": "UBI benefit for those 21 and over", + "title": "UBI benefit for those 21 and over", "description": "UBI benefit provided to people 21 and over.", + "notes": "", "section_1": "Universal Basic Income", "section_2": "UBI Benefits", - "irs_ref": "", - "notes": "", - "value_yrs": [2013, - 2014, - 2015, - 2016, - 2017, - 2018, - 2019], "indexable": true, "indexed": true, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} - }, - + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + }, + { + "year": 2014, + "value": 0.0 + }, + { + "year": 2015, + "value": 0.0 + }, + { + "year": 2016, + "value": 0.0 + }, + { + "year": 2017, + "value": 0.0 + }, + { + "year": 2018, + "value": 0.0 + }, + { + "year": 2019, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } + }, "UBI_ecrt": { - "long_name": "Fraction of UBI benefits excluded from AGI", + "title": "Fraction of UBI benefits excluded from AGI", "description": "One minus this fraction of UBI benefits are taxable and will be added to AGI.", + "notes": "", "section_1": "Universal Basic Income", "section_2": "UBI Taxability", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CR_RetirementSavings_hc": { - "long_name": "Credit for retirement savings haircut", + "title": "Credit for retirement savings haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the retirement savings credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*RetirementSavingsCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*RetirementSavingsCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_ForeignTax_hc": { - "long_name": "Credit for foreign tax haircut", + "title": "Credit for foreign tax haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the foreign tax credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*ForeignTaxCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*ForeignTaxCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_ResidentialEnergy_hc": { - "long_name": "Credit for residential energy haircut", + "title": "Credit for residential energy haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the residential energy credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*ResidentialEnergyCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*ResidentialEnergyCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_GeneralBusiness_hc": { - "long_name": "Credit for general business haircut", + "title": "Credit for general business haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the general business credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*GeneralBusinessCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*GeneralBusinessCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_MinimumTax_hc": { - "long_name": "Credit for previous year minimum tax credit haircut", + "title": "Credit for previous year minimum tax credit haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the previous year minimum tax credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*PreviousYearMinimumTaxCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*PreviousYearMinimumTaxCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_AmOppRefundable_hc": { - "long_name": "Refundable portion of the American Opportunity Credit haircut", + "title": "Refundable portion of the American Opportunity Credit haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the refundable American Opportunity credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*RefundablePortionOfAmericanOpportunityCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*RefundablePortionOfAmericanOpportunityCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_AmOppNonRefundable_hc": { - "long_name": "Nonrefundable portion of the American Opportunity Credit haircut", + "title": "Nonrefundable portion of the American Opportunity Credit haircut", "description": "If greater than zero, this decimal fraction reduces the portion of the nonrefundable American Opportunity credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*NonRefundablePortionOfAmericanOpportunityCredit.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*NonRefundablePortionOfAmericanOpportunityCredit.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_SchR_hc": { - "long_name": "Schedule R Credit haircut", + "title": "Schedule R Credit haircut", "description": "If greater than zero, this decimal fraction reduces the portion of Schedule R credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*ScheduleRCredit", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*ScheduleRCredit", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_OtherCredits_hc": { - "long_name": "Other Credits haircut", + "title": "Other Credits haircut", "description": "If greater than zero, this decimal fraction reduces the portion of other credit that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*OtherCredits.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*OtherCredits.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_Education_hc": { - "long_name": "Education Credits haircut", + "title": "Education Credits haircut", "description": "If greater than zero, this decimal fraction reduces the portion of education credits that can be claimed.", + "notes": "Credit claimed will be (1-Haircut)*EducationCredits.", "section_1": "Nonrefundable Credits", "section_2": "Misc. Credit Limits", - "irs_ref": "", - "notes": "Credit claimed will be (1-Haircut)*EducationCredits.", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": false} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": false + } }, - "CR_Charity_rt": { - "long_name": "Charity Credit rate", + "title": "Charity Credit rate", "description": "If greater than zero, this decimal fraction represents the portion of total charitable contributions provided as a nonrefundable tax credit.", + "notes": "Credit claimed will be (rt) * (e19800 + e20100)", "section_1": "", "section_2": "", - "irs_ref": "", - "notes": "Credit claimed will be (rt) * (e19800 + e20100)", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CR_Charity_f": { - "long_name": "Charity Credit Floor", + "title": "Charity Credit Floor", "description": "Only charitable giving in excess of this dollar amount is eligible for the charity credit.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "MARS", - "vi_vals": ["single", "mjoint", "mseparate", "headhh", "widow"], - "value_type": "real", - "value": [[0.0, 0.0, 0.0, 0.0, 0.0]], - "valid_values": {"min": 0, "max": 9e99}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "MARS": "single", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mjoint", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "mseparate", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "headhh", + "value": 0.0 + }, + { + "year": 2013, + "MARS": "widow", + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 9e+99 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "CR_Charity_frt": { - "long_name": "Charity Credit Floor Rate", + "title": "Charity Credit Floor Rate", "description": "Only charitable giving in excess of this decimal fraction of AGI is eligible for the charity credit.", + "notes": "", "section_1": "", "section_2": "", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "real", - "value": [0.0], - "valid_values": {"min": 0, "max": 1}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "float", + "value": [ + { + "year": 2013, + "value": 0.0 + } + ], + "validators": { + "range": { + "min": 0, + "max": 1 + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "BEN_ssi_repeal": { - "long_name": "SSI benefit repeal switch", + "title": "SSI benefit repeal switch", "description": "SSI benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_housing_repeal": { - "long_name": "Housing benefit repeal switch", + "title": "Housing benefit repeal switch", "description": "Housing benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_snap_repeal": { - "long_name": "SNAP benefit repeal switch", + "title": "SNAP benefit repeal switch", "description": "SNAP benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_tanf_repeal": { - "long_name": "TANF benefit repeal switch", + "title": "TANF benefit repeal switch", "description": "TANF benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_vet_repeal": { - "long_name": "Veterans benefit repeal switch", + "title": "Veterans benefit repeal switch", "description": "Veterans benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_wic_repeal": { - "long_name": "WIC benefit repeal switch", + "title": "WIC benefit repeal switch", "description": "WIC benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_mcare_repeal": { - "long_name": "Medicare benefit repeal switch", + "title": "Medicare benefit repeal switch", "description": "Medicare benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_mcaid_repeal": { - "long_name": "Medicaid benefit repeal switch", + "title": "Medicaid benefit repeal switch", "description": "Medicaid benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } }, - "BEN_oasdi_repeal": { - "long_name": "Social Security benefit repeal switch", + "title": "Social Security benefit repeal switch", "description": "Social Security benefits (e02400) can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "BEN_ui_repeal": { - "long_name": "Unemployment insurance benefit repeal switch", + "title": "Unemployment insurance benefit repeal switch", "description": "Unemployment insurance benefits (e02300) can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": true, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": true, + "cps": true + } }, - "BEN_other_repeal": { - "long_name": "Other benefit repeal switch", + "title": "Other benefit repeal switch", "description": "Other benefits can be repealed by switching this parameter to true.", + "notes": "", "section_1": "Benefits", "section_2": "Benefit Repeal", - "irs_ref": "", - "notes": "", - "value_yrs": [2013], "indexable": false, "indexed": false, - "vi_name": "", - "vi_vals": [], - "value_type": "boolean", - "value": [false], - "valid_values": {"min": false, "max": true}, - "invalid_minmsg": "", - "invalid_maxmsg": "", - "invalid_action": "stop", - "compatible_data": {"puf": false, "cps": true} + "type": "bool", + "value": [ + { + "year": 2013, + "value": false + } + ], + "validators": { + "range": { + "min": false, + "max": true + } + }, + "compatible_data": { + "puf": false, + "cps": true + } } -} +} \ No newline at end of file diff --git a/taxcalc/taxcalcio.py b/taxcalc/taxcalcio.py index 6aee11a6b..a60116e5a 100644 --- a/taxcalc/taxcalcio.py +++ b/taxcalc/taxcalcio.py @@ -11,6 +11,7 @@ import sqlite3 import numpy as np import pandas as pd +import paramtools from taxcalc.policy import Policy from taxcalc.records import Records from taxcalc.consumption import Consumption @@ -245,7 +246,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, gdiff_baseline = GrowDiff() try: gdiff_baseline.update_growdiff(paramdict['growdiff_baseline']) - except ValueError as valerr_msg: + except paramtools.ValidationError as valerr_msg: self.errmsg += valerr_msg.__str__() # create GrowFactors base object that incorporates gdiff_baseline gfactors_base = GrowFactors() @@ -254,7 +255,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, gdiff_response = GrowDiff() try: gdiff_response.update_growdiff(paramdict['growdiff_response']) - except ValueError as valerr_msg: + except paramtools.ValidationError as valerr_msg: self.errmsg += valerr_msg.__str__() # create GrowFactors ref object that has all gdiff objects applied gfactors_ref = GrowFactors() @@ -265,10 +266,10 @@ def init(self, input_data, tax_year, baseline, reform, assump, base = Policy(gfactors=gfactors_base) try: base.implement_reform(basedict['policy'], - print_warnings=False, + print_warnings=True, raise_errors=False) self.errmsg += base.parameter_errors - except ValueError as valerr_msg: + except paramtools.ValidationError as valerr_msg: self.errmsg += valerr_msg.__str__() # ... the reform Policy object if self.specified_reform: @@ -276,10 +277,10 @@ def init(self, input_data, tax_year, baseline, reform, assump, for poldict in policydicts: try: pol.implement_reform(poldict, - print_warnings=False, + print_warnings=True, raise_errors=False) self.errmsg += pol.parameter_errors - except ValueError as valerr_msg: + except paramtools.ValidationError as valerr_msg: self.errmsg += valerr_msg.__str__() else: pol = Policy(gfactors=gfactors_base) @@ -287,7 +288,7 @@ def init(self, input_data, tax_year, baseline, reform, assump, con = Consumption() try: con.update_consumption(paramdict['consumption']) - except ValueError as valerr_msg: + except paramtools.ValidationError as valerr_msg: self.errmsg += valerr_msg.__str__() # check for valid tax_year value if tax_year < pol.start_year: diff --git a/taxcalc/tests/test_4package.py b/taxcalc/tests/test_4package.py index edd121311..655908464 100644 --- a/taxcalc/tests/test_4package.py +++ b/taxcalc/tests/test_4package.py @@ -36,7 +36,8 @@ def test_for_consistency(tests_path): 'pytest-xdist', 'pycodestyle', 'pylint', - 'coverage' + 'coverage', + "paramtools>=0.14.0" ]) # read conda.recipe/meta.yaml requirements meta_file = os.path.join(tests_path, '..', '..', diff --git a/taxcalc/tests/test_consumption.py b/taxcalc/tests/test_consumption.py index 79413ec68..1c16ed0a0 100644 --- a/taxcalc/tests/test_consumption.py +++ b/taxcalc/tests/test_consumption.py @@ -2,6 +2,7 @@ # pycodestyle test_consumption.py import numpy as np +import paramtools import pytest import copy from taxcalc import Policy, Records, Calculator, Consumption @@ -57,19 +58,19 @@ def test_update_consumption(): def test_incorrect_update_consumption(): - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption([]) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_e17500': {'xyz': 0.2}}) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_e17500': {2012: 0.2}}) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_e17500': {2052: 0.2}}) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_exxxxx': {2014: 0.2}}) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_e17500': {2014: -0.1}}) - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): Consumption().update_consumption({'MPC_e17500-indexed': {2014: 0.1}}) @@ -98,12 +99,12 @@ def test_future_update_consumption(): def test_consumption_default_data(): consump = Consumption() - pdata = consump._vals + pdata = consump.specification(meta_data=True, ignore_state=True) for pname in pdata.keys(): if pname.startswith('MPC'): - assert pdata[pname]['value'] == [0.0] + assert pdata[pname]['value'] == [{"value": 0.0, "year": 2013}] elif pname.startswith('BEN'): - assert pdata[pname]['value'] == [1.0] + assert pdata[pname]['value'] == [{"value": 1.0, "year": 2013}] def test_consumption_response(cps_subsample): diff --git a/taxcalc/tests/test_decorators.py b/taxcalc/tests/test_decorators.py index 9c4e1b767..1ad4fc164 100644 --- a/taxcalc/tests/test_decorators.py +++ b/taxcalc/tests/test_decorators.py @@ -45,8 +45,8 @@ def test_create_toplevel_function_string_mult_outputs(): " return x\n" " outputs = \\\n" " (pm.a, pm.b) = \\\n" - " applied_f(get_values(pm.a), get_values(pm.b), " - "get_values(pf.d), get_values(pm.e), )\n" + " applied_f(get_values(pm.a[0]), get_values(pm.b[0]), " + "get_values(pf.d), get_values(pm.e[0]), )\n" " header = ['a', 'b']\n" " return DataFrame(data=np.column_stack(outputs)," "columns=header)") @@ -69,8 +69,8 @@ def test_create_toplevel_function_string(): " return x\n" " outputs = \\\n" " (pm.a) = \\\n" - " applied_f(get_values(pm.a), get_values(pf.d), " - "get_values(pm.e), )\n" + " applied_f(get_values(pm.a[0]), get_values(pf.d), " + "get_values(pm.e[0]), )\n" " header = ['a']\n" " return DataFrame(data=outputs," "columns=header)") @@ -167,8 +167,8 @@ def test_magic_apply_jit_swap(): def test_magic_iterate_jit(): pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) @@ -212,8 +212,8 @@ def Magic_calc3(x, y, z): def test_function_takes_kwarg(): pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) @@ -233,8 +233,8 @@ def Magic_calc4(x, y, z): def test_function_no_parameters_listed(): pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) @@ -254,9 +254,9 @@ def Magic_calc5(w, x, y, z): def test_function_parameters_optional(): pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) - pm.w = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) + pm.w = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) @@ -288,9 +288,9 @@ def test_iterate_jit_raises_on_unknown_return_argument(): uf2 = ij(unjittable_function2) pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) - pm.w = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) + pm.w = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) @@ -317,9 +317,9 @@ def test_force_no_jit(): Magic_calc6_ = iterate_jit(parameters=['w'], nopython=True)(Magic_calc6) pm = Foo() pf = Foo() - pm.a = np.ones((5,)) - pm.b = np.ones((5,)) - pm.w = np.ones((5,)) + pm.a = np.ones((1, 5)) + pm.b = np.ones((1, 5)) + pm.w = np.ones((1, 5)) pf.x = np.ones((5,)) pf.y = np.ones((5,)) pf.z = np.ones((5,)) diff --git a/taxcalc/tests/test_growdiff.py b/taxcalc/tests/test_growdiff.py index fb0d22a7c..74bd49db5 100644 --- a/taxcalc/tests/test_growdiff.py +++ b/taxcalc/tests/test_growdiff.py @@ -62,6 +62,8 @@ def test_description_punctuation(tests_path): dct = json.load(jsonfile) all_desc_ok = True for param in dct.keys(): + if param == "schema": + continue if not dct[param]['description'].endswith('.'): all_desc_ok = False print('param,description=', @@ -79,6 +81,8 @@ def test_boolean_value_infomation(tests_path): with open(path, 'r') as gddfile: gdd = json.load(gddfile) for param in gdd.keys(): + if param == "schema": + continue val = gdd[param]['value'] if isinstance(val, list): val = val[0] @@ -89,7 +93,7 @@ def test_boolean_value_infomation(tests_path): val_is_boolean = True else: val_is_boolean = False - type_is_boolean = gdd[param]['value_type'] == 'boolean' + type_is_boolean = gdd[param]['type'] == 'bool' if val_is_boolean and not type_is_boolean: print('param,value_type,val,val_is_boolean=', str(param), diff --git a/taxcalc/tests/test_parameters.py b/taxcalc/tests/test_parameters.py index 5becef221..720288b47 100644 --- a/taxcalc/tests/test_parameters.py +++ b/taxcalc/tests/test_parameters.py @@ -5,11 +5,13 @@ # pycodestyle test_parameters.py # pylint --disable=locally-disabled test_parameters.py +import copy import os import json import math import tempfile import numpy as np +import paramtools import pytest # pylint: disable=import-error from taxcalc import Parameters, Policy, Consumption, GrowFactors @@ -24,34 +26,61 @@ # Params class, which is defined in the test_params_class function. -PARAMS_JSON = """ -{ -"real_param": { - "value_type": "real", - "value_yrs": [2001, 2002, 2003], - "value": [0.5, 0.5, 0.5], - "valid_values": {"min": 0, "max": 1} -}, -"int_param": { - "value_type": "integer", - "value_yrs": [2001, 2002, 2003], - "value": [2, 2, 2], - "valid_values": {"min": 0, "max": 9} -}, -"bool_param": { - "value_type": "boolean", - "value_yrs": [2001, 2002, 2003], - "value": [true, true, true], - "valid_values": {"min": false, "max": true} -}, -"str_param": { - "value_type": "string", - "value_yrs": [2001, 2002, 2003], - "value": ["linear", "linear", "linear"], - "valid_values": {"options": ["linear", "nonlinear", "cubic"]} -} -} -""" +PARAMS_JSON = json.dumps({ + "schema": { + "labels": { + "year": { + "type": "int", + "validators": {"range": {"min": 2001, "max": 2010}} + }, + "label": { + "type": "str", + "validators": {"choice": {"choices": ["label1", "label2"]}} + } + }, + "operators": { + "array_first": True, + "label_to_extend": "year" + } + }, + "real_param": { + "title": "Real (float) parameter", + "description": "", + "type": "float", + "value": 0.5, + "validators": {"range": {"min": 0, "max": 1}} + }, + "int_param": { + "title": "Integer parameter", + "description": "", + "type": "int", + "value": 2, + "validators": {"range": {"min": 0, "max": 9}} + }, + "bool_param": { + "title": "Boolean parameter", + "description": "", + "type": "bool", + "value": True, + }, + "str_param": { + "title": "String parameter", + "description": "", + "type": "str", + "value": "linear", + "validators": {"choice": {"choices": ["linear", "nonlinear", "cubic"]}} + }, + "label_param": { + "title": "Parameter that uses labels.", + "description": "", + "type": "int", + "value": [ + {"label": "label1", "year": 2001, "value": 2}, + {"label": "label2", "year": 2001, "value": 3} + ], + "validators": {"range": {"min": 0, "max": 9}} + } +}) @pytest.fixture(scope='module', name='params_json_file') @@ -70,12 +99,17 @@ def fixture_params_json_file(): ({}, ""), ({'real_param': {2004: 1.9}}, "error"), ({'int_param': {2004: [3.6]}}, "raise"), + ({"int_param": {2004: [3]}}, "raise"), + ({"label_param": {2004: [1, 2]}}, "noerror"), + ({"label_param": {2004: [[1, 2]]}}, "raise"), + ({"label_param": {2004: [1, 2, 3]}}, "raise"), ({'bool_param': {2004: [4.9]}}, "raise"), ({'str_param': {2004: [9]}}, "raise"), ({'str_param': {2004: 'nonlinear'}}, "noerror"), ({'str_param': {2004: 'unknownvalue'}}, "error"), ({'str_param': {2004: ['nonlinear']}}, "raise"), ({'real_param': {2004: 'linear'}}, "raise"), + ({'real_param': {2004: [0.2, 0.3]}}, "raise"), ({'real_param-indexed': {2004: True}}, "raise"), ({'unknown_param-indexed': {2004: False}}, "raise") ]) @@ -116,23 +150,24 @@ def update_params(self, revision, assert prms.wage_growth_rates() == list() prms.set_year(2010) assert prms.current_year == 2010 - with pytest.raises(ValueError): + with pytest.raises(paramtools.ValidationError): prms.set_year(2011) return + if expect == 'raise': - with pytest.raises(ValueError): - prms.update_params(revision, - print_warnings=False, - raise_errors=False) + with pytest.raises(paramtools.ValidationError): + prms.update_params(revision) elif expect == 'noerror': - prms.update_params(revision, print_warnings=False, raise_errors=False) - assert not prms.parameter_errors + prms.update_params(revision) + assert not prms.errors elif expect == 'error': - prms.update_params(revision, print_warnings=False, raise_errors=False) - assert prms.parameter_errors + with pytest.raises(paramtools.ValidationError): + prms.update_params(revision) + assert prms.errors elif expect == 'warn': - prms.update_params(revision, print_warnings=False, raise_errors=False) - assert prms.parameter_warnings + with pytest.raises(paramtools.ValidationError): + prms.update_params(revision) + assert prms.warnings @pytest.mark.parametrize("fname", @@ -143,18 +178,9 @@ def test_json_file_contents(tests_path, fname): """ Check contents of JSON parameter files in Tax-Calculator/taxcalc directory. """ - # pylint: disable=too-many-locals,too-many-branches,too-many-statements - # specify test information - required_keys = ['long_name', 'description', - 'value_type', 'value_yrs', 'value', 'valid_values'] - valid_value_types = ['boolean', 'integer', 'real', 'string'] - if fname == 'policy_current_law.json': - invalid_keys = ['invalid_minmsg', 'invalid_maxmsg', 'invalid_action'] - else: - invalid_keys = [] first_year = Policy.JSON_START_YEAR last_known_year = Policy.LAST_KNOWN_YEAR # for indexed parameter values - num_known_years = last_known_year - first_year + 1 + known_years = set(range(first_year, last_known_year + 1)) long_params = ['II_brk1', 'II_brk2', 'II_brk3', 'II_brk4', 'II_brk5', 'II_brk6', 'II_brk7', 'PT_brk1', 'PT_brk2', 'PT_brk3', 'PT_brk4', @@ -164,41 +190,18 @@ def test_json_file_contents(tests_path, fname): 'STD', 'II_em', 'II_em_ps', 'AMT_em', 'AMT_em_ps', 'AMT_em_pe', 'ID_ps', 'ID_AllTaxes_c'] - long_known_years = 2026 - first_year + 1 # for TCJA-reverting long_params - # read JSON parameter file into a dictionary - path = os.path.join(tests_path, '..', fname) - pfile = open(path, 'r') - allparams = json.load(pfile) - pfile.close() - assert isinstance(allparams, dict) + # for TCJA-reverting long_params + long_known_years = set(range(first_year, last_known_year + 1)) + long_known_years.add(2026) # check elements in each parameter sub-dictionary failures = '' + with open(os.path.join(tests_path, "..", fname)) as f: + allparams = json.loads(f.read()) for pname in allparams: - # all parameter names should be strings - assert isinstance(pname, str) + if pname == "schema": + continue # check that param contains required keys param = allparams[pname] - assert isinstance(param, dict) - for key in required_keys: - assert key in param - if param['value_type'] == 'string': - for key in invalid_keys: - assert key not in param - assert isinstance(param['valid_values']['options'], list) - else: - for key in invalid_keys: - assert key in param - assert param.get('invalid_action', 'stop') in ['stop', 'warn'] - # check for non-empty long_name and description strings - assert isinstance(param['long_name'], str) - if not param['long_name']: - assert '{} long_name'.format(pname) == 'empty string' - assert isinstance(param['description'], str) - if not param['description']: - assert '{} description'.format(pname) == 'empty string' - # check that indexable and indexed are boolean - assert isinstance(param.get('indexable', False), bool) - assert isinstance(param.get('indexed', False), bool) # check that indexable and indexed are False in many files if fname != 'policy_current_law.json': assert param.get('indexable', False) is False @@ -210,75 +213,40 @@ def test_json_file_contents(tests_path, fname): param.get('indexed', False), param.get('indexable', False)) failures += fail + '\n' - # check that value_type is correct string - if not param['value_type'] in valid_value_types: - msg = 'param:<{}>; value_type={}' - fail = msg.format(pname, param['value_type']) - failures += fail + '\n' - # check that indexable param has value_type real - if param.get('indexable', False) and param['value_type'] != 'real': - msg = 'param:<{}>; value_type={}; indexable={}' - fail = msg.format(pname, param['value_type'], + # check that indexable param has value_type float + if param.get('indexable', False) and param['type'] != 'float': + msg = 'param:<{}>; type={}; indexable={}' + fail = msg.format(pname, param['type'], param.get('indexable', False)) failures += fail + '\n' # ensure that indexable is False when value_type is not real - if param.get('indexable', False) and param['value_type'] != 'real': - msg = 'param:<{}>; indexable={}; value_type={}' + if param.get('indexable', False) and param['type'] != 'float': + msg = 'param:<{}>; indexable={}; type={}' fail = msg.format(pname, param.get('indexable', False), param['value_type']) failures += fail + '\n' - # check that value_yrs is list - valueyrs = param['value_yrs'] - assert isinstance(valueyrs, list) - # check all value_yrs values - cyr = first_year - for vyr in valueyrs: - assert vyr == cyr - cyr += 1 - # check type and dimension of value - value = param['value'] - assert isinstance(value, list) - assert len(value) == len(valueyrs) - # check that vi_name and vi_vals are consistent - viname = param.get('vi_name', '') - assert isinstance(viname, str) - vivals = param.get('vi_vals', []) - if viname == '': - assert vivals == [] - else: - assert isinstance(vivals, list) - # check different possible vi_name values - if viname == 'MARS': - assert len(vivals) == 5 - elif viname == 'EIC': - assert len(vivals) == 4 - elif viname == 'idedtype': - assert len(vivals) == 7 - elif viname == 'c00100': - pass - else: - assert viname == 'UNKNOWN vi_name VALUE' - # check length of each value row - for valuerow in value: - assert len(valuerow) == len(vivals) # check that indexed parameters have all known years in value_yrs list # (form_parameters are those whose value is available only on IRS form) form_parameters = [] if param.get('indexed', False): + defined_years = set( + vo["year"] for vo in param["value"] + ) error = False - known_years = num_known_years if pname in long_params: - known_years = long_known_years + exp_years = long_known_years + else: + exp_years = known_years if pname in form_parameters: - if len(valueyrs) != (known_years - 1): + if defined_years != exp_years: error = True else: - if len(valueyrs) != known_years: + if defined_years != exp_years: error = True if error: msg = 'param:<{}>; len(value_yrs)={}; known_years={}' - fail = msg.format(pname, len(valueyrs), known_years) + fail = msg.format(pname, len(defined_years), exp_years) failures += fail + '\n' if failures: raise ValueError(failures) @@ -319,39 +287,158 @@ def test_parameters_mentioned(tests_path, jfname, pfname): pfile.close() # check that each param (without leading _) is mentioned in code text for pname in allparams: + if pname == "schema": + continue assert pname[1:] in code_text # following tests access private methods, so pylint: disable=protected-access +class ArrayParams(Parameters): + defaults = { + "schema": { + "labels": { + "year": { + "type": "int", + "validators": {"range": {"min": 2013, "max": 2028}} + }, + "MARS": { + "type": "str", + "validators": { + "choice": { + "choices": [ + "single", + "joint", + "mseparate", + "headhh", + "widow", + # test value of II_brk2 has 6 columns + "extra", + ] + } + } + }, + "idedtype": { + "type": "str", + "validators": { + "choice": {"choices": ["med", "sltx", "retx"]} + } + } + }, + "additional_members": { + "indexable": { + "type": "bool" + }, + "indexed": { + "type": "bool" + }, + }, + "operators": { + "array_first": True, + "label_to_extend": "year" + } + }, + "one_dim": { + "title": "One dimension parameter", + "description": "", + "type": "float", + "indexed": True, + "indexable": True, + "value": [{"year": 2013, "value": 5}] + }, + "two_dim": { + "title": "Two dimension parameter", + "description": "", + "type": "float", + "indexed": True, + "indexable": True, + "value": [ + {"year": 2013, "idedtype": "med", "value": 1}, + {"year": 2013, "idedtype": "sltx", "value": 2}, + {"year": 2013, "idedtype": "retx", "value": 3} + ] + }, + "II_brk2": { + "title": "II_brk2", + "description": "", + "type": "float", + "indexed": True, + "indexable": True, + "value": [ + {"year": 2013, "MARS": "single", "value": 1}, + {"year": 2013, "MARS": "joint", "value": 2}, + {"year": 2013, "MARS": "mseparate", "value": 3}, + {"year": 2013, "MARS": "headhh", "value": 2}, + {"year": 2013, "MARS": "widow", "value": 3}, + {"year": 2013, "MARS": "extra", "value": 3}, + ] + } + } + + # These will be controlled directly through the extend method. + label_to_extend = None + array_first = False + + START_YEAR = 2013 + LAST_YEAR = 2030 + NUM_YEARS = LAST_YEAR - START_YEAR + 1 + + def __init__(self, **kwargs): + super().__init__( + ArrayParams.START_YEAR, + ArrayParams.NUM_YEARS, + **kwargs + ) + self._inflation_rates = [0.02] * self.num_years + self._wage_growth_rates = [0.03] * self.num_years + + def update_params(self, revision, + print_warnings=True, raise_errors=True): + """ + Update parameters given specified revision dictionary. + """ + self._update(revision, print_warnings, raise_errors) + + def set_rates(self): + pass + def test_expand_xd_errors(): """ One of several _expand_?D tests. """ - dct = dict() - with pytest.raises(ValueError): - Parameters._expand_1d(dct, inflate=False, inflation_rates=[], - num_years=10) - with pytest.raises(ValueError): - Parameters._expand_2d(dct, inflate=False, inflation_rates=[], - num_years=10) + params = ArrayParams(label_to_extend=None, array_first=False) + with pytest.raises(paramtools.ValidationError): + params.extend(label="year", label_values=[1, 2, 3]) + + +def test_expand_empty(): + params = ArrayParams(label_to_extend=None, array_first=False) + params.sort_values() + one_dim = copy.deepcopy(params.one_dim) + + params.extend(label="year", label_values=[]) + + params.sort_values() + assert params.one_dim == one_dim def test_expand_1d_scalar(): - """ - One of several _expand_?D tests. - """ yrs = 12 val = 10.0 exp = np.array([val * math.pow(1.02, i) for i in range(0, yrs)]) - res = Parameters._expand_1d(np.array([val]), - inflate=True, inflation_rates=[0.02] * yrs, - num_years=yrs) + + yrslist = list(range(2013, 2013 + 12)) + params = ArrayParams(label_to_extend=None, array_first=False) + params.adjust({"one_dim": val}) + params.extend(params=["one_dim"], label="year", label_values=yrslist) + res = params.to_array("one_dim", year=yrslist) assert np.allclose(exp, res, atol=0.01, rtol=0.0) - res = Parameters._expand_1d(np.array([val]), - inflate=True, inflation_rates=[0.02] * yrs, - num_years=1) + + params = ArrayParams(label_to_extend=None, array_first=False) + params.adjust({"one_dim": val}) + params.extend(params=["one_dim"], label="year", label_values=[2013]) + res = params.to_array("one_dim", year=2013) assert np.allclose(np.array([val]), res, atol=0.01, rtol=0.0) @@ -366,8 +453,15 @@ def test_expand_2d_short_array(): exp = np.zeros((5, 3)) exp[:1] = exp1 exp[1:] = exp2 - res = Parameters._expand_2d(ary, inflate=True, - inflation_rates=[0.02] * 5, num_years=5) + + params = ArrayParams(array_first=False, label_to_extend=None) + years = [2013, 2014, 2015, 2016, 2017] + params.extend( + params=["two_dim"], + label="year", + label_values=years, + ) + res = params.to_array("two_dim", year=years) assert np.allclose(exp, res, atol=0.01, rtol=0.0) @@ -388,8 +482,12 @@ def test_expand_2d_variable_rates(): exp = np.zeros((5, 3)) exp[:1] = exp1 exp[1:] = exp2 - res = Parameters._expand_2d(ary, inflate=True, - inflation_rates=irates, num_years=5) + + params = ArrayParams(array_first=False, label_to_extend=None) + params._inflation_rates = irates + years = [2013, 2014, 2015, 2016, 2017] + params.extend(params=["two_dim"], label="year", label_values=years) + res = params.to_array("two_dim", year=years) assert np.allclose(exp, res, atol=0.01, rtol=0.0) @@ -401,10 +499,21 @@ def test_expand_2d_already_filled(): _II_brk2 = [[36000., 72250., 36500., 48600., 72500., 36250.], [38000., 74000., 36900., 49400., 73800., 36900.], [40000., 74900., 37450., 50200., 74900., 37450.]] - res = Parameters._expand_2d(np.array(_II_brk2), - inflate=True, inflation_rates=[0.02] * 5, - num_years=3) - np.allclose(res, np.array(_II_brk2), atol=0.01, rtol=0.0) + + years = [2013, 2014, 2015] + params = ArrayParams( + array_first=False, + label_to_extend=None, + ) + params.adjust({ + "II_brk2": params.from_array("II_brk2", np.array(_II_brk2), year=years) + }) + + params.extend( + params=["II_brk2"], label="year", label_values=years + ) + res = params.to_array("II_brk2", year=years) + assert np.allclose(res, np.array(_II_brk2), atol=0.01, rtol=0.0) def test_expand_2d_partial_expand(): @@ -429,49 +538,22 @@ def test_expand_2d_partial_expand(): [38000.0, 74000.0, 36900.0, 49400.0, 73800.0, 36900.0], [40000.0, 74900.0, 37450.0, 50200.0, 74900.0, 37450.0], [exp1, exp2, exp3, exp4, exp5, exp6]] - res = Parameters._expand_2d(np.array(_II_brk2), - inflate=True, inflation_rates=inf_rates, - num_years=4) - assert np.allclose(res, exp, atol=0.01, rtol=0.0) - -@pytest.mark.parametrize('json_filename', - ['policy_current_law.json', - 'consumption.json', - 'growdiff.json']) -def test_bool_int_value_info(tests_path, json_filename): - """ - Check consistency of boolean and integer info in JSON parameter files. - """ - path = os.path.join(tests_path, '..', json_filename) - with open(path, 'r') as pfile: - pdict = json.load(pfile) - maxint = np.iinfo(np.int16).max - for param in sorted(pdict.keys()): - # find param type based on value - val = pdict[param]['value'] - while isinstance(val, list): - val = val[0] - valstr = str(val) - val_is_boolean = valstr in ('True', 'False') - val_is_integer = (not bool('.' in valstr or abs(val) > maxint) and - not val_is_boolean) - # check that val_is_integer is consistent with integer type - integer_type = pdict[param]['value_type'] == 'integer' - if val_is_integer != integer_type: - msg = 'param,value_type,valstr= {} {} {}' - msg = msg.format(str(param), - pdict[param]['value_type'], - valstr) - assert msg == 'ERROR: integer_value param has non-integer value' - # check that val_is_boolean is consistent with boolean_value - boolean_type = pdict[param]['value_type'] == 'boolean' - if val_is_boolean != boolean_type: - msg = 'param,value_type,valstr= {} {} {}' - msg = msg.format(str(param), - pdict[param]['value_type'], - valstr) - assert msg == 'ERROR: boolean_value param has non-boolean value' + years = [2013, 2014, 2015] + params = ArrayParams(array_first=False, label_to_extend=None) + params.adjust({ + "II_brk2": params.from_array( + "II_brk2", + np.array(_II_brk2), + year=years + ) + }) + params._inflation_rates[:3] = inf_rates + params.extend( + params=["II_brk2"], label="year", label_values=years + [2016] + ) + res = params.to_array("II_brk2", year=years + [2016]) + assert np.allclose(res, exp, atol=0.01, rtol=0.0) def test_read_json_revision(): diff --git a/taxcalc/tests/test_policy.py b/taxcalc/tests/test_policy.py index df9148c6e..18773e754 100644 --- a/taxcalc/tests/test_policy.py +++ b/taxcalc/tests/test_policy.py @@ -7,14 +7,37 @@ # # pylint: disable=too-many-lines +import copy import os import json import numpy as np import pytest +import paramtools as pt # pylint: disable=import-error from taxcalc import Policy +def cmp_policy_objs(pol1, pol2, year_range=None, exclude=None): + """ + Compare parameter values two policy objects. + + year_range: years over which to compare values. + exclude: list of parameters to exclude from comparison. + """ + if year_range is not None: + pol1.set_state(year=list(year_range)) + pol2.set_state(year=list(year_range)) + else: + pol1.clear_state() + pol2.clear_state() + for param in pol1._data: + if exclude and param in exclude: + continue + v1 = getattr(pol1, param) + v2 = getattr(pol2, param) + np.testing.assert_allclose(v1, v2) + + def test_incorrect_class_instantiation(): """ Test incorrect instantiation of Policy class object. @@ -30,45 +53,17 @@ def test_correct_class_instantiation(): pol = Policy() assert pol pol.implement_reform({}) - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): pol.implement_reform(list()) - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): pol.implement_reform({2099: {'II_em': 99000}}) pol.set_year(2019) - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): pol.implement_reform({2018: {'II_em': 99000}}) - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): pol.implement_reform({2020: {'II_em': -1000}}) -def test_policy_json_content_consistency(): - """ - Test contents of JSON defaults file, which is read into Policy._vals dict. - """ - expected_vi_vals = { - 'MARS': ['single', 'mjoint', 'mseparate', 'headhh', 'widow'], - 'EIC': ['0kids', '1kid', '2kids', '3+kids'], - 'idedtype': ['med', 'sltx', 'retx', 'cas', 'misc', 'int', 'char'] - } - policy = Policy() - start_year = policy.start_year - assert start_year == Policy.JSON_START_YEAR - policy_vals = getattr(policy, '_vals') - for name, data in policy_vals.items(): - # check entries in value_yrs list - value_yrs = data['value_yrs'] - assert isinstance(value_yrs, list) - value = data['value'] - expected_value_yrs = [(start_year + i) for i in range(len(value))] - if value_yrs != expected_value_yrs: - msg = 'name,value_yrs,expected_value_yrs: {}\n{}\n{}' - raise ValueError(msg.format(name, value_yrs, expected_value_yrs)) - # check entries in vi_vals list - vivals = data['vi_vals'] - if vivals: - assert vivals == expected_vi_vals[data['vi_name']] - - def test_json_reform_url(): """ Test reading a JSON reform from a URL. Results from the URL are expected @@ -248,51 +243,6 @@ def test_multi_year_reform(): wfactor = {} for i in range(0, nyrs): wfactor[syr + i] = 1.0 + wratelist[i] - # confirm that parameters have current-law values - assert np.allclose(getattr(pol, '_EITC_c'), - Policy._expand_array( - np.array([[487, 3250, 5372, 6044], - [496, 3305, 5460, 6143], - [503, 3359, 5548, 6242], - [506, 3373, 5572, 6269], - [510, 3400, 5616, 6318], - [519, 3461, 5716, 6431], - [529, 3526, 5828, 6557]], - dtype=np.float64), - 'real', - inflate=True, - inflation_rates=iratelist, - num_years=nyrs), - atol=0.01, rtol=0.0) - assert np.allclose(getattr(pol, '_STD_Dep'), - Policy._expand_array( - np.array([1000, 1000, 1050, 1050, 1050, 1050, 1100], - dtype=np.float64), - 'real', - inflate=True, - inflation_rates=iratelist, - num_years=nyrs), - atol=0.01, rtol=0.0) - assert np.allclose(getattr(pol, '_CTC_c'), - Policy._expand_array( - np.array([1000] * 5 + [2000] * 8 + [1000], - dtype=np.float64), - 'real', - inflate=False, - inflation_rates=iratelist, - num_years=nyrs), - atol=0.01, rtol=0.0) - # this parameter uses a different indexing rate - assert np.allclose(getattr(pol, '_SS_Earnings_c'), - Policy._expand_array( - np.array([113700, 117000, 118500, 118500, 127200, - 128400, 132900], - dtype=np.float64), - 'real', - inflate=True, - inflation_rates=wratelist, - num_years=nyrs), - atol=0.01, rtol=0.0) # specify multi-year reform using a param:year:value-fomatted dictionary reform = { 'SS_Earnings_c': {2016: 300000, @@ -441,15 +391,7 @@ def test_policy_metadata(): """ clp = Policy() mdata = clp.metadata() - assert isinstance(mdata['STD']['value'], list) - assert np.allclose(mdata['STD']['value'], - [6100, 12200, 6100, 8950, 12200]) - assert isinstance(mdata['CDCC_ps']['value'], float) - assert mdata['CDCC_ps']['value'] == 15000 - dump = False - if dump: - print(mdata) - assert 1 == 2 + assert mdata def test_implement_reform_raises_on_no_year(): @@ -458,7 +400,7 @@ def test_implement_reform_raises_on_no_year(): """ reform = {'STD_Aged': [1400, 1200, 1400, 1400, 1400]} ppo = Policy() - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): ppo.implement_reform(reform) @@ -468,7 +410,7 @@ def test_implement_reform_raises_on_early_year(): """ ppo = Policy() reform = {'STD_Aged': {2010: [1400, 1100, 1100, 1400, 1400]}} - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): ppo.implement_reform(reform) @@ -593,6 +535,7 @@ def test_pop_the_cap_reform(): # specify a "pop the cap" reform that eliminates MTE cap in 2016 reform = {'SS_Earnings_c': {2016: 9e99}} ppo.implement_reform(reform) + mte = ppo._SS_Earnings_c assert mte[2015 - syr] == 118500 assert mte[2016 - syr] == 9e99 assert mte[ppo.end_year - syr] == 9e99 @@ -781,6 +724,7 @@ def generate_section_dictionary(html_text): path = os.path.join(tests_path, '..', 'policy_current_law.json') with open(path, 'r') as clpfile: clpdict = json.load(clpfile) + clpdict.pop("schema", None) # ... make sure ever clpdict section title is in valid_dict clp_dict = dict() # dictionary of clp section titles structured like valid for pname in clpdict: @@ -827,6 +771,7 @@ def test_description_punctuation(tests_path): path = os.path.join(tests_path, '..', 'policy_current_law.json') with open(path, 'r') as jsonfile: dct = json.load(jsonfile) + dct.pop("schema", None) all_desc_ok = True for param in dct.keys(): if not dct[param]['description'].endswith('.'): @@ -837,77 +782,19 @@ def test_description_punctuation(tests_path): assert all_desc_ok -def test_valid_value_infomation(): - """ - Check consistency of valid_values info in policy_current_law.json file. - """ - # pylint: disable=too-many-statements,too-many-locals - # pylint: disable=too-many-branches,too-many-nested-blocks - # construct set of parameter names with a "valid_values" field - policy = Policy() - min_max_list = ['min', 'max'] - warn_stop_list = ['warn', 'stop'] - json_range_params = set() - parameters = set(policy._vals.keys()) - for pname, param in policy._vals.items(): - assert isinstance(param, dict) - if param['value_type'] == 'string': - continue # because string parameters have no invalid_* keys - prange = param.get('valid_values', None) - if prange: - json_range_params.add(pname) - oor_action = param['invalid_action'] - assert oor_action in warn_stop_list - range_items = prange.items() - assert len(range_items) == 2 - for vop, vval in range_items: - assert vop in min_max_list - if isinstance(vval, str): - if vval == 'default': - if vop != 'min' or oor_action != 'warn': - msg = 'USES DEFAULT FOR min OR FOR error' - assert pname == msg - continue - else: - vval_ = '_' + vval - if vval_ in parameters: - if vop == 'min': - extra_msg = param['invalid_minmsg'] - if vop == 'max': - extra_msg = param['invalid_maxmsg'] - assert vval in extra_msg - else: - assert vval == 'ILLEGAL RANGE STRING VALUE' - else: # if vval is not a str - if isinstance(vval, int): - continue - elif isinstance(vval, float): - continue - elif isinstance(vval, bool): - continue - else: - assert vval == 'ILLEGAL RANGE NUMERIC VALUE' - # compare contents of c_l_p.json parameters and json_range_params - unmatched = parameters ^ json_range_params - if unmatched: - assert unmatched == 'UNMATCHED RANGE PARAMETERS' - # check all current-law-policy parameters for range validity - clp = Policy() - clp._validate_values(parameters) - # eventually activate: assert not clp.parameter_warnings - ctc_c_warning = 'CTC_c was redefined in release 1.0.0\n' - assert clp.parameter_warnings == ctc_c_warning - assert not clp.parameter_errors - - -def test_indexing_rates_for_update(): +def test_get_index_rate(): """ - Check private _indexing_rates_for_update method. + Test Parameters.get_index_rate. """ pol = Policy() - wgrates = pol._indexing_rates_for_update('_SS_Earnings_c', 2017, 10) - pirates = pol._indexing_rates_for_update('_II_em', 2017, 10) - assert len(wgrates) == len(pirates) + wgrates = pol.get_index_rate('SS_Earnings_c', 2017) + pirates = pol.get_index_rate('II_em', 2017) + assert isinstance(wgrates, np.float64) + assert wgrates == pol.wage_growth_rates(2017) + assert pirates == pol.inflation_rates(2017) + assert isinstance(pirates, np.float64) + assert pol.inflation_rates() == pol._inflation_rates + assert pol.wage_growth_rates() == pol._wage_growth_rates def test_reform_with_bad_ctc_levels(): @@ -919,23 +806,30 @@ def test_reform_with_bad_ctc_levels(): 'CTC_c': {2020: 2200}, 'ACTC_c': {2020: 2500} } - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): pol.implement_reform(child_credit_reform) -def test_reform_with_removed_parameter(): +def test_reform_with_removed_parameter(monkeypatch): """ Try to use removed parameter in a reform. """ policy1 = Policy() reform1 = {'FilerCredit_c': {2020: 1000}} - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): policy1.implement_reform(reform1) policy2 = Policy() reform2 = {'FilerCredit_c-indexed': {2020: True}} - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): policy2.implement_reform(reform2) + redefined_msg = {"some_redefined": "some_redefined was redefined."} + monkeypatch.setattr(Policy, "REDEFINED_PARAMS", redefined_msg) + + pol = Policy() + with pytest.raises(pt.ValidationError): + pol.implement_reform({"some_redefined": "hello world"}) + def test_reform_with_out_of_range_error(): """ @@ -951,10 +845,23 @@ def test_reform_with_warning(): """ Try to use warned out-of-range parameter value in reform. """ + exp_warnings = { + 'ID_Medical_frt': [ + 'ID_Medical_frt[year=2020] 0.05 < min 0.075 ' + ] + } pol = Policy() reform = {'ID_Medical_frt': {2020: 0.05}} - pol.implement_reform(reform) - assert pol.parameter_warnings + + pol.implement_reform(reform, print_warnings=True) + assert pol.warnings == exp_warnings + pol.set_state(year=2020) + assert pol.ID_Medical_frt == np.array([0.05]) + + pol.implement_reform(reform, print_warnings=False) + assert pol.warnings == {} + pol.set_state(year=2020) + assert pol.ID_Medical_frt == np.array([0.05]) def test_reform_with_scalar_vector_errors(): @@ -963,13 +870,30 @@ def test_reform_with_scalar_vector_errors(): """ policy1 = Policy() reform1 = {'SS_thd85': {2020: 30000}} - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): policy1.implement_reform(reform1) + policy2 = Policy() reform2 = {'ID_Medical_frt': {2020: [0.08]}} - with pytest.raises(ValueError): + with pytest.raises(pt.ValidationError): policy2.implement_reform(reform2) + policy3 = Policy() + reform3 = {'ID_Medical_frt': [{"year": 2020, "value": [0.08]}]} + with pytest.raises(pt.ValidationError): + policy3.adjust(reform3) + + # Check that error is thrown if there are extra elements in array. + policy4 = Policy() + ref4 = {"II_brk1": {2020: [9700, 19400, 9700, 13850, 19400, 19400]}} + with pytest.raises(pt.ValidationError): + policy4.implement_reform(ref4) + + policy5 = Policy() + ref5 = {"II_rt1": {2029: [.2, .3]}} + with pytest.raises(pt.ValidationError): + policy5.implement_reform(ref5) + def test_index_offset_reform(): """ @@ -988,9 +912,9 @@ def test_index_offset_reform(): pvalue2 = dict() for cyr in [2019, 2020, 2021]: policy1.set_year(cyr) - pvalue1[cyr] = policy1.CTC_c + pvalue1[cyr] = policy1.CTC_c[0] policy2.set_year(cyr) - pvalue2[cyr] = policy2.CTC_c + pvalue2[cyr] = policy2.CTC_c[0] # check that pvalue1 and pvalue2 dictionaries contain the expected values assert pvalue2[2019] == pvalue1[2019] assert pvalue2[2020] == pvalue1[2020] @@ -1031,3 +955,444 @@ def test_cpi_offset_affect_on_prior_years(): p1_rates[2022 - start_year], p2_rates[2022 - start_year] - (-0.005) ) + + +class TestAdjust: + """ + Test update and indexing rules as defined in the Parameters docstring. + + Each test implements a Tax-Calculator style reform and a pt styled + reform, checks that the updated values are equal, and then, tests that + values were extended and indexed (or not indexed) correctly. + """ + + def test_simple_adj(self): + """ + Test updating a 2D parameter that is indexed to inflation. + """ + pol1 = Policy() + pol1.implement_reform( + { + "EITC_c": { + 2020: [10000, 10001, 10002, 10003], + 2023: [20000, 20001, 20002, 20003], + } + } + ) + + pol2 = Policy() + pol2.adjust( + { + "EITC_c": [ + {"year": 2020, "EIC": "0kids", "value": 10000}, + {"year": 2020, "EIC": "1kid", "value": 10001}, + {"year": 2020, "EIC": "2kids", "value": 10002}, + {"year": 2020, "EIC": "3+kids", "value": 10003}, + {"year": 2023, "EIC": "0kids", "value": 20000}, + {"year": 2023, "EIC": "1kid", "value": 20001}, + {"year": 2023, "EIC": "2kids", "value": 20002}, + {"year": 2023, "EIC": "3+kids", "value": 20003}, + ] + } + ) + cmp_policy_objs(pol1, pol2) + + pol0 = Policy() + pol0.set_year(2019) + pol2.set_year(2019) + + assert np.allclose(pol0.EITC_c, pol2.EITC_c) + + pol2.set_state(year=[2020, 2021, 2022, 2023, 2024]) + val2020 = np.array([[10000, 10001, 10002, 10003]]) + val2023 = np.array([[20000, 20001, 20002, 20003]]) + + exp = np.vstack([ + val2020, + val2020 * (1 + pol2.inflation_rates(year=2020)), + ( + val2020 * (1 + pol2.inflation_rates(year=2020)) + ).round(2) * (1 + pol2.inflation_rates(year=2021)), + val2023, + val2023 * (1 + pol2.inflation_rates(year=2023)), + ]).round(2) + np.testing.assert_allclose(pol2.EITC_c, exp) + + def test_adj_without_index_1(self): + """ + Test update indexed parameter after turning off its + indexed status. + """ + pol1 = Policy() + pol1.implement_reform( + { + "EITC_c": { + 2020: [10000, 10001, 10002, 10003], + 2023: [20000, 20001, 20002, 20003], + }, + "EITC_c-indexed": {2019: False}, + } + ) + + pol2 = Policy() + pol2.adjust( + { + "EITC_c": [ + {"year": 2020, "EIC": "0kids", "value": 10000}, + {"year": 2020, "EIC": "1kid", "value": 10001}, + {"year": 2020, "EIC": "2kids", "value": 10002}, + {"year": 2020, "EIC": "3+kids", "value": 10003}, + {"year": 2023, "EIC": "0kids", "value": 20000}, + {"year": 2023, "EIC": "1kid", "value": 20001}, + {"year": 2023, "EIC": "2kids", "value": 20002}, + {"year": 2023, "EIC": "3+kids", "value": 20003}, + ], + "EITC_c-indexed": [{"year": 2019, "value": False}], + } + ) + cmp_policy_objs(pol1, pol2) + + pol0 = Policy() + pol0.set_year(2019) + pol2.set_year(2019) + + assert np.allclose(pol0.EITC_c, pol2.EITC_c) + + pol2.set_state(year=[2020, 2021, 2022, 2023, 2024]) + + val2020 = np.array([[10000, 10001, 10002, 10003]]) + val2023 = np.array([[20000, 20001, 20002, 20003]]) + + exp = np.vstack([ + val2020, + val2020, + val2020, + val2023, + val2023, + ]).round(2) + np.testing.assert_allclose(pol2.EITC_c, exp) + + def test_adj_without_index_2(self): + """ + Test updating an indexed parameter, making it unindexed, + and then adjusting it again. + """ + pol1 = Policy() + pol1.implement_reform( + { + "EITC_c": { + 2020: [10000, 10001, 10002, 10003], + 2023: [20000, 20001, 20002, 20003], + }, + "EITC_c-indexed": {2022: False}, + } + ) + + pol2 = Policy() + pol2.adjust( + { + "EITC_c": [ + {"year": 2020, "EIC": "0kids", "value": 10000}, + {"year": 2020, "EIC": "1kid", "value": 10001}, + {"year": 2020, "EIC": "2kids", "value": 10002}, + {"year": 2020, "EIC": "3+kids", "value": 10003}, + {"year": 2023, "EIC": "0kids", "value": 20000}, + {"year": 2023, "EIC": "1kid", "value": 20001}, + {"year": 2023, "EIC": "2kids", "value": 20002}, + {"year": 2023, "EIC": "3+kids", "value": 20003}, + ], + "EITC_c-indexed": [{"year": 2022, "value": False}], + } + ) + cmp_policy_objs(pol1, pol2) + + pol0 = Policy() + pol0.set_year(2019) + pol2.set_year(2019) + + assert np.allclose(pol0.EITC_c, pol2.EITC_c) + + pol2.set_state(year=[2020, 2021, 2022, 2023, 2024]) + + val2020 = np.array([[10000, 10001, 10002, 10003]]) + val2023 = np.array([[20000, 20001, 20002, 20003]]) + + exp = np.vstack([ + val2020, + val2020 * (1 + pol2.inflation_rates(year=2020)), + ( + val2020 * (1 + pol2.inflation_rates(year=2020)) + ).round(2) * (1 + pol2.inflation_rates(year=2021)), + val2023, + val2023, + ]).round(2) + np.testing.assert_allclose(pol2.EITC_c, exp) + + def test_activate_index(self): + """ + Test changing a non-indexed parameter to an indexed parameter. + """ + pol1 = Policy() + pol1.implement_reform({ + "CTC_c": {2022: 1005}, + "CTC_c-indexed": {2022: True} + }) + + pol2 = Policy() + pol2.adjust( + { + "CTC_c": [{"year": 2022, "value": 1005}], + "CTC_c-indexed": [{"year": 2022, "value": True}], + } + ) + cmp_policy_objs(pol1, pol2) + + pol0 = Policy() + pol0.set_year(year=2021) + pol2.set_state(year=[2021, 2022, 2023]) + exp = np.array([ + pol0.CTC_c[0], + 1005, + 1005 * (1 + pol2.inflation_rates(year=2022)) + ]).round(2) + + np.testing.assert_allclose(pol2.CTC_c, exp) + + def test_apply_cpi_offset(self): + """ + Test applying the CPI_offset parameter without any other parameters. + """ + pol1 = Policy() + pol1.implement_reform({"CPI_offset": {2021: -0.001}}) + + pol2 = Policy() + pol2.adjust({"CPI_offset": [{"year": 2021, "value": -0.001}]}) + + cmp_policy_objs(pol1, pol2) + + pol0 = Policy() + + init_rates = pol0.inflation_rates() + new_rates = pol2.inflation_rates() + + start_ix = 2021 - pol2.start_year + + exp_rates = copy.deepcopy(new_rates) + exp_rates[start_ix:] -= pol2._CPI_offset[start_ix:] + np.testing.assert_allclose(init_rates, exp_rates) + + # make sure values prior to 2021 were not affected. + cmp_policy_objs(pol0, pol2, year_range=range(pol2.start_year, 2021)) + + pol2.set_state(year=[2021, 2022]) + np.testing.assert_equal( + (pol2.EITC_c[1] / pol2.EITC_c[0] - 1).round(4), + pol0.inflation_rates(year=2021) + (-0.001), + ) + + def test_multiple_cpi_swaps(self): + """ + Test changing a parameter's indexed status multiple times. + """ + pol1 = Policy() + pol1.implement_reform( + { + "II_em": {2016: 6000, 2018: 7500, 2020: 9000}, + "II_em-indexed": {2016: False, 2018: True}, + } + ) + + pol2 = Policy() + pol2.adjust( + { + "II_em": [ + {"year": 2016, "value": 6000}, + {"year": 2018, "value": 7500}, + {"year": 2020, "value": 9000}, + ], + "II_em-indexed": [ + {"year": 2016, "value": False}, + {"year": 2018, "value": True}, + ], + } + ) + + cmp_policy_objs(pol1, pol2) + + # check inflation is not applied. + pol2.set_state(year=[2016, 2017]) + np.testing.assert_equal( + pol2.II_em[0], pol2.II_em[1] + ) + + # check inflation rate is applied. + pol2.set_state(year=[2018, 2019]) + np.testing.assert_equal( + (pol2.II_em[1] / pol2.II_em[0] - 1).round(4), + pol2.inflation_rates(year=2018), + ) + + # check inflation rate applied for rest of window. + window = list(range(2020, pol2.end_year + 1)) + pol2.set_state(year=window) + np.testing.assert_equal( + (pol2.II_em[1:] / pol2.II_em[:-1] - 1).round(4), + [pol2.inflation_rates(year=year) for year in window[:-1]], + ) + + def test_multiple_cpi_swaps2(self): + """ + Test changing the indexed status of multiple parameters multiple + times. + """ + pol1 = Policy() + pol1.implement_reform( + { + "II_em": {2016: 6000, 2018: 7500, 2020: 9000}, + "II_em-indexed": {2016: False, 2018: True}, + "SS_Earnings_c": {2016: 300000, 2018: 500000}, + "SS_Earnings_c-indexed": {2017: False, 2019: True}, + "AMT_em-indexed": {2017: False, 2020: True}, + } + ) + + pol2 = Policy() + pol2.adjust( + { + "SS_Earnings_c": [ + {"year": 2016, "value": 300000}, + {"year": 2018, "value": 500000}, + ], + "SS_Earnings_c-indexed": [ + {"year": 2017, "value": False}, + {"year": 2019, "value": True}, + ], + "AMT_em-indexed": [ + {"year": 2017, "value": False}, + {"year": 2020, "value": True}, + ], + "II_em": [ + {"year": 2016, "value": 6000}, + {"year": 2018, "value": 7500}, + {"year": 2020, "value": 9000}, + ], + "II_em-indexed": [ + {"year": 2016, "value": False}, + {"year": 2018, "value": True}, + ], + } + ) + + cmp_policy_objs(pol1, pol2) + + # Test SS_Earnings_c + # check inflation is still applied from 2016 to 2017. + pol2.set_state(year=[2016, 2017]) + np.testing.assert_equal( + (pol2.SS_Earnings_c[1] / pol2.SS_Earnings_c[0] - 1).round(4), + pol2.wage_growth_rates(year=2016), + ) + + # check inflation rate is not applied after adjustment in 2018. + pol2.set_state(year=[2018, 2019]) + np.testing.assert_equal( + pol2.SS_Earnings_c[0], pol2.SS_Earnings_c[1] + ) + + # check inflation rate applied for rest of window. + window = list(range(2019, pol2.end_year + 1)) + pol2.set_state(year=window) + np.testing.assert_equal( + (pol2.SS_Earnings_c[1:] / pol2.SS_Earnings_c[:-1] - 1).round(4), + [pol2.wage_growth_rates(year=year) for year in window[:-1]], + ) + + # Test AMT + # Check values for 2017 through 2020 are equal. + pol2.set_state(year=[2017, 2018, 2019, 2020]) + for i in (1, 2, 3): + np.testing.assert_equal( + pol2.AMT_em[0], pol2.AMT_em[i] + ) + + # check inflation rate applied for rest of window. + window = list(range(2020, pol2.end_year + 1)) + pol2.set_state(year=window) + # repeat inflation rates accross matrix so they can be compared to the + # rates derived from AMT_em, a 5 * N matrix. + exp_rates = [pol2.inflation_rates(year=year) for year in window[:-1]] + exp_rates = np.tile([exp_rates], (5, 1)).transpose() + np.testing.assert_equal( + (pol2.AMT_em[1:] / pol2.AMT_em[:-1] - 1).round(4), + exp_rates, + ) + + # Test II_em + # check inflation is not applied. + pol2.set_state(year=[2016, 2017]) + np.testing.assert_equal( + pol2.II_em[0], pol2.II_em[1] + ) + + # check inflation rate is applied. + pol2.set_state(year=[2018, 2019]) + np.testing.assert_equal( + (pol2.II_em[1] / pol2.II_em[0] - 1).round(4), + pol2.inflation_rates(year=2018), + ) + + # check inflation rate applied for rest of window. + window = list(range(2020, pol2.end_year + 1)) + pol2.set_state(year=window) + np.testing.assert_equal( + (pol2.II_em[1:] / pol2.II_em[:-1] - 1).round(4), + [pol2.inflation_rates(year=year) for year in window[:-1]], + ) + + def test_adj_CPI_offset_and_index_status(self): + """ + Test changing CPI_offset and another parameter simultaneously. + """ + pol1 = Policy() + pol1.implement_reform({ + "CTC_c-indexed": {2020: True}, + "CPI_offset": {2020: -0.005}}, + ) + + pol2 = Policy() + pol2.adjust( + { + "CPI_offset": [{"year": 2020, "value": -0.005}], + "CTC_c-indexed": [{"year": 2020, "value": True}], + } + ) + + cmp_policy_objs(pol1, pol2) + + # Check no difference prior to 2020 + pol0 = Policy() + cmp_policy_objs( + pol0, + pol2, + year_range=range(pol2.start_year, 2020 + 1), + exclude=["CPI_offset"] + ) + + pol2.set_state(year=[2021, 2022]) + np.testing.assert_equal( + (pol2.CTC_c[1] / pol2.CTC_c[0] - 1).round(4), + pol0.inflation_rates(year=2021) + (-0.005), + ) + + def test_indexed_status_parsing(self): + pol1 = Policy() + + pol1.implement_reform({"EITC_c-indexed": {pol1.start_year: False}}) + + pol2 = Policy() + pol2.adjust({"EITC_c-indexed": False}) + + cmp_policy_objs(pol1, pol2) + + with pytest.raises(pt.ValidationError): + pol2.adjust({"EITC_c-indexed": 123}) diff --git a/taxcalc/tests/test_reforms.py b/taxcalc/tests/test_reforms.py index 347def3ad..358c006ed 100644 --- a/taxcalc/tests/test_reforms.py +++ b/taxcalc/tests/test_reforms.py @@ -27,12 +27,9 @@ def test_2017_law_reform(tests_path): with open(reform_file, 'r') as rfile: rtext = rfile.read() pol.implement_reform(Policy.read_json_reform(rtext)) - # eventually activate: assert not clp.parameter_warnings - ctc_c_warning = 'CTC_c was redefined in release 1.0.0\n' - assert pol.parameter_warnings == ctc_c_warning - assert not pol.parameter_errors + assert not pol.parameter_warnings pol.set_year(2018) - pre_mdata = pol.metadata() + pre_mdata = dict(pol.items()) # check some policy parameter values against expected values under 2017 law pre_expect = { # relation '<' implies asserting that actual < expect @@ -61,11 +58,11 @@ def test_2017_law_reform(tests_path): assert isinstance(pre_expect, dict) assert set(pre_expect.keys()).issubset(set(pre_mdata.keys())) for name in pre_expect: - aval = pre_mdata[name]['value'] - if isinstance(aval, list): - act = aval[0] # comparing only first item in a vector parameter + aval = pre_mdata[name] + if aval.ndim == 2: + act = aval[0][0] # comparing only first item in a vector parameter else: - act = aval + act = aval[0] exp = pre_expect[name]['value'] if pre_expect[name]['relation'] == '<': assert act < exp, '{} a={} !< e={}'.format(name, act, exp) @@ -91,26 +88,24 @@ def test_round_trip_tcja_reform(tests_path): # create clp metadata dictionary for current-law policy in fyear pol = Policy() pol.set_year(fyear) - clp_mdata = pol.metadata() + clp_mdata = dict(pol.items()) # create rtr metadata dictionary for round-trip reform in fyear pol = Policy() reform_file = os.path.join(tests_path, '..', 'reforms', '2017_law.json') with open(reform_file, 'r') as rfile: rtext = rfile.read() pol.implement_reform(Policy.read_json_reform(rtext)) - # eventually activate: assert not clp.parameter_warnings - ctc_c_warning = 'CTC_c was redefined in release 1.0.0\n' - assert pol.parameter_warnings == ctc_c_warning - assert not pol.parameter_errors + + assert not pol.parameter_warnings + assert not pol.errors reform_file = os.path.join(tests_path, '..', 'reforms', 'TCJA.json') with open(reform_file, 'r') as rfile: rtext = rfile.read() pol.implement_reform(Policy.read_json_reform(rtext)) - # eventually activate: assert not clp.parameter_warnings - assert pol.parameter_warnings == ctc_c_warning - assert not pol.parameter_errors + assert not pol.parameter_warnings + assert not pol.errors pol.set_year(fyear) - rtr_mdata = pol.metadata() + rtr_mdata = dict(pol.items()) # compare fyear policy parameter values assert clp_mdata.keys() == rtr_mdata.keys() fail_dump = False @@ -120,8 +115,8 @@ def test_round_trip_tcja_reform(tests_path): fail_params = list() msg = '\nRound-trip-reform and current-law-policy param values differ for:' for pname in clp_mdata.keys(): - rtr_val = rtr_mdata[pname]['value'] - clp_val = clp_mdata[pname]['value'] + rtr_val = rtr_mdata[pname] + clp_val = clp_mdata[pname] if not np.allclose(rtr_val, clp_val): fail_params.append(pname) msg += '\n {} in {} : rtr={} clp={}'.format(