taxcalc 4.6.1__tar.gz → 4.6.2__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 (243) hide show
  1. {taxcalc-4.6.1/taxcalc.egg-info → taxcalc-4.6.2}/PKG-INFO +5 -2
  2. {taxcalc-4.6.1 → taxcalc-4.6.2}/README.md +3 -0
  3. {taxcalc-4.6.1 → taxcalc-4.6.2}/conda.recipe/meta.yaml +2 -2
  4. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/about/releases.md +18 -0
  5. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/cli.md +4 -0
  6. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/index.md +1 -1
  7. taxcalc-4.6.2/docs/usage/tcja_after_2025.md +333 -0
  8. {taxcalc-4.6.1 → taxcalc-4.6.2}/environment.yml +1 -2
  9. {taxcalc-4.6.1 → taxcalc-4.6.2}/setup.py +2 -2
  10. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/__init__.py +1 -1
  11. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/calcfunctions.py +2 -2
  12. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/policy_current_law.json +1 -1
  13. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ext.json +0 -2
  14. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/taxcalcio.py +23 -3
  15. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_4package.py +0 -1
  16. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_policy.py +0 -13
  17. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_reforms.py +1 -1
  18. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_taxcalcio.py +19 -0
  19. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/utils.py +27 -5
  20. {taxcalc-4.6.1 → taxcalc-4.6.2/taxcalc.egg-info}/PKG-INFO +5 -2
  21. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc.egg-info/requires.txt +1 -1
  22. taxcalc-4.6.1/docs/usage/tcja_after_2025.md +0 -127
  23. {taxcalc-4.6.1 → taxcalc-4.6.2}/.coveragerc +0 -0
  24. {taxcalc-4.6.1 → taxcalc-4.6.2}/.github/FUNDING.yml +0 -0
  25. {taxcalc-4.6.1 → taxcalc-4.6.2}/.github/workflows/build_and_test.yml +0 -0
  26. {taxcalc-4.6.1 → taxcalc-4.6.2}/.github/workflows/check_jupyterbook.yml +0 -0
  27. {taxcalc-4.6.1 → taxcalc-4.6.2}/.github/workflows/deploy_jupyterbook.yml +0 -0
  28. {taxcalc-4.6.1 → taxcalc-4.6.2}/.github/workflows/deploy_parameters_docs.yml +0 -0
  29. {taxcalc-4.6.1 → taxcalc-4.6.2}/.gitignore +0 -0
  30. {taxcalc-4.6.1 → taxcalc-4.6.2}/LICENSE +0 -0
  31. {taxcalc-4.6.1 → taxcalc-4.6.2}/MANIFEST.in +0 -0
  32. {taxcalc-4.6.1 → taxcalc-4.6.2}/Makefile +0 -0
  33. {taxcalc-4.6.1 → taxcalc-4.6.2}/PSL_catalog.json +0 -0
  34. {taxcalc-4.6.1 → taxcalc-4.6.2}/codecov.yml +0 -0
  35. {taxcalc-4.6.1 → taxcalc-4.6.2}/conda.recipe/bld.bat +0 -0
  36. {taxcalc-4.6.1 → taxcalc-4.6.2}/conda.recipe/build.sh +0 -0
  37. {taxcalc-4.6.1 → taxcalc-4.6.2}/csv_show.sh +0 -0
  38. {taxcalc-4.6.1 → taxcalc-4.6.2}/csv_vars.sh +0 -0
  39. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/PSL.svg +0 -0
  40. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/_config.yml +0 -0
  41. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/_static/atr.png +0 -0
  42. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/_static/mtr.png +0 -0
  43. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/_static/pch.png +0 -0
  44. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/_toc.yml +0 -0
  45. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/about/LICENSE.md +0 -0
  46. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/about/history.md +0 -0
  47. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/about/roadmap.md +0 -0
  48. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/calcfunctions.rst +0 -0
  49. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/calculator.rst +0 -0
  50. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/consumption.rst +0 -0
  51. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/data.rst +0 -0
  52. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/decorators.rst +0 -0
  53. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/growdiff.rst +0 -0
  54. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/growfactors.rst +0 -0
  55. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/parameters.rst +0 -0
  56. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/policy.rst +0 -0
  57. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/public_api.rst +0 -0
  58. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/records.rst +0 -0
  59. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/taxcalcio.rst +0 -0
  60. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/utils.rst +0 -0
  61. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/api/utilsprvt.rst +0 -0
  62. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/contributing/RELEASING.md +0 -0
  63. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/contributing/contributor_guide.md +0 -0
  64. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/contributing/param_naming.md +0 -0
  65. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/contributing/pr_workflow.md +0 -0
  66. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/contributing/testing.md +0 -0
  67. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/README.md +0 -0
  68. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/assumption_params.md +0 -0
  69. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/index.md +0 -0
  70. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/input_vars.md +0 -0
  71. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/make/make_io_vars.py +0 -0
  72. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/make/make_params.py +0 -0
  73. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/make/make_uguide.py +0 -0
  74. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/output_vars.md +0 -0
  75. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/policy_params.md +0 -0
  76. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/python_interface.md +0 -0
  77. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/templates/assumption_params_template.md +0 -0
  78. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/templates/input_vars_template.md +0 -0
  79. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/templates/output_vars_template.md +0 -0
  80. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/guide/templates/policy_params_template.md +0 -0
  81. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/README.md +0 -0
  82. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/_static/reformA.json +0 -0
  83. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/_static/reformB.json +0 -0
  84. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/_static/reformC.json +0 -0
  85. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/convert_all.sh +0 -0
  86. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/index.md +0 -0
  87. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe00.md +0 -0
  88. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe01.md +0 -0
  89. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe02.md +0 -0
  90. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe03.md +0 -0
  91. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe04.md +0 -0
  92. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe04_pandas.md +0 -0
  93. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe05.md +0 -0
  94. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/md_src/recipe06.md +0 -0
  95. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe00.ipynb +0 -0
  96. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe01.ipynb +0 -0
  97. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe02.ipynb +0 -0
  98. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe03.ipynb +0 -0
  99. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe04.ipynb +0 -0
  100. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe04_pandas.ipynb +0 -0
  101. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe05.ipynb +0 -0
  102. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/recipes/recipe06.ipynb +0 -0
  103. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/usage/data.md +0 -0
  104. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/usage/overview.md +0 -0
  105. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/usage/starting.md +0 -0
  106. {taxcalc-4.6.1 → taxcalc-4.6.2}/docs/use_cases.md +0 -0
  107. {taxcalc-4.6.1 → taxcalc-4.6.2}/extend_tcja.py +0 -0
  108. {taxcalc-4.6.1 → taxcalc-4.6.2}/gitpr +0 -0
  109. {taxcalc-4.6.1 → taxcalc-4.6.2}/gitpr.bat +0 -0
  110. {taxcalc-4.6.1 → taxcalc-4.6.2}/gitsync +0 -0
  111. {taxcalc-4.6.1 → taxcalc-4.6.2}/gitsync.bat +0 -0
  112. {taxcalc-4.6.1 → taxcalc-4.6.2}/ppp.py +0 -0
  113. {taxcalc-4.6.1 → taxcalc-4.6.2}/pyproject.toml +0 -0
  114. {taxcalc-4.6.1 → taxcalc-4.6.2}/pytest.ini +0 -0
  115. {taxcalc-4.6.1 → taxcalc-4.6.2}/setup.cfg +0 -0
  116. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/assumptions/ASSUMPTIONS.md +0 -0
  117. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/assumptions/README.md +0 -0
  118. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/assumptions/economic_assumptions_template.json +0 -0
  119. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/calculator.py +0 -0
  120. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/cli/__init__.py +0 -0
  121. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/cli/tc.py +0 -0
  122. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/conftest.py +0 -0
  123. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/consumption.json +0 -0
  124. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/consumption.py +0 -0
  125. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/cps.csv.gz +0 -0
  126. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/cps_weights.csv.gz +0 -0
  127. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/data.py +0 -0
  128. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/decorators.py +0 -0
  129. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/growdiff.json +0 -0
  130. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/growdiff.py +0 -0
  131. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/growfactors.csv +0 -0
  132. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/growfactors.py +0 -0
  133. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/parameters.py +0 -0
  134. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/policy.py +0 -0
  135. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/puf_ratios.csv +0 -0
  136. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/puf_weights.csv.gz +0 -0
  137. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/records.py +0 -0
  138. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/records_variables.json +0 -0
  139. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/2017_law.json +0 -0
  140. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/2017_law.out.csv +0 -0
  141. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ARPA.json +0 -0
  142. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ARPA.out.csv +0 -0
  143. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/BrownKhanna.json +0 -0
  144. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/BrownKhanna.out.csv +0 -0
  145. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/CARES.json +0 -0
  146. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/CARES.out.csv +0 -0
  147. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ConsolidatedAppropriationsAct2021.json +0 -0
  148. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ConsolidatedAppropriationsAct2021.out.csv +0 -0
  149. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Larson2019.json +0 -0
  150. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Larson2019.out.csv +0 -0
  151. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/README.md +0 -0
  152. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/REFORMS.md +0 -0
  153. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Renacci.json +0 -0
  154. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Renacci.out.csv +0 -0
  155. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/SandersDeFazio.json +0 -0
  156. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/SandersDeFazio.out.csv +0 -0
  157. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/TCJA.json +0 -0
  158. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/TCJA.md +0 -0
  159. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/TCJA.out.csv +0 -0
  160. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Trump2016.json +0 -0
  161. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Trump2016.out.csv +0 -0
  162. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Trump2017.json +0 -0
  163. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/Trump2017.out.csv +0 -0
  164. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/Clinton2016.json +0 -0
  165. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/RyanBrady.json +0 -0
  166. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_House.json +0 -0
  167. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_House_Amended.json +0 -0
  168. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_Reconciliation.json +0 -0
  169. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_Senate.json +0 -0
  170. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_Senate_111417.json +0 -0
  171. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/archive/TCJA_Senate_120117.json +0 -0
  172. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/cases.csv +0 -0
  173. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/clp.out.csv +0 -0
  174. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/growfactors_ext.csv +0 -0
  175. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes0.json +0 -0
  176. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes0.out.csv +0 -0
  177. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes1.json +0 -0
  178. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes1.out.csv +0 -0
  179. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes2.json +0 -0
  180. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes2.out.csv +0 -0
  181. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes3.json +0 -0
  182. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/reforms/ptaxes3.out.csv +0 -0
  183. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/benefits_expect.csv +0 -0
  184. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/cmpi_cps_expect.txt +0 -0
  185. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/cmpi_puf_expect.txt +0 -0
  186. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/conftest.py +0 -0
  187. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/cpscsv_agg_expect.csv +0 -0
  188. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/puf_var_correl_coeffs_2016.csv +0 -0
  189. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/puf_var_wght_means_by_year.csv +0 -0
  190. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/pufcsv_agg_expect.csv +0 -0
  191. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/pufcsv_mtr_expect.txt +0 -0
  192. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/reforms.json +0 -0
  193. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/reforms_expect.csv +0 -0
  194. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_benefits.py +0 -0
  195. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_calcfunctions.py +0 -0
  196. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_calculator.py +0 -0
  197. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_compare.py +0 -0
  198. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_compatible_data.py +0 -0
  199. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_consumption.py +0 -0
  200. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_cpscsv.py +0 -0
  201. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_data.py +0 -0
  202. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_decorators.py +0 -0
  203. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_growdiff.py +0 -0
  204. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_growfactors.py +0 -0
  205. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_parameters.py +0 -0
  206. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_puf_var_stats.py +0 -0
  207. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_pufcsv.py +0 -0
  208. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_records.py +0 -0
  209. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_responses.py +0 -0
  210. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/tests/test_utils.py +0 -0
  211. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/utilsprvt.py +0 -0
  212. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/CSV_INPUT_VARS.md +0 -0
  213. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/CSV_OUTPUT_VARS.md +0 -0
  214. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/README.md +0 -0
  215. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/Differences_Explained.md +0 -0
  216. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/README.md +0 -0
  217. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/a17-taxdiffs-expect.csv +0 -0
  218. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/a18-taxdiffs-expect.csv +0 -0
  219. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/a19-taxdiffs-expect.csv +0 -0
  220. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/a20-taxdiffs-expect.csv +0 -0
  221. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/a21-taxdiffs-expect.csv +0 -0
  222. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/b17-taxdiffs-expect.csv +0 -0
  223. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/b18-taxdiffs-expect.csv +0 -0
  224. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/b19-taxdiffs-expect.csv +0 -0
  225. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/b20-taxdiffs-expect.csv +0 -0
  226. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/b21-taxdiffs-expect.csv +0 -0
  227. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/c17-taxdiffs-expect.csv +0 -0
  228. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/c18-taxdiffs-expect.csv +0 -0
  229. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/expected_differences/c19-taxdiffs-expect.csv +0 -0
  230. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/input_setup.py +0 -0
  231. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/main_comparison.py +0 -0
  232. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/prepare_taxcalc_input.py +0 -0
  233. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/process_taxcalc_output.py +0 -0
  234. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/taxsim_emulation.json +0 -0
  235. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/taxsim_input.py +0 -0
  236. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/tc_sims.py +0 -0
  237. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/taxsim35/tests_35.py +0 -0
  238. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc/validation/tests_35.sh +0 -0
  239. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc.egg-info/SOURCES.txt +0 -0
  240. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc.egg-info/dependency_links.txt +0 -0
  241. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc.egg-info/entry_points.txt +0 -0
  242. {taxcalc-4.6.1 → taxcalc-4.6.2}/taxcalc.egg-info/top_level.txt +0 -0
  243. {taxcalc-4.6.1 → taxcalc-4.6.2}/tctest-nojit.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taxcalc
