taxcalc 5.0.4__tar.gz → 5.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. {taxcalc-5.0.4/taxcalc.egg-info → taxcalc-5.2.0}/PKG-INFO +1 -1
  2. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/about/releases.md +38 -0
  3. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/index.md +1 -1
  4. {taxcalc-5.0.4 → taxcalc-5.2.0}/extend_tcja.py +1 -1
  5. {taxcalc-5.0.4 → taxcalc-5.2.0}/setup.py +1 -1
  6. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/__init__.py +1 -1
  7. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/calcfunctions.py +126 -49
  8. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/calculator.py +2 -2
  9. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/policy.py +17 -5
  10. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/policy_current_law.json +817 -194
  11. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/records_variables.json +6 -1
  12. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/2017_law.json +3 -1
  13. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/CARES.json +2 -2
  14. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/TCJA.json +1 -1
  15. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ext.json +1 -1
  16. taxcalc-5.2.0/taxcalc/tests/cpscsv_agg_expect.csv +26 -0
  17. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/puf_var_correl_coeffs_2016.csv +10 -10
  18. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/puf_var_wght_means_by_year.csv +80 -80
  19. taxcalc-5.2.0/taxcalc/tests/pufcsv_agg_expect.csv +26 -0
  20. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/pufcsv_mtr_expect.txt +18 -18
  21. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_calcfunctions.py +23 -16
  22. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_calculator.py +1 -0
  23. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_cpscsv.py +2 -1
  24. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_policy.py +81 -103
  25. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_puf_var_stats.py +1 -1
  26. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_pufcsv.py +2 -1
  27. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_reforms.py +3 -3
  28. {taxcalc-5.0.4 → taxcalc-5.2.0/taxcalc.egg-info}/PKG-INFO +1 -1
  29. taxcalc-5.0.4/taxcalc/tests/cpscsv_agg_expect.csv +0 -26
  30. taxcalc-5.0.4/taxcalc/tests/pufcsv_agg_expect.csv +0 -26
  31. {taxcalc-5.0.4 → taxcalc-5.2.0}/.coveragerc +0 -0
  32. {taxcalc-5.0.4 → taxcalc-5.2.0}/.github/FUNDING.yml +0 -0
  33. {taxcalc-5.0.4 → taxcalc-5.2.0}/.github/workflows/build_and_test.yml +0 -0
  34. {taxcalc-5.0.4 → taxcalc-5.2.0}/.github/workflows/check_jupyterbook.yml +0 -0
  35. {taxcalc-5.0.4 → taxcalc-5.2.0}/.github/workflows/deploy_jupyterbook.yml +0 -0
  36. {taxcalc-5.0.4 → taxcalc-5.2.0}/.github/workflows/deploy_parameters_docs.yml +0 -0
  37. {taxcalc-5.0.4 → taxcalc-5.2.0}/.gitignore +0 -0
  38. {taxcalc-5.0.4 → taxcalc-5.2.0}/LICENSE +0 -0
  39. {taxcalc-5.0.4 → taxcalc-5.2.0}/MANIFEST.in +0 -0
  40. {taxcalc-5.0.4 → taxcalc-5.2.0}/Makefile +0 -0
  41. {taxcalc-5.0.4 → taxcalc-5.2.0}/PSL_catalog.json +0 -0
  42. {taxcalc-5.0.4 → taxcalc-5.2.0}/README.md +0 -0
  43. {taxcalc-5.0.4 → taxcalc-5.2.0}/codecov.yml +0 -0
  44. {taxcalc-5.0.4 → taxcalc-5.2.0}/conda.recipe/bld.bat +0 -0
  45. {taxcalc-5.0.4 → taxcalc-5.2.0}/conda.recipe/build.sh +0 -0
  46. {taxcalc-5.0.4 → taxcalc-5.2.0}/conda.recipe/meta.yaml +0 -0
  47. {taxcalc-5.0.4 → taxcalc-5.2.0}/csv_show.sh +0 -0
  48. {taxcalc-5.0.4 → taxcalc-5.2.0}/csv_vars.sh +0 -0
  49. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/PSL.svg +0 -0
  50. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/_config.yml +0 -0
  51. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/_static/atr.png +0 -0
  52. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/_static/mtr.png +0 -0
  53. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/_static/pch.png +0 -0
  54. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/_toc.yml +0 -0
  55. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/about/LICENSE.md +0 -0
  56. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/about/history.md +0 -0
  57. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/about/roadmap.md +0 -0
  58. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/calcfunctions.rst +0 -0
  59. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/calculator.rst +0 -0
  60. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/consumption.rst +0 -0
  61. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/data.rst +0 -0
  62. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/decorators.rst +0 -0
  63. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/growdiff.rst +0 -0
  64. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/growfactors.rst +0 -0
  65. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/parameters.rst +0 -0
  66. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/policy.rst +0 -0
  67. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/public_api.rst +0 -0
  68. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/records.rst +0 -0
  69. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/taxcalcio.rst +0 -0
  70. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/utils.rst +0 -0
  71. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/api/utilsprvt.rst +0 -0
  72. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/contributing/RELEASING.md +0 -0
  73. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/contributing/contributor_guide.md +0 -0
  74. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/contributing/param_naming.md +0 -0
  75. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/contributing/pr_workflow.md +0 -0
  76. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/contributing/testing.md +0 -0
  77. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/README.md +0 -0
  78. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/assumption_params.md +0 -0
  79. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/cli.md +0 -0
  80. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/index.md +0 -0
  81. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/input_vars.md +0 -0
  82. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/make/make_io_vars.py +0 -0
  83. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/make/make_params.py +0 -0
  84. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/make/make_uguide.py +0 -0
  85. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/output_vars.md +0 -0
  86. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/policy_params.md +0 -0
  87. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/python_interface.md +0 -0
  88. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/templates/assumption_params_template.md +0 -0
  89. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/templates/input_vars_template.md +0 -0
  90. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/templates/output_vars_template.md +0 -0
  91. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/guide/templates/policy_params_template.md +0 -0
  92. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/README.md +0 -0
  93. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/_static/reformA.json +0 -0
  94. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/_static/reformB.json +0 -0
  95. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/_static/reformC.json +0 -0
  96. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/convert_all.sh +0 -0
  97. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/index.md +0 -0
  98. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe00.md +0 -0
  99. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe01.md +0 -0
  100. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe02.md +0 -0
  101. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe03.md +0 -0
  102. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe04.md +0 -0
  103. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe04_pandas.md +0 -0
  104. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe05.md +0 -0
  105. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/md_src/recipe06.md +0 -0
  106. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe00.ipynb +0 -0
  107. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe01.ipynb +0 -0
  108. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe02.ipynb +0 -0
  109. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe03.ipynb +0 -0
  110. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe04.ipynb +0 -0
  111. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe04_pandas.ipynb +0 -0
  112. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe05.ipynb +0 -0
  113. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/recipes/recipe06.ipynb +0 -0
  114. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/usage/data.md +0 -0
  115. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/usage/overview.md +0 -0
  116. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/usage/starting.md +0 -0
  117. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/usage/tcja_after_2025.md +0 -0
  118. {taxcalc-5.0.4 → taxcalc-5.2.0}/docs/use_cases.md +0 -0
  119. {taxcalc-5.0.4 → taxcalc-5.2.0}/environment.yml +0 -0
  120. {taxcalc-5.0.4 → taxcalc-5.2.0}/gitpr +0 -0
  121. {taxcalc-5.0.4 → taxcalc-5.2.0}/gitpr.bat +0 -0
  122. {taxcalc-5.0.4 → taxcalc-5.2.0}/gitsync +0 -0
  123. {taxcalc-5.0.4 → taxcalc-5.2.0}/gitsync.bat +0 -0
  124. {taxcalc-5.0.4 → taxcalc-5.2.0}/ppp.py +0 -0
  125. {taxcalc-5.0.4 → taxcalc-5.2.0}/pyproject.toml +0 -0
  126. {taxcalc-5.0.4 → taxcalc-5.2.0}/pytest.ini +0 -0
  127. {taxcalc-5.0.4 → taxcalc-5.2.0}/setup.cfg +0 -0
  128. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/assumptions/ASSUMPTIONS.md +0 -0
  129. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/assumptions/README.md +0 -0
  130. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/assumptions/economic_assumptions_template.json +0 -0
  131. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/cli/__init__.py +0 -0
  132. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/cli/tc.py +0 -0
  133. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/conftest.py +0 -0
  134. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/consumption.json +0 -0
  135. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/consumption.py +0 -0
  136. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/cps.csv.gz +0 -0
  137. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/cps_weights.csv.gz +0 -0
  138. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/data.py +0 -0
  139. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/decorators.py +0 -0
  140. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/growdiff.json +0 -0
  141. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/growdiff.py +0 -0
  142. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/growfactors.csv +0 -0
  143. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/growfactors.py +0 -0
  144. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/parameters.py +0 -0
  145. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/puf_ratios.csv +0 -0
  146. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/puf_weights.csv.gz +0 -0
  147. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/records.py +0 -0
  148. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/2017_law.out.csv +0 -0
  149. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ARPA.json +0 -0
  150. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ARPA.out.csv +0 -0
  151. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/BrownKhanna.json +0 -0
  152. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/BrownKhanna.out.csv +0 -0
  153. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/CARES.out.csv +0 -0
  154. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ConsolidatedAppropriationsAct2021.json +0 -0
  155. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ConsolidatedAppropriationsAct2021.out.csv +0 -0
  156. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Larson2019.json +0 -0
  157. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Larson2019.out.csv +0 -0
  158. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/README.md +0 -0
  159. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/REFORMS.md +0 -0
  160. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Renacci.json +0 -0
  161. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Renacci.out.csv +0 -0
  162. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/SandersDeFazio.json +0 -0
  163. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/SandersDeFazio.out.csv +0 -0
  164. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/TCJA.md +0 -0
  165. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/TCJA.out.csv +0 -0
  166. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Trump2016.json +0 -0
  167. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Trump2016.out.csv +0 -0
  168. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Trump2017.json +0 -0
  169. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/Trump2017.out.csv +0 -0
  170. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/Clinton2016.json +0 -0
  171. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/RyanBrady.json +0 -0
  172. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_House.json +0 -0
  173. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_House_Amended.json +0 -0
  174. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_Reconciliation.json +0 -0
  175. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_Senate.json +0 -0
  176. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_Senate_111417.json +0 -0
  177. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/archive/TCJA_Senate_120117.json +0 -0
  178. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/cases.csv +0 -0
  179. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/clp.out.csv +0 -0
  180. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/growfactors_ext.csv +0 -0
  181. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes0.json +0 -0
  182. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes0.out.csv +0 -0
  183. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes1.json +0 -0
  184. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes1.out.csv +0 -0
  185. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes2.json +0 -0
  186. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes2.out.csv +0 -0
  187. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes3.json +0 -0
  188. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/reforms/ptaxes3.out.csv +0 -0
  189. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/taxcalcio.py +0 -0
  190. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/benefits_expect.csv +0 -0
  191. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/cmpi_cps_expect.txt +0 -0
  192. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/cmpi_puf_expect.txt +0 -0
  193. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/conftest.py +0 -0
  194. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/reforms.json +0 -0
  195. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/reforms_expect.csv +0 -0
  196. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_4package.py +0 -0
  197. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_benefits.py +0 -0
  198. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_compare.py +0 -0
  199. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_compatible_data.py +0 -0
  200. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_consumption.py +0 -0
  201. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_data.py +0 -0
  202. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_decorators.py +0 -0
  203. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_growdiff.py +0 -0
  204. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_growfactors.py +0 -0
  205. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_parameters.py +0 -0
  206. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_records.py +0 -0
  207. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_responses.py +0 -0
  208. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_taxcalcio.py +0 -0
  209. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/tests/test_utils.py +0 -0
  210. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/utils.py +0 -0
  211. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/utilsprvt.py +0 -0
  212. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/CSV_INPUT_VARS.md +0 -0
  213. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/CSV_OUTPUT_VARS.md +0 -0
  214. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/README.md +0 -0
  215. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/Differences_Explained.md +0 -0
  216. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/README.md +0 -0
  217. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/a17-taxdiffs-expect.csv +0 -0
  218. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/a18-taxdiffs-expect.csv +0 -0
  219. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/a19-taxdiffs-expect.csv +0 -0
  220. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/a20-taxdiffs-expect.csv +0 -0
  221. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/a21-taxdiffs-expect.csv +0 -0
  222. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/b17-taxdiffs-expect.csv +0 -0
  223. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/b18-taxdiffs-expect.csv +0 -0
  224. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/b19-taxdiffs-expect.csv +0 -0
  225. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/b20-taxdiffs-expect.csv +0 -0
  226. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/b21-taxdiffs-expect.csv +0 -0
  227. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/c17-taxdiffs-expect.csv +0 -0
  228. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/c18-taxdiffs-expect.csv +0 -0
  229. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/expected_differences/c19-taxdiffs-expect.csv +0 -0
  230. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/input_setup.py +0 -0
  231. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/main_comparison.py +0 -0
  232. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/prepare_taxcalc_input.py +0 -0
  233. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/process_taxcalc_output.py +0 -0
  234. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/taxsim_emulation.json +0 -0
  235. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/taxsim_input.py +0 -0
  236. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/tc_sims.py +0 -0
  237. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/taxsim35/tests_35.py +0 -0
  238. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc/validation/tests_35.sh +0 -0
  239. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc.egg-info/SOURCES.txt +0 -0
  240. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc.egg-info/dependency_links.txt +0 -0
  241. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc.egg-info/entry_points.txt +0 -0
  242. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc.egg-info/requires.txt +0 -0
  243. {taxcalc-5.0.4 → taxcalc-5.2.0}/taxcalc.egg-info/top_level.txt +0 -0
  244. {taxcalc-5.0.4 → taxcalc-5.2.0}/tctest-nojit.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taxcalc