3
- Version: 4.6.1
3
+ Version: 4.6.2
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
@@ -22,7 +22,7 @@ Requires-Dist: numpy>=1.26
22
22
  Requires-Dist: pandas>=2.2
23
23
  Requires-Dist: bokeh>=2.4
24
24
  Requires-Dist: numba
25
- Requires-Dist: paramtools>=0.19.0
25
+ Requires-Dist: paramtools>=0.20.0
26
26
  Dynamic: classifier
27
27
  Dynamic: description
28
28
  Dynamic: description-content-type
@@ -57,3 +57,6 @@ explains the workflow involved in contributing model enhancements.
57
57
 
58
58
  Complete documentation is available
59
59
  [here](https://PSLmodels.github.io/Tax-Calculator/).
60
+ This documentation includes
61
+ [examples](https://taxcalc.pslmodels.org/usage/tcja_after_2025.html)
62
+ of how to analyze different ways of extending TCJA policy beyond 2025.
@@ -22,3 +22,6 @@ explains the workflow involved in contributing model enhancements.
22
22
 
23
23
  Complete documentation is available
24
24
  [here](https://PSLmodels.github.io/Tax-Calculator/).
25
+ This documentation includes
26
+ [examples](https://taxcalc.pslmodels.org/usage/tcja_after_2025.html)
27
+ of how to analyze different ways of extending TCJA policy beyond 2025.
@@ -12,7 +12,7 @@ requirements:
12
12
  - "numpy>=1.26"
13
13
  - "pandas>=2.2"
14
14
  - "bokeh>=3.7"
15
- - "paramtools>=0.19.0"
15
+ - "paramtools>=0.20.0"
16
16
  - numba
17
17
  - curl
18
18
  - openpyxl
@@ -23,7 +23,7 @@ requirements:
23
23
  - "numpy>=1.26"
24
24
  - "pandas>=2.2"
25
25
  - "bokeh>=3.7"
26
- - "paramtools>=0.19.0"
26
+ - "paramtools>=0.20.0"
27
27
  - numba
28
28
  - curl
29
29
  - openpyxl
@@ -4,6 +4,24 @@ 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-05-16 Release 4.6.2
8
+ ------------------------
9
+ (last merged pull request is
10
+ [#2905](https://github.com/PSLmodels/Tax-Calculator/pull/2905))
11
+
12
+ **This is a bug-fix release.**
13
+
14
+ **API Changes**
15
+
16
+ **New Features**
17
+
18
+ **Bug Fixes**
19
+ - Work around multiple-indexing-change limitations in `parameters.py` code
20
+ [[#2904](https://github.com/PSLmodels/Tax-Calculator/pull/2904) by Martin Holmer]
21
+ - Require `paramtools` 0.20.0 that works with the current `marshmallow` 4.0.0
22
+ [[#2905](https://github.com/PSLmodels/Tax-Calculator/pull/2905) by Martin Holmer]
23
+
24
+
7
25
  2025-05-09 Release 4.6.1
8
26
  ------------------------
9
27
  (last merged pull request is
@@ -560,3 +560,7 @@ Execution time is 60.9 seconds
560
560
  discusses how much faster this is relative to executing ten separate
561
561
  `tc` runs, and also shows how to tabulate the ten-year aggregate
562
562
  reform result from the files generated by this run.
563
+
564
+ More examples of analyzing different versions of the TCJA after 2025
565
+ are available in this
566
+ [document](https://taxcalc.pslmodels.org/usage/tcja_after_2025.html).
@@ -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}`4.6.1 (2025-05-09) <about/releases>`
57
+ {doc}`4.6.2 (2025-05-16) <about/releases>`
58
58
 
59
59
  If you are already using Tax-Calculator, upgrade using the following command:
60
60
  ```
@@ -0,0 +1,333 @@
1
+ # TCJA after 2025
2
+
3
+ Many provisions of the TCJA are temporary and are scheduled to end
4
+ after 2025 under current-law policy. Tax policy parameters that are
5
+ associated with expiring provisions and that are not inflation indexed
6
+ will revert to their 2017 values in 2026. Tax policy parameters that
7
+ are associated with expiring provisions and that are inflation indexed
8
+ will revert to their 2017 values indexed to 2026 using a chained CPI-U
9
+ inflation factor. For a list of the ending TCJA provisions, see this
10
+ Congressional Research Service document: [Reference Table: Expiring
11
+ Provisions in the "Tax Cuts and Jobs Act" (TCJA, P.L. 115-97)](
12
+ https://crsreports.congress.gov/product/pdf/R/R47846), which is dated
13
+ November 21, 2023.
14
+
15
+ This document provides examples of using the PSLmodels Tax-Calculator
16
+ command-line-interface tool
17
+ [tc](https://taxcalc.pslmodels.org/guide/cli.html) with the newer
18
+ `tmd.csv` file generated in the PSLmodels
19
+ [tax-microdata](https://github.com/PSLmodels/tax-microdata-benchmarking)
20
+ repository. The `tmd` data and weights are based on the 2015 IRS/SOI
21
+ PUF data and on recent CPS data, and therefore, are the best data to
22
+ use with Tax-Calculator. All the examples assume you have the [three
23
+ `tmd` data
24
+ files](https://taxcalc.pslmodels.org/usage/data.html#irs-public-use-data-tmd-csv)
25
+ in the parent directory of your working directory. The `tmd` data
26
+ contain information on 225,256 tax filing units.
27
+
28
+ Before reading the rest of this document, be sure you understand how
29
+ to use the Tax-Calculator command-line tool
30
+ [tc](https://taxcalc.pslmodels.org/guide/cli.html), particularly the
31
+ `--baseline` and `--reform` command-line options. For complete and
32
+ up-to-date `tc` documentation, enter `tc --help` at the command
33
+ prompt. Omitting the `--baseline` option means the baseline policy is
34
+ current-law policy. Omitting the `--reform` option means the reform
35
+ policy is current-law policy. The `--tables` option produces two
36
+ tables in one file: the top table contains aggregate and income decile
37
+ estimates under the reform and the bottom table contains estimates of
38
+ reform-minus-baseline differences by income decile and in aggregate.
39
+
40
+ Nobody knows how the 2025 tax legislation will turn out, so the idea
41
+ of this document is to illustrate how to use the Tax-Calculator CLI
42
+ tool to analyze some of the TCJA revisions that are being reported in
43
+ the press in early May 2025. The basic legislative goal is to extend
44
+ TCJA beyond 2025, but there is discussion of a number of **revisions**
45
+ to the basic extension. The revisions being discussed include, but
46
+ are not limited to, raising the SALT deduction cap, making social
47
+ security benefits nontaxable, and liberalizing the child tax credit.
48
+ (Given the nature of the rules under which the legislation is being
49
+ developed, no changes in social security financing can be made, so
50
+ there is discussion of a higher elderly/disability standard deduction
51
+ amount to proxy the nontaxable social security benefits revision.)
52
+ These revisions all cause reductions in income tax revenue, so there
53
+ is also discussion about **enhancements** to the extended-TCJA policy
54
+ that would raise revenue to pay for revisions. The enhancement
55
+ considered here is the one that adds a new top income tax bracket with
56
+ a 39.6 percent marginal tax rate.
57
+
58
+ The analysis examples below focus on the following policy scenarios:
59
+
60
+ 1. a strict extension of TCJA without any revisions or enhancements
61
+ 2. a TCJA extension with the nontaxable social security benefits revision
62
+ 3. a TCJA extension with the higher elderly/disabled standard deduction revision
63
+ 4. a TCJA extension with the higher elderly/disabled standard deduction revision and the new top tax bracket enhancement
64
+
65
+ All the examples use Tax-Calculator 4.6.1 version.
66
+ ```
67
+ % tc --version
68
+ Tax-Calculator 4.6.1 on Python 3.12
69
+ ```
70
+
71
+ The examples below were done on an ancient Mac with an old Intel
72
+ processor with four CPU cores. The execution times on newer computers
73
+ should be substantially less than shown below. In all the examples,
74
+ each `tc` run is using just one CPU core.
75
+
76
+ The
77
+ [`ext.json`](https://github.com/PSLmodels/Tax-Calculator/blob/master/taxcalc/reforms/ext.json)
78
+ reform file is used all the examples. See the section at the end of
79
+ this document for more information on `ext.json` contents.
80
+
81
+
82
+ ## 1. TCJA extension without any revisions or enhancements
83
+
84
+ ```
85
+ % tc ../tmd.csv 2026 --numyears 10 --reform ext.json --exact --tables
86
+ Read input data for 2021; input data were extrapolated to 2026
87
+ Write tabular output to file tmd-26-#-ext-#-tables.text
88
+ Advance input data and policy to 2027
89
+ Write tabular output to file tmd-27-#-ext-#-tables.text
90
+ Advance input data and policy to 2028
91
+ Write tabular output to file tmd-28-#-ext-#-tables.text
92
+ Advance input data and policy to 2029
93
+ Write tabular output to file tmd-29-#-ext-#-tables.text
94
+ Advance input data and policy to 2030
95
+ Write tabular output to file tmd-30-#-ext-#-tables.text
96
+ Advance input data and policy to 2031
97
+ Write tabular output to file tmd-31-#-ext-#-tables.text
98
+ Advance input data and policy to 2032
99
+ Write tabular output to file tmd-32-#-ext-#-tables.text
100
+ Advance input data and policy to 2033
101
+ Write tabular output to file tmd-33-#-ext-#-tables.text
102
+ Advance input data and policy to 2034
103
+ Write tabular output to file tmd-34-#-ext-#-tables.text
104
+ Advance input data and policy to 2035
105
+ Write tabular output to file tmd-35-#-ext-#-tables.text
106
+ Execution time is 58.4 seconds
107
+ ```
108
+
109
+ Because the aggregate change in taxes is displayed on the last line of
110
+ the tables file (in column four), we can look at the ten changes like
111
+ this:
112
+
113
+ ```
114
+ % tail -1 tmd-??-#-ext-#-tables.text
115
+ ==> tmd-26-#-ext-#-tables.text <==
116
+ A 192.41 20828.3 -273.1 0.0 0.0 -273.1
117
+
118
+ ==> tmd-27-#-ext-#-tables.text <==
119
+ A 193.77 21613.4 -280.5 0.0 0.0 -280.5
120
+
121
+ ==> tmd-28-#-ext-#-tables.text <==
122
+ A 194.72 22404.7 -288.1 0.0 0.0 -288.1
123
+
124
+ ==> tmd-29-#-ext-#-tables.text <==
125
+ A 195.66 23243.3 -280.3 0.0 0.0 -280.3
126
+
127
+ ==> tmd-30-#-ext-#-tables.text <==
128
+ A 196.58 24115.1 -288.1 0.0 0.0 -288.1
129
+
130
+ ==> tmd-31-#-ext-#-tables.text <==
131
+ A 197.48 25020.0 -296.0 0.0 0.0 -296.0
132
+
133
+ ==> tmd-32-#-ext-#-tables.text <==
134
+ A 198.35 25952.7 -315.9 0.0 0.0 -315.9
135
+
136
+ ==> tmd-33-#-ext-#-tables.text <==
137
+ A 199.21 26905.4 -323.8 0.0 0.0 -323.8
138
+
139
+ ==> tmd-34-#-ext-#-tables.text <==
140
+ A 200.03 27878.9 -331.7 0.0 0.0 -331.7
141
+
142
+ ==> tmd-35-#-ext-#-tables.text <==
143
+ A 200.83 28883.0 -339.7 0.0 0.0 -339.7
144
+ ```
145
+
146
+ And the ten-year change in aggregate federal income tax liability can
147
+ be tabulated this way:
148
+
149
+ ```
150
+ % tail -1 tmd-??-#-ext-#-tables.text | awk '$1~/A/{n++;c+=$4}END{print n,c}'
151
+ 10 -3017.2
152
+ ```
153
+
154
+
155
+ ## 2. TCJA extension with the nontaxable social security benefits revision
156
+
157
+ There is some discussion of exempting all social security benefits
158
+ from federal income taxation. Here is a JSON file that implements
159
+ that reform:
160
+
161
+ ```
162
+ % cat no_ssben_tax.json
163
+ {
164
+ "SS_percentage1": {"2026": 0.0},
165
+ "SS_percentage2": {"2026": 0.0}
166
+ }
167
+ ```
168
+
169
+ The marginal effect of adding that reform on to the TCJA-extension can be
170
+ estimated in this 2026 run:
171
+
172
+ ```
173
+ % tc ../tmd.csv 2026 --baseline ext.json --reform ext.json+no_ssben_tax.json --exact --tables
174
+ Read input data for 2021; input data were extrapolated to 2026
175
+ Write tabular output to file tmd-26-ext-ext+no_ssben_tax-#-tables.text
176
+ Execution time is 33.4 seconds
177
+
178
+ % tail -1 tmd-26-ext-ext+no_ssben_tax-#-tables.text
179
+ A 192.41 20828.3 -110.6 0.0 0.0 -110.6
180
+ ```
181
+
182
+ So, this reform reduces federal income tax liability by $110.6 billion in
183
+ 2026.
184
+
185
+
186
+ ## 3. TCJA extension with the higher elderly/disabled standard deduction revision
187
+
188
+ Next we find a reform that approximates the `no_ssben_tax` reform
189
+ analyzed in the previous section. Trying higher values for the
190
+ `STD_Aged` parameter, we quickly find that $31,500 for all filing
191
+ statuses produces a reasonable approximation of the effects of the
192
+ `no_ssben_tax` reform.
193
+
194
+ ```
195
+ % cat higher_aged_std.json
196
+ {
197
+ "STD_Aged": {"2026": [31500, 31500, 31500, 31500, 31500]}
198
+ }
199
+
200
+ % tc ../tmd.csv 2026 --baseline ext.json --reform ext.json+higher_aged_std.json --exact --tables
201
+ Read input data for 2021; input data were extrapolated to 2026
202
+ Write tabular output to file tmd-26-ext-ext+higher_aged_std-#-tables.text
203
+ Execution time is 34.0 seconds
204
+
205
+ % diff tmd-26-ext-ext+higher_aged_std-#-tables.text tmd-26-ext-ext+no_ssben_tax-#-tables.text | tail -18
206
+ 22,29c22,29
207
+ < 3 19.24 629.1 -0.3 0.0 0.0 -0.3
208
+ < 4 19.24 876.9 -1.9 0.0 0.0 -1.9
209
+ < 5 19.24 1173.0 -6.8 0.0 0.0 -6.8
210
+ < 6 19.25 1581.6 -13.3 0.0 0.0 -13.3
211
+ < 7 19.24 2191.6 -25.6 0.0 0.0 -25.6
212
+ < 8 19.24 3238.1 -33.2 0.0 0.0 -33.2
213
+ < 9 19.24 10787.1 -29.5 0.0 0.0 -29.5
214
+ < A 192.41 20828.3 -110.9 0.0 0.0 -110.9
215
+ ---
216
+ > 3 19.24 629.1 -0.1 0.0 0.0 -0.1
217
+ > 4 19.24 876.9 -1.0 0.0 0.0 -1.0
218
+ > 5 19.24 1173.0 -4.8 0.0 0.0 -4.8
219
+ > 6 19.25 1581.6 -11.8 0.0 0.0 -11.8
220
+ > 7 19.24 2191.6 -21.3 0.0 0.0 -21.3
221
+ > 8 19.24 3238.1 -29.9 0.0 0.0 -29.9
222
+ > 9 19.24 10787.1 -41.5 0.0 0.0 -41.5
223
+ > A 192.41 20828.3 -110.6 0.0 0.0 -110.6
224
+ ```
225
+
226
+
227
+ ## 4. TCJA extension with the higher elderly/disabled standard deduction revision and the new top tax bracket enhancement
228
+
229
+ In this last example, we look at how much of the extra cost of the
230
+ `higher_aged_std` reform can be paid for by adding a new top income
231
+ tax bracket to the TCJA-extension reform.
232
+
233
+ ```
234
+ (taxcalc-dev) Tax-Calculator% cat new_top_bracket.json
235
+ {
236
+ "II_brk7": {"2026": [2.5e6, 5.0e6, 2.5e6, 4.2e6, 5.0e6]},
237
+ "II_rt8": {"2026": 0.396},
238
+ "PT_brk7": {"2026": [2.5e6, 5.0e6, 2.5e6, 4.2e6, 5.0e6]},
239
+ "PT_rt8": {"2026": 0.396}
240
+ }
241
+
242
+ % tc ../tmd.csv 2026 --baseline ext.json+higher_aged_std.json --reform ext.json+higher_aged_std.json+new_top_bracket.json --exact --tables --graphs
243
+ Read input data for 2021; input data were extrapolated to 2026
244
+ Write tabular output to file tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
245
+ Write graphical output to file tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-pch.html
246
+ Write graphical output to file tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-atr.html
247
+ Write graphical output to file tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-mtr.html
248
+ Execution time is 40.9 seconds
249
+
250
+ tail -14 tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
251
+ Weighted Tax Differences by Baseline Expanded-Income Decile
252
+ Returns ExpInc IncTax PayTax LSTax AllTax
253
+ (#m) ($b) ($b) ($b) ($b) ($b)
254
+ 0 19.24 -274.9 0.1 0.0 0.0 0.1
255
+ 1 19.24 210.9 0.0 0.0 0.0 0.0
256
+ 2 19.24 414.9 0.0 0.0 0.0 0.0
257
+ 3 19.24 629.1 0.0 0.0 0.0 0.0
258
+ 4 19.24 876.9 0.0 0.0 0.0 0.0
259
+ 5 19.24 1173.0 0.0 0.0 0.0 0.0
260
+ 6 19.25 1581.6 0.0 0.0 0.0 0.0
261
+ 7 19.24 2191.6 0.0 0.0 0.0 0.0
262
+ 8 19.24 3238.1 0.0 0.0 0.0 0.0
263
+ 9 19.24 10787.1 15.8 0.0 0.0 15.8
264
+ A 192.41 20828.3 15.8 0.0 0.0 15.8
265
+ ```
266
+
267
+ So, the new top bracket (with a 39.6% marginal tax rate) raises
268
+ aggregate federal income tax liability by enough to pay for the TCJA
269
+ revision that approximates making social security benefits tax-free
270
+ and produces an additional $15.8 billion (in 2026) that could be used
271
+ to pay for other revisions.
272
+
273
+ While those with the highest incomes do pay more tax, the reduction in
274
+ their after-tax expanded income is quite small as can be seen in one
275
+ of the standard graphs:
276
+ `tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-pch.html`.
277
+ This graph shows that the top one percent of the income distribution
278
+ experiences a decline in after-tax income of about 0.36 percent (or
279
+ less than four dollars per thousand dollars).
280
+
281
+ Here are the ten-year results for this run:
282
+
283
+ ```
284
+ % tc ../tmd.csv 2026 --numyears 10 --baseline ext.json+higher_aged_std.json --reform ext.json+higher_aged_std.json+new_top_bracket.json --exact --tables
285
+ Read input data for 2021; input data were extrapolated to 2026
286
+ Write tabular output to file tmd-26-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
287
+ Advance input data and policy to 2027
288
+ Write tabular output to file tmd-27-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
289
+ Advance input data and policy to 2028
290
+ Write tabular output to file tmd-28-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
291
+ Advance input data and policy to 2029
292
+ Write tabular output to file tmd-29-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
293
+ Advance input data and policy to 2030
294
+ Write tabular output to file tmd-30-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
295
+ Advance input data and policy to 2031
296
+ Write tabular output to file tmd-31-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
297
+ Advance input data and policy to 2032
298
+ Write tabular output to file tmd-32-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
299
+ Advance input data and policy to 2033
300
+ Write tabular output to file tmd-33-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
301
+ Advance input data and policy to 2034
302
+ Write tabular output to file tmd-34-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
303
+ Advance input data and policy to 2035
304
+ Write tabular output to file tmd-35-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text
305
+ Execution time is 58.2 seconds
306
+
307
+ % tail -1 tmd-??-ext+higher_aged_std-ext+higher_aged_std+new_top_bracket-#-tables.text | awk '$1~/A/{n++;c+=$4}END{print n,c}'
308
+ 10 187.9
309
+ ```
310
+
311
+ So, there is nearly $188 billion left to pay for other revisions to
312
+ the basic TCJA extension.
313
+
314
+
315
+ ## How is the `ext.json` file generated?
316
+
317
+ The short answer is by using the
318
+ [`extend_tcja.py`](https://github.com/PSLmodels/Tax-Calculator/blob/master/extend_tcja.py) script.
319
+
320
+ Reading the `extend_tcja.py` script will provide details on how the
321
+ values in the `ext.json` file are generated.
322
+
323
+ It is important to bear in mind that the `extend_tcja.py` script will
324
+ generate a different `ext.json` file whenever the CBO economic
325
+ projection (incorporated in the Tax-Calculator `growfactors.csv` file)
326
+ changes or whenever new historical values of policy parameters are
327
+ added to the `policy_current_law.json` file thereby changing the
328
+ `Policy.LAST_KNOWN_YEAR`.
329
+
330
+ Beginning with the 4.5.0 version, Tax-Calculator incorporates the
331
+ January 2025 CBO economic projection and contains historical tax
332
+ policy parameter values through 2025.
333
+
@@ -19,5 +19,4 @@ dependencies:
19
19
  - pip
20
20
  - pip:
21
21
  - jupyter-book
22
- - "marshmallow>=3.22, <4.0" # TODO: drop this after ParamTools is fixed
23
- - "paramtools>=0.19.0" # TODO: bump version after ParamTools is fixed
22
+ - "paramtools>=0.20.0"
@@ -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 = "4.6.1"
10
+ VERSION = "4.6.2"
11
11
 
12
12
  config = {
13
13
  "description": "Tax-Calculator",
@@ -25,7 +25,7 @@ config = {
25
25
  "pandas>=2.2",
26
26
  "bokeh>=2.4",
27
27
  "numba",
28
- "paramtools>=0.19.0",
28
+ "paramtools>=0.20.0",
29
29
  ],
30
30
  "classifiers": [
31
31
  "Development Status :: 4 - Beta",
@@ -14,6 +14,6 @@ from taxcalc.taxcalcio import *
14
14
  from taxcalc.utils import *
15
15
  from taxcalc.cli import *
16
16
 
17
- __version__ = '4.6.1'
17
+ __version__ = '4.6.2'
18
18
  __min_python3_version__ = 10
19
19
  __max_python3_version__ = 12
@@ -3190,7 +3190,7 @@ def NonrefundableCredits(c05800, e07240, e07260, e07300, e07400,
3190
3190
  @iterate_jit(nopython=True)
3191
3191
  def AdditionalCTC(codtc_limited, ACTC_c, n24, earned, ACTC_Income_thd,
3192
3192
  ACTC_rt, nu06, ACTC_rt_bonus_under6family, ACTC_ChildNum,
3193
- CTC_is_refundable, CTC_include17,
3193
+ CTC_is_refundable, CTC_include17, CTC_c,
3194
3194
  age_head, age_spouse, MARS, nu18,
3195
3195
  ptax_was, c03260, e09800, c59660, e11200,
3196
3196
  c11070):
@@ -3251,7 +3251,7 @@ def AdditionalCTC(codtc_limited, ACTC_c, n24, earned, ACTC_Income_thd,
3251
3251
  childnum = n24 + max(0, nu18 - tu18 - su18 - n24)
3252
3252
  else:
3253
3253
  childnum = n24
3254
- line4 = ACTC_c * childnum
3254
+ line4 = min(ACTC_c, CTC_c) * childnum
3255
3255
  c11070 = 0. # line15
3256
3256
  if line3 > 0. and line4 > 0.:
3257
3257
  line5 = min(line3, line4)
@@ -21819,7 +21819,7 @@
21819
21819
  "validators": {
21820
21820
  "range": {
21821
21821
  "min": 0,
21822
- "max": "CTC_c"
21822
+ "max": 9e+99
21823
21823
  }
21824
21824
  },
21825
21825
  "compatible_data": {
@@ -34,8 +34,6 @@
34
34
  "CTC_c": {"2026": 2000.00},
35
35
  "ACTC_c": {"2026": 1776.67},
36
36
  "ACTC_c-indexed": {"2026": true},
37
- "ACTC_c": {"2032": 2000.00},
38
- "ACTC_c-indexed": {"2032": false},
39
37
  "ODC_c": {"2026": 500.00},
40
38
  "CTC_ps": {"2026": [200000.0, 400000.0, 200000.0, 200000.0, 400000.0]},
41
39
  "ACTC_Income_thd": {"2026": 2500.00},
@@ -18,7 +18,7 @@ from taxcalc.consumption import Consumption
18
18
  from taxcalc.growdiff import GrowDiff
19
19
  from taxcalc.growfactors import GrowFactors
20
20
  from taxcalc.calculator import Calculator
21
- from taxcalc.utils import (delete_file, write_graph_file,
21
+ from taxcalc.utils import (json_to_dict, delete_file, write_graph_file,
22
22
  add_quantile_table_row_variable,
23
23
  unweighted_sum, weighted_sum)
24
24
 
@@ -133,7 +133,17 @@ class TaxCalcIO():
133
133
  msg = f'{fname} does not end in .json'
134
134
  self.errmsg += f'ERROR: BASELINE file name {msg}\n'
135
135
  # check existence of BASELINE file
136
- if not os.path.isfile(bas):
136
+ if os.path.isfile(bas):
137
+ # check validity of JSON text
138
+ with open(bas, 'r', encoding='utf-8') as jfile:
139
+ json_text = jfile.read()
140
+ try:
141
+ _ = json_to_dict(json_text)
142
+ except ValueError as valerr: # pragma: no cover
143
+ msg = f'{bas} contains invalid JSON'
144
+ self.errmsg += f'ERROR: BASELINE file {msg}\n'
145
+ self.errmsg += f'{valerr}'
146
+ else:
137
147
  msg = f'{bas} could not be found'
138
148
  self.errmsg += f'ERROR: BASELINE file {msg}\n'
139
149
  # add fname to list of basnames used in output file names
@@ -167,7 +177,17 @@ class TaxCalcIO():
167
177
  msg = f'{fname} does not end in .json'
168
178
  self.errmsg += f'ERROR: REFORM file name {msg}\n'
169
179
  # check existence of REFORM file
170
- if not os.path.isfile(rfm):
180
+ if os.path.isfile(rfm):
181
+ # check validity of JSON text
182
+ with open(rfm, 'r', encoding='utf-8') as jfile:
183
+ json_text = jfile.read()
184
+ try:
185
+ _ = json_to_dict(json_text)
186
+ except ValueError as valerr: # pragma: no cover
187
+ msg = f'{rfm} contains invalid JSON'
188
+ self.errmsg += f'ERROR: REFORM file {msg}\n'
189
+ self.errmsg += f'{valerr}'
190
+ else:
171
191
  msg = f'{rfm} could not be found'
172
192
  self.errmsg += f'ERROR: REFORM file {msg}\n'
173
193
  # add fname to list of refnames used in output file names
@@ -68,7 +68,6 @@ def test_for_consistency(tests_path):
68
68
  'coverage',
69
69
  "pip",
70
70
  "jupyter-book",
71
- "marshmallow>=3.22, <4.0", # TODO: drop this after ParamTools is fixed
72
71
  "setuptools"
73
72
  ])
74
73
  # read conda.recipe/meta.yaml requirements
@@ -811,19 +811,6 @@ def test_get_index_rate():
811
811
  assert pol.wage_growth_rates() == pol._wage_growth_rates
812
812
 
813
813
 
814
- def test_reform_with_bad_ctc_levels():
815
- """
816
- Implement a reform with _ACTC > _CTC_c values.
817
- """
818
- pol = Policy()
819
- child_credit_reform = {
820
- 'CTC_c': {2020: 2200},
821
- 'ACTC_c': {2020: 2500}
822
- }
823
- with pytest.raises(pt.ValidationError):
824
- pol.implement_reform(child_credit_reform)
825
-
826
-
827
814
  def test_reform_with_removed_parameter(monkeypatch):
828
815
  """
829
816
  Try to use removed parameter in a reform.
@@ -386,4 +386,4 @@ def test_ext_reform(tests_path):
386
386
  iitax_ext = calc_ext.array('iitax')
387
387
  rdiff = iitax_ext - iitax_end
388
388
  weighted_sum_rdiff = (rdiff * calc_end.array('s006')).sum() * 1.0e-9
389
- assert np.allclose([weighted_sum_rdiff], [-205.769], rtol=0.0, atol=0.01)
389
+ assert np.allclose([weighted_sum_rdiff], [-214.393], rtol=0.0, atol=0.01)
@@ -153,6 +153,24 @@ def fixture_errorreformfile():
153
153
  pass # sometimes we can't remove a generated temporary file
154
154
 
155
155
 
156
+ @pytest.fixture(scope='session', name='ereformfile')
157
+ def fixture_ereformfile():
158
+ """
159
+ Temporary reform file with .json extension.
160
+ """
161
+ contents = '{"II_em": {"2022": 1000},}'
162
+ with tempfile.NamedTemporaryFile(
163
+ suffix='.json', mode='a', delete=False
164
+ ) as rfile:
165
+ rfile.write(contents)
166
+ yield rfile
167
+ if os.path.isfile(rfile.name):
168
+ try:
169
+ os.remove(rfile.name)
170
+ except OSError:
171
+ pass # sometimes we can't remove a generated temporary file
172
+
173
+
156
174
  @pytest.fixture(scope='session', name='errorassumpfile')
157
175
  def fixture_errorassumpfile():
158
176
  """
@@ -249,6 +267,7 @@ def fixture_assumpfile2():
249
267
  'no-dot-json-filename'),
250
268
  ([], [], [], [],),
251
269
  ('no-exist.csv', 'no-exist.json', 'no-exist.json', 'no-exist.json'),
270
+ ('cps.csv', 'ereformfile', 'ereformfile', 'no-exist.json'),
252
271
  ])
253
272
  def test_ctor_errors(input_data, baseline, reform, assump):
254
273
  """