3
- Version: 5.0.4
3
+ Version: 5.2.0
4
4
  Summary: Tax-Calculator
5
5
  Home-page: https://github.com/PSLmodels/Tax-Calculator
6
6
  Download-URL: https://github.com/PSLmodels/Tax-Calculator
@@ -4,6 +4,44 @@ Go [here](https://github.com/PSLmodels/Tax-Calculator/pulls?q=is%3Apr+is%3Aclose
4
4
  for a complete commit history.
5
5
 
6
6
 
7
+ 2025-08-08 Release 5.2.0
8
+ ------------------------
9
+ (last merged pull request is
10
+ [#2944](https://github.com/PSLmodels/Tax-Calculator/pull/2944))
11
+
12
+ **This is an enhancement release.**
13
+
14
+ **API Changes**
15
+
16
+ **New Features**
17
+ - Make OBBBA reform be current-law policy in several PRs described in
18
+ [issue
19
+ 2926](https://github.com/PSLmodels/Tax-Calculator/issues/2926) by
20
+ Martin Holmer
21
+ - Extend CPS and PUF aggregate tests through 2035
22
+ [[#2944](https://github.com/PSLmodels/Tax-Calculator/pull/2944) by
23
+ Martin Holmer]
24
+
25
+
26
+ 2025-07-22 Release 5.1.0
27
+ ------------------------
28
+ (last merged pull request is
29
+ [#2933](https://github.com/PSLmodels/Tax-Calculator/pull/2933))
30
+
31
+ **This is an enhancement release.**
32
+
33
+ **API Changes**
34
+
35
+ **New Features**
36
+ - Add `PT_qbid_limited` policy parameter and associated logic
37
+ [[#2923](https://github.com/PSLmodels/Tax-Calculator/pull/2923) by Martin Holmer]
38
+ - Refactor tax-calculation function logic to reduce model execution time
39
+ [[#2924](https://github.com/PSLmodels/Tax-Calculator/pull/2924) by Martin Holmer]
40
+ - OBBBA-enhancement PRs 2927-2933 described in [issue 2926](https://github.com/PSLmodels/Tax-Calculator/issues/2926) by Martin Holmer
41
+
42
+ **Bug Fixes**
43
+
44
+
7
45
  2025-07-02 Release 5.0.0
8
46
  ------------------------
9
47
  (last merged pull request is
@@ -54,7 +54,7 @@ cross-model validation work with NBER's TAXSIM-35 model is described
54
54
 
55
55
  ## Latest release
56
56
 
57
- {doc}`5.0.0 (2025-07-02) <about/releases>`
57
+ {doc}`5.2.0 (2025-08-08) <about/releases>`
58
58
 
59
59
  If you are already using Tax-Calculator, upgrade using the following command:
60
60
  ```
@@ -50,7 +50,7 @@ TCJA_PARAMETERS = {
50
50
  "STD": {"indexed": True, "category": 4},
51
51
  # category 5 ...
52
52
  "ID_AllTaxes_c": {"indexed": False, "category": 5},
53
- "ID_Charity_crt_cash": {"indexed": False, "category": 5},
53
+ "ID_Charity_crt_all": {"indexed": False, "category": 5},
54
54
  "ID_Casualty_hc": {"indexed": False, "category": 5},
55
55
  "ID_Miscellaneous_hc": {"indexed": False, "category": 5},
56
56
  "ID_ps": {"indexed": True, "category": 5},
@@ -7,7 +7,7 @@ from setuptools import setup
7
7
  with open("README.md", "r", encoding="utf-8") as f:
8
8
  longdesc = f.read()
9
9
 
10
- VERSION = "5.0.4"
10
+ VERSION = "5.2.0"
11
11
 
12
12
  config = {
13
13
  "description": "Tax-Calculator",
@@ -14,6 +14,6 @@ from taxcalc.taxcalcio import *
14
14
  from taxcalc.utils import *
15
15
  from taxcalc.cli import *
16
16
 
17
- __version__ = '5.0.4'
17
+ __version__ = '5.2.0'
18
18
  __min_python3_version__ = 10
19
19
  __max_python3_version__ = 12
@@ -842,26 +842,39 @@ def AGI(ymod1, c02500, c02900, XTOT, MARS, sep, DSI, exact, nu18, taxable_ubi,
842
842
 
843
843
 
844
844
  @iterate_jit(nopython=True)
845
- def AutoLoanInterestDed(auto_loan_interest, MARS, c00100, exact,
846
- AutoLoanInterestDed_c,
847
- AutoLoanInterestDed_ps,
848
- AutoLoanInterestDed_po_step_size,
849
- AutoLoanInterestDed_po_rate_per_step,
850
- auto_loan_interest_deduction):
851
- """
852
- Calculates below-the-line deduction on qualified auto loan interest paid.
845
+ def MiscDed(age_head, age_spouse, MARS, c00100, exact,
846
+ SeniorDed_c, SeniorDed_ps, SeniorDed_prt,
847
+ auto_loan_interest,
848
+ AutoLoanInterestDed_c,
849
+ AutoLoanInterestDed_ps,
850
+ AutoLoanInterestDed_po_step_size,
851
+ AutoLoanInterestDed_po_rate_per_step,
852
+ senior_deduction, auto_loan_interest_deduction):
853
+ """
854
+ Calculates below-the-line deduction for elderly head/spouse and
855
+ deduction on qualified auto loan interest paid.
853
856
 
854
857
  Parameters
855
858
  ----------
856
- auto_loan_interest: float
857
- Qualified auto loan interest paid
859
+ age_head: int
860
+ Age of tax unit head
861
+ age_head: int
862
+ Age of tax unit spouse
858
863
  MARS: int
859
864
  Filing marital status (1=single, 2=joint, 3=separate,
860
865
  4=household-head, 5=widow(er))
861
866
  c00100: float
862
867
  Adjusted gross income
863
868
  exact: int
864
- Whether or not to smooth the deduction phase out
869
+ Whether or not to smooth deduction phase out
870
+ SeniorDed_c: float
871
+ Maximum amount of senior deduction per head/spouse aged 65+
872
+ SeniorDed_ps: list[float]
873
+ Senior deduction AGI phase-out start level
874
+ SeniorDed_prt: float
875
+ Senior deduction phase-out rate
876
+ auto_loan_interest: float
877
+ Qualified auto loan interest paid
865
878
  AutoLoanInterestDed_c: float
866
879
  Deduction cap
867
880
  AutoLoanInterestDed_ps: float
@@ -875,9 +888,28 @@ def AutoLoanInterestDed(auto_loan_interest, MARS, c00100, exact,
875
888
 
876
889
  Returns
877
890
  -------
891
+ senior_deduction: float
892
+ Deduction available to both itemizers and nonitemizers
878
893
  auto_loan_interest_deduction: float
879
894
  Deduction available to both itemizers and nonitemizers
880
895
  """
896
+ # calculate senior deduction
897
+ senior_deduction = 0.
898
+ if SeniorDed_c > 0.:
899
+ seniors = 0
900
+ if age_head >= 65:
901
+ seniors += 1
902
+ if MARS == 2 and age_spouse >= 65:
903
+ seniors += 1
904
+ if seniors > 0:
905
+ ded = seniors * SeniorDed_c
906
+ po_start = SeniorDed_ps[MARS - 1]
907
+ if c00100 > po_start:
908
+ excess_agi = c00100 - po_start
909
+ po_amount = excess_agi * SeniorDed_prt
910
+ ded = max(0., ded - po_amount)
911
+ senior_deduction = ded
912
+ # calculate auto loan interest deduction
881
913
  auto_loan_interest_deduction = 0.
882
914
  if AutoLoanInterestDed_c > 0. and auto_loan_interest > 0.:
883
915
  # cap deduction
@@ -895,23 +927,25 @@ def AutoLoanInterestDed(auto_loan_interest, MARS, c00100, exact,
895
927
  po_amount = excess_agi * po_rate
896
928
  ded = max(0., ded - po_amount)
897
929
  auto_loan_interest_deduction = ded
898
- return auto_loan_interest_deduction
930
+ return (senior_deduction, auto_loan_interest_deduction)
899
931
 
900
932
 
901
933
  @iterate_jit(nopython=True)
902
934
  def ItemDed(e17500, e18400, e18500, e19200,
903
935
  e19800, e20100, e20400, g20500,
904
- MARS, age_head, age_spouse, c00100, c04470, c21040, c21060,
905
- c17000, c18300, c19200, c19700, c20500, c20800,
936
+ MARS, age_head, age_spouse, c00100, c04600, c04470, c21040, c21060,
937
+ c17000, c18300, c19200, c19700, c20500, c20800, II_brk6,
906
938
  ID_ps, ID_Medical_frt, ID_Medical_frt_add4aged, ID_Medical_hc,
907
939
  ID_Casualty_frt, ID_Casualty_hc, ID_Miscellaneous_frt,
908
- ID_Miscellaneous_hc, ID_Charity_crt_cash, ID_Charity_crt_noncash,
940
+ ID_Miscellaneous_hc, ID_Charity_crt_all, ID_Charity_crt_noncash,
909
941
  ID_prt, ID_crt, ID_c, ID_StateLocalTax_hc, ID_Charity_frt,
910
942
  ID_Charity_hc, ID_InterestPaid_hc, ID_RealEstate_hc,
911
943
  ID_Medical_c, ID_StateLocalTax_c, ID_RealEstate_c,
912
944
  ID_InterestPaid_c, ID_Charity_c, ID_Casualty_c,
913
945
  ID_Miscellaneous_c, ID_AllTaxes_c, ID_AllTaxes_hc,
914
- ID_StateLocalTax_crt, ID_RealEstate_crt, ID_Charity_f):
946
+ ID_AllTaxes_c_ps, ID_AllTaxes_c_po_rate, ID_AllTaxes_c_po_floor,
947
+ ID_StateLocalTax_crt, ID_RealEstate_crt, ID_Charity_f,
948
+ ID_reduction_rate):
915
949
  """
916
950
  Calculates itemized deductions, Form 1040, Schedule A.
917
951
 
@@ -942,12 +976,14 @@ def ItemDed(e17500, e18400, e18500, e19200,
942
976
  Age in years of spouse
943
977
  c00100: float
944
978
  Adjusted gross income (AGI)
979
+ c04600: float
980
+ Personal exemptions after phase out
945
981
  c04470: float
946
- Itemized deductions after phase out (0 for non itemizers)
982
+ Itemized deductions after all limitations (0 for non-itemizers)
947
983
  c21040: float
948
- Itemized deductions that are phased out
984
+ Itemized deductions that are limited under the Pease limitations
949
985
  c21060: float
950
- Itemized deductions before phase out (0 for non itemizers)
986
+ Itemized deductions before limitation (0 for non-itemizers)
951
987
  c17000: float
952
988
  Schedule A: medical expenses deducted
953
989
  c18300: float
@@ -960,6 +996,8 @@ def ItemDed(e17500, e18400, e18500, e19200,
960
996
  Schedule A: net casualty or theft loss deducted
961
997
  c20800: float
962
998
  Schedule A: net limited miscellaneous deductions deducted
999
+ II_brk6: list
1000
+ Bottom of top income tax rate bracket
963
1001
  ID_ps: list
964
1002
  Itemized deduction phaseout AGI start (Pease)
965
1003
  ID_Medical_frt: float
@@ -978,8 +1016,8 @@ def ItemDed(e17500, e18400, e18500, e19200,
978
1016
  miscellaneous expenses
979
1017
  ID_Miscellaneous_hc: float
980
1018
  Miscellaneous expense deduction haircut
981
- ID_Charity_crt_cash: float
982
- Ceiling (as decimal fraction of AGI) for cash charitable
1019
+ ID_Charity_crt_all: float
1020
+ Ceiling (as decimal fraction of AGI) for all charitable
983
1021
  contribution deductions
984
1022
  ID_Charity_crt_noncash: float
985
1023
  Ceiling (as decimal fraction of AGI) for noncash charitable
@@ -1020,10 +1058,16 @@ def ItemDed(e17500, e18400, e18500, e19200,
1020
1058
  Ceiling on the amount of miscellaneous expense deduction
1021
1059
  allowed (dollars)
1022
1060
  ID_AllTaxes_c: list
1023
- Ceiling on the amount of state and local income, stales, and
1061
+ Cap on the amount of state and local income, sales, and
1024
1062
  real estate deductions allowed (dollars)
1025
1063
  ID_AllTaxes_hc: float
1026
1064
  State and local income, sales, and real estate tax deduciton haircut
1065
+ ID_AllTaxes_c_ps: float
1066
+ AGI level above which ID_AllTaxes_c is reduced
1067
+ ID_AllTaxes_c_po_rate: float
1068
+ ID_AllTaxes_c reduction rate when AGI is above ID_AllTaxes_c_ps
1069
+ ID_AllTaxes_c_po_floor: float
1070
+ Floor below which ID_AllTaxes_c cannot be reduced
1027
1071
  ID_StateLocalTax_crt: float
1028
1072
  Ceiling (as decimal fraction of AGI) for the combination of all
1029
1073
  state and local income and sales tax deductions
@@ -1032,6 +1076,8 @@ def ItemDed(e17500, e18400, e18500, e19200,
1032
1076
  state, local, and foreign real estate tax deductions
1033
1077
  ID_Charity_f: list
1034
1078
  Floor on the amount of charity expense deduction allowed (dollars)
1079
+ ID_reduction_rate: float
1080
+ OBBBA reduction rate for all itemized deductions
1035
1081
 
1036
1082
  Returns
1037
1083
  -------
@@ -1048,12 +1094,13 @@ def ItemDed(e17500, e18400, e18500, e19200,
1048
1094
  c20800: float
1049
1095
  Schedule A: net limited miscellaneous deductions deducted
1050
1096
  c21040: float
1051
- Itemized deductions that are phased out
1097
+ Itemized deductions that are phased out under Pease limitation
1052
1098
  c21060: float
1053
- Itemized deductions before phase out (0 for non itemizers)
1099
+ Itemized deductions before any limitation (0 for non-itemizers)
1054
1100
  c04470: float
1055
- Itemized deductions after phase out (0 for non itemizers)
1101
+ Itemized deductions after all limitations (0 for non-itemizers)
1056
1102
  """
1103
+ # pylint: disable=too-many-statements
1057
1104
  posagi = max(c00100, 0.)
1058
1105
  # Medical
1059
1106
  medical_frt = ID_Medical_frt
@@ -1073,17 +1120,23 @@ def ItemDed(e17500, e18400, e18500, e19200,
1073
1120
  c18400 = min(c18400, ID_StateLocalTax_crt * max(c00100, 0.0001))
1074
1121
  c18500 = min(c18500, ID_RealEstate_crt * max(c00100, 0.0001))
1075
1122
  c18300 = (c18400 + c18500) * (1. - ID_AllTaxes_hc)
1076
- c18300 = min(c18300, ID_AllTaxes_c[MARS - 1])
1123
+ cap = ID_AllTaxes_c[MARS - 1]
1124
+ if posagi > ID_AllTaxes_c_ps[MARS - 1]:
1125
+ excess_agi = posagi - ID_AllTaxes_c_ps[MARS - 1]
1126
+ cap = max(0., cap - excess_agi * ID_AllTaxes_c_po_rate)
1127
+ cap = max(cap, ID_AllTaxes_c_po_floor[MARS - 1])
1128
+ c18300 = min(c18300, cap)
1077
1129
  # Interest paid
1078
1130
  c19200 = e19200 * (1. - ID_InterestPaid_hc)
1079
1131
  c19200 = min(c19200, ID_InterestPaid_c[MARS - 1])
1080
1132
  # Charity
1081
- charity_ded_cash = min(ID_Charity_crt_cash * posagi, e19800)
1082
- charity_ded_noncash = min(ID_Charity_crt_noncash * posagi, e20100)
1083
- c19700 = charity_ded_cash + charity_ded_noncash
1084
- # charity floor is zero in present law
1085
- charity_floor = max(ID_Charity_frt * posagi, ID_Charity_f[MARS - 1])
1086
- c19700 = max(0., c19700 - charity_floor) * (1. - ID_Charity_hc)
1133
+ floor = max(ID_Charity_frt * posagi, ID_Charity_f[MARS - 1])
1134
+ noncash_ded = max(0., e20100 - floor)
1135
+ charity_ded_noncash = min(ID_Charity_crt_noncash * posagi, noncash_ded)
1136
+ remaining_floor = max(0., floor - e20100)
1137
+ charity_ded_cash = max(0., e19800 - remaining_floor)
1138
+ c19700 = charity_ded_noncash + charity_ded_cash
1139
+ c19700 = min(c19700, ID_Charity_crt_all * posagi) * (1. - ID_Charity_hc)
1087
1140
  c19700 = min(c19700, ID_Charity_c[MARS - 1])
1088
1141
  # Casualty
1089
1142
  c20500 = (max(0., g20500 - ID_Casualty_frt * posagi) *
@@ -1096,8 +1149,8 @@ def ItemDed(e17500, e18400, e18500, e19200,
1096
1149
  c20800 = min(c20800, ID_Miscellaneous_c[MARS - 1])
1097
1150
  # Gross total itemized deductions
1098
1151
  c21060 = c17000 + c18300 + c19200 + c19700 + c20500 + c20800
1099
- # Limitations on total itemized deductions
1100
- # (no attempt to adjust c04470 components for limitations)
1152
+ # Pease limitation on total itemized deductions
1153
+ # (no attempt to adjust c04470 components for limitation)
1101
1154
  nonlimited = c17000 + c20500
1102
1155
  limitstart = ID_ps[MARS - 1]
1103
1156
  if c21060 > nonlimited and c00100 > limitstart:
@@ -1108,8 +1161,19 @@ def ItemDed(e17500, e18400, e18500, e19200,
1108
1161
  else:
1109
1162
  c21040 = 0.
1110
1163
  c04470 = c21060
1164
+ # OBBBA limitation on total itemized deductions
1165
+ # (no attempt to adjust c04470 components for limitation)
1166
+ reduction = 0.
1167
+ if ID_reduction_rate > 0.:
1168
+ assert c21040 <= 0.0, "Pease and OBBBA cannot both be in effect"
1169
+ tincome = max(0., c00100 - c04600)
1170
+ texcess = max(0., tincome - II_brk6[MARS - 1])
1171
+ reduction = ID_reduction_rate * texcess
1172
+ c04470 = max(0., c04470 - reduction)
1173
+ # Cap total itemized deductions
1174
+ # (no attempt to adjust c04470 components for limitation)
1111
1175
  c04470 = min(c04470, ID_c[MARS - 1])
1112
- # Return total itemized deduction amounts and components
1176
+ # Return total itemized deduction amounts and pre-limitation components
1113
1177
  return (c17000, c18300, c19200, c19700, c20500, c20800,
1114
1178
  c21040, c21060, c04470)
1115
1179
 
@@ -1165,7 +1229,7 @@ def AdditionalMedicareTax(e00200, MARS,
1165
1229
  @iterate_jit(nopython=True)
1166
1230
  def StdDed(DSI, earned, STD, age_head, age_spouse, STD_Aged, STD_Dep,
1167
1231
  MARS, MIDR, blind_head, blind_spouse, standard,
1168
- STD_allow_charity_ded_nonitemizers, e19800, ID_Charity_crt_cash,
1232
+ STD_allow_charity_ded_nonitemizers, e19800, ID_Charity_crt_all,
1169
1233
  c00100, STD_charity_ded_nonitemizers_max):
1170
1234
  """
1171
1235
  Calculates standard deduction, including standard deduction for
@@ -1203,8 +1267,8 @@ def StdDed(DSI, earned, STD, age_head, age_spouse, STD_Aged, STD_Dep,
1203
1267
  deduction
1204
1268
  e19800: float
1205
1269
  Schedule A: cash charitable contributions
1206
- ID_Charity_crt_cash: float
1207
- Fraction of AGI cap on cash charitable deductions
1270
+ ID_Charity_crt_all: float
1271
+ Fraction of AGI cap on all charitable deductions
1208
1272
  c00100: float
1209
1273
  Federal AGI
1210
1274
  STD_charity_ded_nonitemizers_max: float
@@ -1238,19 +1302,21 @@ def StdDed(DSI, earned, STD, age_head, age_spouse, STD_Aged, STD_Dep,
1238
1302
  standard = 0.
1239
1303
  # calculate CARES cash charity deduction for nonitemizers
1240
1304
  if STD_allow_charity_ded_nonitemizers:
1241
- capped_ded = min(e19800, ID_Charity_crt_cash * c00100)
1305
+ capped_ded = min(e19800, ID_Charity_crt_all * c00100)
1242
1306
  standard += min(capped_ded, STD_charity_ded_nonitemizers_max[MARS - 1])
1243
1307
  return standard
1244
1308
 
1245
1309
 
1246
1310
  @iterate_jit(nopython=True)
1247
1311
  def TaxInc(c00100, standard, c04470, c04600, MARS, e00900, c03260, e26270,
1248
- e02100, e27200, e00650, c01000, auto_loan_interest_deduction,
1312
+ e02100, e27200, e00650, c01000,
1313
+ senior_deduction, auto_loan_interest_deduction,
1249
1314
  PT_SSTB_income, PT_binc_w2_wages, PT_ubia_property,
1250
1315
  PT_qbid_rt, PT_qbid_limited,
1251
1316
  PT_qbid_taxinc_thd, PT_qbid_taxinc_gap, PT_qbid_w2_wages_rt,
1252
- PT_qbid_alt_w2_wages_rt, PT_qbid_alt_property_rt, c04800,
1253
- PT_qbid_ps, PT_qbid_prt, qbided):
1317
+ PT_qbid_alt_w2_wages_rt, PT_qbid_alt_property_rt,
1318
+ PT_qbid_ps, PT_qbid_prt, PT_qbid_min_ded, PT_qbid_min_qbi,
1319
+ c04800, qbided):
1254
1320
  """
1255
1321
  Calculates taxable income, c04800, and
1256
1322
  qualified business income deduction, qbided.
@@ -1282,6 +1348,8 @@ def TaxInc(c00100, standard, c04470, c04600, MARS, e00900, c03260, e26270,
1282
1348
  Qualified dividends included in ordinary dividends
1283
1349
  c01000: float
1284
1350
  Limitation on capital losses
1351
+ senior_deduction: float
1352
+ Deduction for elderly head/spouse
1285
1353
  auto_loan_interest_deduction: float
1286
1354
  Deduction for qualified auto loan interest paid
1287
1355
  PT_SSTB_income: int
@@ -1309,12 +1377,16 @@ def TaxInc(c00100, standard, c04470, c04600, MARS, e00900, c03260, e26270,
1309
1377
  Alternative QBID cap rate on pass-through business W-2 wages paid
1310
1378
  PT_qbid_alt_property_rt: float
1311
1379
  Alternative QBID cap rate on pass-through business property owned
1312
- c04800: float
1313
- Regular taxable income
1314
1380
  PT_qbid_ps: list
1315
1381
  QBID phaseout taxable income start
1316
1382
  PT_qbid_prt: float
1317
1383
  QBID phaseout rate
1384
+ PT_qbid_min_ded: float
1385
+ Minimum QBID amount
1386
+ PT_qbid_min_qbi: float
1387
+ Minimum QBI necessary to get QBID no less than PT_qbid_min_ded
1388
+ c04800: float
1389
+ Regular taxable income
1318
1390
  qbided: float
1319
1391
  Qualified Business Income (QBI) deduction
1320
1392
 
@@ -1325,8 +1397,10 @@ def TaxInc(c00100, standard, c04470, c04600, MARS, e00900, c03260, e26270,
1325
1397
  qbided: float
1326
1398
  Qualified Business Income (QBI) deduction
1327
1399
  """
1328
- # calculate taxable income before qualified business income deduction
1329
- pre_qbid_taxinc = max(0., c00100 - max(c04470, standard) - c04600)
1400
+ # calculate taxable income before qualified business income deduction,
1401
+ # which is assumed to be stacked last in the list of deductions
1402
+ odeds = senior_deduction + auto_loan_interest_deduction
1403
+ pre_qbid_taxinc = max(0., c00100 - max(c04470, standard) - c04600 - odeds)
1330
1404
  # calculate qualified business income deduction
1331
1405
  qbinc = max(0., e00900 - c03260 + e26270 + e02100 + e27200)
1332
1406
  qbid_before_limits = qbinc * PT_qbid_rt
@@ -1371,9 +1445,12 @@ def TaxInc(c00100, standard, c04470, c04600, MARS, e00900, c03260, e26270,
1371
1445
  qbided = max(0., qbided - PT_qbid_prt * excess)
1372
1446
  else: # if PT_qbid_limited is false
1373
1447
  qbided = qbid_before_limits
1448
+ # apply minimum QBID logic
1449
+ if qbinc >= PT_qbid_min_qbi and qbided < PT_qbid_min_ded:
1450
+ qbided = PT_qbid_min_ded
1374
1451
 
1375
- # calculate taxable income after qualified business income deduction
1376
- c04800 = max(0., pre_qbid_taxinc - qbided - auto_loan_interest_deduction)
1452
+ # calculate taxable income after qbided
1453
+ c04800 = max(0., pre_qbid_taxinc - qbided)
1377
1454
  return (c04800, qbided)
1378
1455
 
1379
1456
 
@@ -1823,7 +1900,7 @@ def AMT(e07300, dwks13, standard, f6251, c00100, c18300, taxbc,
1823
1900
  taxbc: float
1824
1901
  Regular tax on regular taxable income before credits
1825
1902
  c04470: float
1826
- Itemized deductions after phase-out (zero for non itemizers)
1903
+ Itemized deductions after phase-out (zero for non-itemizers)
1827
1904
  c17000: float
1828
1905
  Schedule A: Medical expenses deducted
1829
1906
  c20800: float
@@ -14,7 +14,7 @@ import paramtools
14
14
  from taxcalc.calcfunctions import (TaxInc, SchXYZTax, GainsTax, AGIsurtax,
15
15
  NetInvIncTax, AMT, EI_PayrollTax, Adj,
16
16
  DependentCare, ALD_InvInc_ec_base, CapGains,
17
- SSBenefits, UBI, AGI, AutoLoanInterestDed,
17
+ SSBenefits, UBI, AGI, MiscDed,
18
18
  ItemDed, StdDed, AdditionalMedicareTax,
19
19
  F2441, EITC, RefundablePayrollTaxCredit,
20
20
  ChildDepTaxCredit, AdditionalCTC, CTC_new,
@@ -1391,7 +1391,7 @@ class Calculator():
1391
1391
  CapGains(self.__policy, self.__records)
1392
1392
  SSBenefits(self.__policy, self.__records)
1393
1393
  AGI(self.__policy, self.__records)
1394
- AutoLoanInterestDed(self.__policy, self.__records)
1394
+ MiscDed(self.__policy, self.__records)
1395
1395
  ItemDed(self.__policy, self.__records)
1396
1396
  AdditionalMedicareTax(self.__policy, self.__records)
1397
1397
  StdDed(self.__policy, self.__records)
@@ -61,7 +61,7 @@ class Policy(Parameters):
61
61
  # following parameters were renamed in PR 2918
62
62
  'SS_thd50': 'was renamed SS_thd1 in Tax-Calculator 5.0.0',
63
63
  'SS_thd85': 'was renamed SS_thd2 in Tax-Calculator 5.0.0',
64
- # following parameters were removed in PR 2619
64
+ # following parameters were removed in PR 2919
65
65
  'PT_rt1': 'was removed in Tax-Calculator 5.0.0',
66
66
  'PT_rt2': 'was removed in Tax-Calculator 5.0.0',
67
67
  'PT_rt3': 'was removed in Tax-Calculator 5.0.0',
@@ -81,7 +81,7 @@ class Policy(Parameters):
81
81
  'PT_EligibleRate_passive': 'was removed in Tax-Calculator 5.0.0',
82
82
  'PT_wages_active_income': 'was removed in Tax-Calculator 5.0.0',
83
83
  'PT_top_stacking': 'was removed in Tax-Calculator 5.0.0',
84
- # following parameters were removed in PR 2620
84
+ # following parameters were removed in PR 2920
85
85
  'ID_AmountCap_Switch': 'was removed in Tax-Calculator 5.0.0',
86
86
  'ID_AmountCap_rt': 'was removed in Tax-Calculator 5.0.0',
87
87
  'ID_BenefitCap_Switch': 'was removed in Tax-Calculator 5.0.0',
@@ -90,13 +90,25 @@ class Policy(Parameters):
90
90
  'ID_BenefitSurtax_crt': 'was removed in Tax-Calculator 5.0.0',
91
91
  'ID_BenefitSurtax_trt': 'was removed in Tax-Calculator 5.0.0',
92
92
  'ID_BenefitSurtax_em': 'was removed in Tax-Calculator 5.0.0',
93
- # following parameters were renamed in PR 2628
93
+ # following parameters were renamed in PR 2928
94
94
  'CDCC_ps': 'was renamed CDCC_ps1 in Tax-Calculator 5.1.0',
95
95
  'CDCC_crt': 'was renamed CDCC_po1_rate_max in Tax-Calculator 5.1.0',
96
96
  'CDCC_frt': 'was renamed CDCC_po1_rate_min in Tax-Calculator 5.1.0',
97
97
  'CDCC_po_step_size': (
98
- 'was renamed CDCC_po1_step_size'
99
- 'in Tax-Calculator 5.1.0'
98
+ 'was renamed CDCC_po1_step_size in Tax-Calculator 5.1.0'
99
+ ),
100
+ # following parameter was renamed in PR 2929
101
+ 'II_prt': 'was renamed II_em_prt in Tax-Calculator 5.1.0',
102
+ # following parameter was renamed in PR 2932
103
+ 'ID_Charity_crt_cash': (
104
+ 'was renamed ID_Charity_crt_all in Tax-Calculator 5.1.0'
105
+ ),
106
+ # following parameters were renamed in PR 2939
107
+ 'ID_reduction_salt_rate': (
108
+ 'was renamed ID_reduction_rate in Tax-Calculator 5.1.0'
109
+ ),
110
+ 'ID_reduction_other_rate': (
111
+ 'was renamed ID_reduction_rate in Tax-Calculator 5.1.0'
100
112
  ),
101
113
  }
102
114
  # (2) specify which Policy parameters have been redefined recently