owlplanner 2026.1.26__tar.gz → 2026.2.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 (198) hide show
  1. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/INSTALL.md +1 -1
  2. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/PARAMETERS.md +8 -2
  3. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/PKG-INFO +2 -2
  4. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/README.md +1 -1
  5. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/RELEASE_NOTES.md +80 -50
  6. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/USER_GUIDE.md +1 -1
  7. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/README.md +1 -1
  8. owlplanner-2026.2.2/examples/Case_alex+jamie.toml +64 -0
  9. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_drawdowncalc-comparison-1.toml +1 -1
  10. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_jack+jill.toml +2 -2
  11. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_joe.toml +3 -1
  12. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_john+sally.toml +2 -2
  13. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_jon+jane.toml +2 -2
  14. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_kim+sam-bequest.toml +2 -2
  15. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/Case_kim+sam-spending.toml +2 -2
  16. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/owl.pdf +0 -0
  17. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/owl.tex +282 -211
  18. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/config.py +17 -3
  19. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plan.py +188 -84
  20. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/rates.py +377 -366
  21. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/tax2026.py +11 -9
  22. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/version.py +1 -1
  23. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_historical.py +19 -1
  24. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_mc.py +0 -1
  25. owlplanner-2026.2.2/tests/test_medicare.py +92 -0
  26. owlplanner-2026.2.2/tests/test_rates_reverse_roll.py +275 -0
  27. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_repro.py +3 -3
  28. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_summary.py +36 -36
  29. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_toml_cases.py +2 -4
  30. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/About_Owl.py +1 -1
  31. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Asset_Allocation.py +1 -1
  32. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Create_Case.py +14 -14
  33. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Documentation.py +45 -24
  34. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Fixed_Income.py +18 -14
  35. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Graphs.py +1 -1
  36. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Historical_Range.py +15 -0
  37. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Household_Financial_Profile.py +10 -8
  38. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Logs.py +2 -2
  39. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Monte_Carlo.py +1 -1
  40. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Optimization_Parameters.py +3 -3
  41. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Output_Files.py +1 -1
  42. owlplanner-2026.2.2/ui/Quick_Start.py +171 -0
  43. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Rates_Selection.py +339 -313
  44. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Savings_Assets.py +2 -2
  45. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/case_progress.py +1 -1
  46. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/main.py +1 -1
  47. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/owlbridge.py +48 -6
  48. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/sskeys.py +7 -5
  49. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/tomlexamples.py +1 -2
  50. owlplanner-2026.1.26/case_test.toml +0 -69
  51. owlplanner-2026.1.26/convert_rates.py +0 -58
  52. owlplanner-2026.1.26/iteration_data.csv +0 -32
  53. owlplanner-2026.1.26/iteration_data_2.csv +0 -57
  54. owlplanner-2026.1.26/myrates.csv +0 -3
  55. owlplanner-2026.1.26/myrates.xlsx +0 -0
  56. owlplanner-2026.1.26/src/owlplanner/In Discussion #58, the case of Kim and Sam.md +0 -307
  57. owlplanner-2026.1.26/ui/Quick_Start.py +0 -107
  58. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.devcontainer/devcontainer.json +0 -0
  59. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.flake8 +0 -0
  60. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.gitattributes +0 -0
  61. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.github/workflows/github-actions-runtests.yml +0 -0
  62. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.gitignore +0 -0
  63. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.streamlit/config.toml +0 -0
  64. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/.streamlit/fullconfig.toml +0 -0
  65. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/AUTHORS +0 -0
  66. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/Adamodar_Rates_2026.xlsx +0 -0
  67. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/LICENSE +0 -0
  68. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/awi.txt +0 -0
  69. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/Dockerfile.bare +0 -0
  70. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/Dockerfile.static +0 -0
  71. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildContainers.cmd +0 -0
  72. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildContainers.sh +0 -0
  73. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildPackage.cmd +0 -0
  74. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildPackage.sh +0 -0
  75. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/buildentrypoint.sh +0 -0
  76. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/docker-compose.yml +0 -0
  77. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docker/runentrypoint.sh +0 -0
  78. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/examples/example-1.html +0 -0
  79. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/index.html +0 -0
  80. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/install-uv.html +0 -0
  81. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/installation.html +0 -0
  82. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/papers +0 -0
  83. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/search.json +0 -0
  84. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-45a48b56c8ad2523a9a31c69be39928e.min.css +0 -0
  85. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.css +0 -0
  86. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap-icons.woff +0 -0
  87. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/bootstrap/bootstrap.min.js +0 -0
  88. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/clipboard/clipboard.min.js +0 -0
  89. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/anchor.min.js +0 -0
  90. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/axe/axe-check.js +0 -0
  91. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/popper.min.js +0 -0
  92. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -0
  93. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/quarto.js +0 -0
  94. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tabsets/tabsets.js +0 -0
  95. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.css +0 -0
  96. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-html/tippy.umd.min.js +0 -0
  97. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/headroom.min.js +0 -0
  98. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-nav/quarto-nav.js +0 -0
  99. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/autocomplete.umd.js +0 -0
  100. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/fuse.min.js +0 -0
  101. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/site_libs/quarto-search/quarto-search.js +0 -0
  102. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/docs/users_guide.html +0 -0
  103. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jack+jill.xlsx +0 -0
  104. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jack+jill_house.xlsx +0 -0
  105. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_joe.xlsx +0 -0
  106. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_john+sally.xlsx +0 -0
  107. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_jon+jane.xlsx +0 -0
  108. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_kim+sam.xlsx +0 -0
  109. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/examples/HFP_template.xlsx +0 -0
  110. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/john+sally.ipynb +0 -0
  111. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/kim+sam.ipynb +0 -0
  112. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/template.ipynb +0 -0
  113. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_1.ipynb +0 -0
  114. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_2.ipynb +0 -0
  115. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/notebooks/tutorial_3.ipynb +0 -0
  116. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/owlplanner.cmd +0 -0
  117. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/owlplanner.sh +0 -0
  118. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxDef.png +0 -0
  119. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxFree.png +0 -0
  120. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/AD-taxable.png +0 -0
  121. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/Hist_Bequest.png +0 -0
  122. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/Hist_Spending.png +0 -0
  123. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/MC-tutorial2a.png +0 -0
  124. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/MC-tutorial2b.png +0 -0
  125. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/OwlUI.png +0 -0
  126. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/allocations.png +0 -0
  127. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/owl.png +0 -0
  128. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/piecewiseConstant.png +0 -0
  129. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/profile.png +0 -0
  130. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/ratesCorrelations.png +0 -0
  131. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/ratesPlot.png +0 -0
  132. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/savingsPlot.png +0 -0
  133. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/sourcesPlot.png +0 -0
  134. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/spendingPlot.png +0 -0
  135. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/taxIncomePlot.png +0 -0
  136. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/papers/images/taxesPlot.png +0 -0
  137. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/pyproject.toml +0 -0
  138. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/pytest.ini +0 -0
  139. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/requirements.txt +0 -0
  140. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/.gitignore +0 -0
  141. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/README.md +0 -0
  142. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/_quarto.yml +0 -0
  143. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/assets/owl.png +0 -0
  144. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/examples/example-1.qmd +0 -0
  145. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/examples/workbook_jack & jill - tutorial.xlsx +0 -0
  146. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/index.qmd +0 -0
  147. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/install-uv.qmd +0 -0
  148. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/installation.qmd +0 -0
  149. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/site-src/users_guide.qmd +0 -0
  150. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/__init__.py +0 -0
  151. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/abcapi.py +0 -0
  152. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/README.md +0 -0
  153. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/_main.py +0 -0
  154. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cli_logging.py +0 -0
  155. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cmd_list.py +0 -0
  156. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/cli/cmd_run.py +0 -0
  157. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/__init__.py +0 -0
  158. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/awi.csv +0 -0
  159. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/bendpoints.csv +0 -0
  160. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/newawi.csv +0 -0
  161. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/data/rates.csv +0 -0
  162. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/debts.py +0 -0
  163. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/fixedassets.py +0 -0
  164. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/mylogging.py +0 -0
  165. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/__init__.py +0 -0
  166. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/base.py +0 -0
  167. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/factory.py +0 -0
  168. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/matplotlib_backend.py +0 -0
  169. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/plotting/plotly_backend.py +0 -0
  170. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/progress.py +0 -0
  171. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/socialsecurity.py +0 -0
  172. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/timelists.py +0 -0
  173. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/src/owlplanner/utils.py +0 -0
  174. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_abcapi_coverage.py +0 -0
  175. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_config_coverage.py +0 -0
  176. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_debts.py +0 -0
  177. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_fixedassets.py +0 -0
  178. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_logger.py +0 -0
  179. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ltcg.py +0 -0
  180. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_mylogging_coverage.py +0 -0
  181. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_plan_edge_cases.py +0 -0
  182. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_rates.py +0 -0
  183. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_regressions.py +0 -0
  184. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_socsec.py +0 -0
  185. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_timelists.py +0 -0
  186. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_timelists_coverage.py +0 -0
  187. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_asset_allocation.py +0 -0
  188. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_compare_summaries.py +0 -0
  189. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_ui_sskeys.py +0 -0
  190. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_units.py +0 -0
  191. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/tests/test_utils_coverage.py +0 -0
  192. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Parameters_Reference.py +0 -0
  193. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/README.md +0 -0
  194. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Settings.py +0 -0
  195. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/Worksheets.py +0 -0
  196. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/__init__.py +0 -0
  197. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/owl.png +0 -0
  198. {owlplanner-2026.1.26 → owlplanner-2026.2.2}/ui/progress.py +0 -0
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## A retirement exploration tool based on linear programming
4
4
 
5
- <img align=right src="https://github.com/mdlacasse/Owl/blob/main/docs/images/owl.png?raw=true" width="250">
5
+ <img align=right src="https://github.com/mdlacasse/Owl/blob/main/papers/images/owl.png?raw=true" width="250">
6
6
 
7
7
  ------------------------------------------------------------------------------------
8
8
  ### About
@@ -107,7 +107,13 @@ Investment return rates and inflation assumptions.
107
107
  | `from` | integer | Starting year for historical data range (must be between 1928 and 2025) |
108
108
  | `to` | integer | Ending year for historical data range (must be between 1928 and 2025, and greater than `from`) |
109
109
 
110
- **Note:** `from`/`to` are stored for all methods in saved case files. Methods that do not use them ignore these fields.
110
+ #### For `method = "historical"`, `"histochastic"`, or `"stochastic"` (varying rates only):
111
+ | Parameter | Type | Description |
112
+ |-----------|------|-------------|
113
+ | `reverse_sequence` | boolean | If true, reverse the rate sequence along the time axis (e.g. last year first). Default is `false`. Ignored for fixed/constant rate methods. Used for both single-scenario and Historical Range runs. |
114
+ | `roll_sequence` | integer | Number of years to roll (shift) the rate sequence; positive shifts toward the end, values wrap. Default is `0`. Ignored for fixed/constant rate methods. Used for both single-scenario and Historical Range runs. |
115
+
116
+ **Note:** `from`/`to` are stored for all methods in saved case files. Methods that do not use them ignore these fields. When running Historical Range, each year in the range uses the historical rate sequence starting at that year, with `reverse_sequence` and `roll_sequence` applied to each sequence.
111
117
 
112
118
  ---
113
119
 
@@ -172,8 +178,8 @@ Options controlling the optimization solver and constraints.
172
178
  | `amoRoth` | boolean | *(Advanced)* Whether to enforce at-most-one (AMO) constraints preventing simultaneous Roth conversions and tax-free withdrawals. | `true` |
173
179
  | `amoSurplus` | boolean | *(Advanced)* Whether to enforce XOR constraints preventing simultaneous surplus deposits and withdrawals from taxable or tax-free accounts. | `true` |
174
180
  | `bequest` | float | Target bequest value in today's dollars (in `units`). Used when `objective = "maxSpending"`. | `1` (if omitted with `maxSpending`) |
175
- | `bigMirmaa` | float | *(Advanced)* Big-M value for Medicare IRMAA bracket constraints (used when `withMedicare = "optimize"`). Should exceed any plausible aggregate MAGI. | `5e7` |
176
181
  | `bigMamo` | float | *(Advanced)* Big-M value for at-mot-one (AMO) constraints (mutually exclusive operations). Should exceed any individual withdrawal, conversion, or surplus deposit. | `5e7` |
182
+ | `epsilon` | float | *(Advanced)* Lexicographic weight added to the objective to break ties. Adds a small penalty to Roth conversions, and when `N_i = 2`, also penalizes withdrawals of spouse 2 to favor withdrawals from spouse 1. Use a very small value so the primary objective dominates. | `0` |
177
183
  | `gap` | float | *(Advanced)* Relative MILP gap used by solvers and to scale convergence tolerances. | `1e-4` (default); if `withMedicare = "optimize"` and unset, set to `1e-3` (or `1e-2` when `maxRothConversion <= 15`) |
178
184
  | `maxIter` | integer | *(Advanced)* Maximum number of iterations for the self-consistent loop. Must be at least 1. | `29` |
179
185
  | `maxRothConversion` | float or string | Maximum annual Roth conversion amount (in `units`). Use `"file"` to take per-year limits from time lists; omit for no cap (except last year). | No cap unless provided |
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2026.1.26
3
+ Version: 2026.2.2
4
4
  Summary: Owl - Optimal Wealth Lab: Retirement planner with great wisdom
5
5
  Project-URL: HomePage, https://github.com/mdlacasse/owl
6
6
  Project-URL: Repository, https://github.com/mdlacasse/owl
@@ -797,7 +797,7 @@ your computer and can be used to reproduce a case at a later time.
797
797
 
798
798
  ---------------------------------------------------------------------
799
799
 
800
- Copyright &copy; 2024 - Martin-D. Lacasse
800
+ Copyright &copy; 2024-2026 - Martin-D. Lacasse
801
801
 
802
802
  Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
803
803
 
@@ -85,7 +85,7 @@ your computer and can be used to reproduce a case at a later time.
85
85
 
86
86
  ---------------------------------------------------------------------
87
87
 
88
- Copyright &copy; 2024 - Martin-D. Lacasse
88
+ Copyright &copy; 2024-2026 - Martin-D. Lacasse
89
89
 
90
90
  Disclaimers: This code is for educatonal purposes only and does not constitute financial advice.
91
91
 
@@ -1,13 +1,50 @@
1
- ### Version 2026.01.26
2
- - Updated Jupyter notebooks
3
- - Improved logging
1
+ # Owl Release Notes
4
2
 
5
- ### Version 2026.01.21
6
- - Move "optimize" Medicare option to advanced section
7
- - Add solver option to disable surpluses in late years
8
- - Rename XOR -> AMO as correct term
3
+ ---
9
4
 
10
- ### Version 2026.01.20
5
+ ## Version 2026.02.02
6
+
7
+ ### Rates
8
+ - **Rate sequence modifiers** (issue #77): Add reverse and roll options for varying rate methods.
9
+ - New `reverse_sequence` (boolean) and `roll_sequence` (integer) in `setRates`, config, and TOML.
10
+ - UI: Reverse toggle and Roll (years) in Rates Selection → Advanced Options.
11
+ - Historical Range: same reverse/roll options in Advanced Options; `runHistoricalRange` accepts `reverse` and `roll` and applies them to each year’s historical sequence.
12
+ - Ignored for fixed/constant rate methods (with warning). Documented in PARAMETERS.md and Documentation.
13
+
14
+ ### Landing page and Quick Start
15
+ - Update landing page (layout, link to repo, instructions for beginners).
16
+ - Add short description of what optimization is performed.
17
+ - Fix Quick Start line length (flake8).
18
+
19
+ ### UI and examples
20
+ - Highlight current year in timelist and in worksheets (this year’s accounts).
21
+ - Fix case status incorrectly set to modified when visiting Create Case page (getDate/sskeys).
22
+ - Fix Joe’s example missing `withMedicare` option.
23
+ - Fix Social Security URL on Fixed Income page.
24
+
25
+ ### Documentation and parameters
26
+ - Sync Documentation.py with UI: TOC (Parameters Reference, Quick Start icon), Create Case labels, Output Files button names, Roth conversion toggle wording, Resources link, case file naming.
27
+ - Update owl.tex description.
28
+ - Document lexicographic weight and self-consistent loop default tolerance in docs.
29
+ - PARAMETERS.md: document `reverse_sequence` and `roll_sequence`.
30
+
31
+ ---
32
+
33
+ ## Version 2026.01.28
34
+ - Recoded Medicare optimization algorithm for SOS1 formulation.
35
+ - Updated documents and parameters.
36
+ - Added lexicographic weight epsilon in solver options.
37
+
38
+ ## Version 2026.01.26
39
+ - Updated Jupyter notebooks.
40
+ - Improved logging.
41
+
42
+ ## Version 2026.01.21
43
+ - Move "optimize" Medicare option to advanced section.
44
+ - Add solver option to disable surpluses in late years.
45
+ - Rename XOR → AMO as correct term.
46
+
47
+ ## Version 2026.01.20
11
48
  - Fix negative taxable gains in years of negative returns
12
49
  - Fix limits in UI not allowing negative rates
13
50
  - Add more control hooks on solver (xor, maxIter)
@@ -17,37 +54,30 @@
17
54
  - Enable Python 3.14 in GH CI
18
55
  - Investigate tests on GH failing due to different linear solver
19
56
  - Disallow conversions and surplus in last 2 years
20
- - Connect MOSEK logger with verbose keyword
57
+ - Connect MOSEK logger with verbose keyword.
21
58
 
22
- ### Version 2026.01.17
59
+ ## Version 2026.01.17
23
60
  - Add more parameters to control solver
24
61
  - Add capability to specify years from last in fixed assets
25
62
  - Document negative/zero fixed-asset disposition years and update UI tooltip
26
63
  - Add tests for negative/zero fixed-asset disposition years
27
- - Improved default values for broader case applicability
28
-
29
- ### Version 2026.01.15
30
- - Fix LTCG tax computation (self-consistent stacking accuracy)
31
- - Add non-taxable portion of SS to MAGI
32
- - Fix cash flow to include all fixed-asset proceeds
33
- - Apply max Roth conversion cap across both spouses
34
- - Clarify SS tax fraction vs LTCG effective rate
35
-
36
- ### Version 2026.01.16
37
- - Extend longevity table to 120yo and add safety checks
38
- - Add 15% of untaxed SS back to MAGI
39
- - Update documentation (TeX)
40
- - Adjust reproducibility tests
41
-
42
- ### Version 2026.01.15
43
- - Fix LTCG tax computation (self-consistent stacking accuracy)
44
- - Add non-taxable portion of SS to MAGI
45
- - Fix cash flow to include all fixed-asset proceeds
46
- - Apply max Roth conversion cap across both spouses
47
- - Clarify SS tax fraction vs LTCG effective rate
48
- - Align documentation and reproducibility baselines with code
49
-
50
- ### Version 2026.01.12
64
+ - Improved default values for broader case applicability.
65
+
66
+ ## Version 2026.01.16
67
+ - Extend longevity table to 120 and add safety checks.
68
+ - Add 15% of untaxed SS back to MAGI.
69
+ - Update documentation (TeX).
70
+ - Adjust reproducibility tests.
71
+
72
+ ## Version 2026.01.15
73
+ - Fix LTCG tax computation (self-consistent stacking accuracy).
74
+ - Add non-taxable portion of SS to MAGI.
75
+ - Fix cash flow to include all fixed-asset proceeds.
76
+ - Apply max Roth conversion cap across both spouses.
77
+ - Clarify SS tax fraction vs LTCG effective rate.
78
+ - Align documentation and reproducibility baselines with code.
79
+
80
+ ## Version 2026.01.12
51
81
  - Merge binary exclusion constraints for both spouses (one set per year instead of per individual)
52
82
  - Update paper to reflect binary variables $z_{nz}$ shared across both spouses
53
83
  - Reduce binary variable count from $4N_iN_n$ to $4N_n$ for married couples
@@ -56,9 +86,9 @@
56
86
  - Add 15-minute time limit for solution
57
87
  - Fix rare UI condition when starting Upload Case and hopping to Logs
58
88
  - Change convergence criteria to only consider objective function (not solution vector)
59
- - Split bigM between XOR exclusion constraints and IRMAA Medicare conditions
89
+ - Split bigM between XOR exclusion constraints and IRMAA Medicare conditions.
60
90
 
61
- ### Version 2026.01.08
91
+ ## Version 2026.01.08
62
92
  - Fix dividends being taxed twice on taxable account withdrawals
63
93
  - Remove int32 normalization of seed (reverted from 2026.01.07)
64
94
  - Remove unused file-based rates parameters (rateFile, rateSheetName, workbook_file, worksheet_name)
@@ -69,16 +99,16 @@
69
99
  - Update paper PDF to reflect change in dividend tax calculation
70
100
  - Replace duplicate owl.tex and images with symlinks to avoid duplication
71
101
  - Refactor code in config.py, debts.py, fixedassets.py, and utils.py
72
- - Add tests to increase coverage and harden code
102
+ - Add tests to increase coverage and harden code.
73
103
 
74
- ### Version 2026.01.07
104
+ ## Version 2026.01.07
75
105
  - Normalize seed to fit in signed int32 (issue #59)
76
106
  - Remove animation
77
107
  - Update Adamodar rates for 2025
78
108
  - Make Kim+Sam cases consistent
79
- - Make minor edits in About page
109
+ - Make minor edits in About page.
80
110
 
81
- ### Version 2026.01.05
111
+ ## Version 2026.01.05
82
112
  - Migrate examples and TOML configuration to snake_case (closing issue #52)
83
113
  - Optimizer still uses camelCase for distinction
84
114
  - Add reproducibility flag and merge reproducibility branch
@@ -100,7 +130,7 @@
100
130
  - Clean license and authorship
101
131
  - Improve Summary output styling
102
132
 
103
- ### Version 2025.12.29
133
+ ## Version 2025.12.29
104
134
  - Integrate loguru logging system with global log and filters
105
135
  - Split logger per object
106
136
  - Add persistence in TOML file
@@ -124,7 +154,7 @@
124
154
  - Make OBBBA expiration year idiot-proof
125
155
  - Fix typo (issue #47)
126
156
 
127
- ### Version 2025.12.20
157
+ ## Version 2025.12.20
128
158
  - Implement Debts and Fixed Assets capabilities
129
159
  - Mortgages, loans, restricted stocks, etc. and fixed lump-sum annuities can now be modeled
130
160
  - Include debts and fixed assets at end of plan in bequest
@@ -137,7 +167,7 @@
137
167
  - Improve UI
138
168
  - Improve integration with ssa.tools
139
169
 
140
- ### Version 2025.12.16
170
+ ## Version 2025.12.16
141
171
  - Fix error message when dates are empty in Create_Case
142
172
  - Add fix to prevent stored TOML age from being out of range
143
173
  - Rename duplicate to copy
@@ -145,27 +175,27 @@
145
175
  - Prepare for new tax season
146
176
  - Carry minor fixes from dev version
147
177
 
148
- ### Version 2025.12.11
178
+ ## Version 2025.12.11
149
179
  - Add more bubble help messages in Create Case
150
180
  - Fix bug in rates selection UI
151
181
  - Remove reliance on GitHub for graphics and example files
152
182
  - Update UI to use new file locations
153
183
  - Add new owl.png logo
154
184
 
155
- ### Version 2025.12.10
185
+ ## Version 2025.12.10
156
186
  - Add date of birth due to social security rules when birthday on 1st and 2nd
157
187
  - Modify FRA calculations accordingly
158
188
  - Add integration to ssa.tools
159
189
  - Add Dale's help message for date of birth
160
190
 
161
- ### Version 2025.12.09
191
+ ## Version 2025.12.09
162
192
  - Improve instructions for developers
163
193
  - Add link to ssa.tools on Fixed Income page
164
194
  - Fix bug on max age range for SS when month != 0
165
195
  - Add table of federal income tax itemized by bracket
166
196
  - Improve instructions for ssa.tools
167
197
 
168
- ### Version 2025.12.05
198
+ ## Version 2025.12.05
169
199
  - Add instructions for obtaining PIA
170
200
  - Enhance documentation for obtaining PIA
171
201
  - Add generic reference for PIA calculation
@@ -173,7 +203,7 @@
173
203
  - Fix error in month input
174
204
  - Add hint for birth month
175
205
 
176
- ### Version 2025.12.03
206
+ ## Version 2025.12.03
177
207
  - Code Social Security to use monthly PIA instead of annual amount
178
208
  - Add exact routines for FRA and increase/decrease factors due to claiming age
179
209
  - Add exact spousal benefits
@@ -187,7 +217,7 @@
187
217
  - Add caveat on account allocation ratios in documentation
188
218
  - Fix typo in documentation
189
219
 
190
- ### Version 2025.11.09
220
+ ## Version 2025.11.09
191
221
  - Move development status to production/stable in pyproject
192
222
  - Make version propagate everywhere needed
193
223
  - Add node limit on MILP to avoid Streamlit server shutdown on memory consumption
@@ -209,7 +239,7 @@
209
239
  - Fix graph settings
210
240
  - Make case naming consistent
211
241
 
212
- ### Version 2025.07.01
242
+ ## Version 2025.07.01
213
243
  - Add settings option for menu position (top or sidebar) thanks to Streamlit 1.46
214
244
  - Default is top menu
215
245
  - Add Net Investment Income Tax calculations in self-consistent loop
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## A retirement exploration tool based on linear programming
4
4
 
5
- <img align=right src="https://github.com/mdlacasse/Owl/blob/main/docs/images/owl.png?raw=true" width="250">
5
+ <img align=right src="https://github.com/mdlacasse/Owl/blob/main/papers/images/owl.png?raw=true" width="250">
6
6
 
7
7
  ------------------------------------------------------------------------------------
8
8
  ### About
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## A retirement exploration tool based on linear programming
4
4
 
5
- <img align=right src="https://raw.github.com/mdlacasse/Owl/main/docs/images/owl.png" width="250">
5
+ <img align=right src="https://raw.github.com/mdlacasse/Owl/main/papers/images/owl.png" width="250">
6
6
 
7
7
  ------------------------------------------------------------------------------------
8
8
  ### About
@@ -0,0 +1,64 @@
1
+ case_name = "Alex+Jamie"
2
+ description = "A case where there is big difference in longevity."
3
+
4
+ [basic_info]
5
+ status = "married"
6
+ names = [ "Alex", "Jamie",]
7
+ date_of_birth = [ "1960-01-15", "1961-01-17",]
8
+ life_expectancy = [ 72, 90,]
9
+ start_date = "2026-01-01"
10
+
11
+ [savings_assets]
12
+ taxable_savings_balances = [ 500.0, 200.0,]
13
+ tax_deferred_savings_balances = [ 1500.0, 400.0,]
14
+ tax_free_savings_balances = [ 50.0, 40.0,]
15
+ beneficiary_fractions = [ 1.0, 1.0, 1.0,]
16
+ spousal_surplus_deposit_fraction = 0.5
17
+
18
+ [household_financial_profile]
19
+ HFP_file_name = "dictionary of DataFrames"
20
+
21
+ [fixed_income]
22
+ pension_monthly_amounts = [ 0, 0,]
23
+ pension_ages = [ 65.0, 65.0,]
24
+ pension_indexed = [ false, false,]
25
+ social_security_pia_amounts = [ 3000, 1200,]
26
+ social_security_ages = [ 69.0, 62.083333333333336,]
27
+
28
+ [rates_selection]
29
+ heirs_rate_on_tax_deferred_estate = 30.0
30
+ dividend_rate = 1.72
31
+ obbba_expiration_year = 2032
32
+ method = "user"
33
+ values = [ 7.000000000000001, 4.0, 3.3000000000000003, 2.8,]
34
+ from = 1928
35
+ to = 2025
36
+
37
+ [asset_allocation]
38
+ interpolation_method = "linear"
39
+ interpolation_center = 15.0
40
+ interpolation_width = 5.0
41
+ type = "individual"
42
+ generic = [ [ [ 60, 40, 0, 0,], [ 60, 40, 0, 0,],], [ [ 60, 40, 0, 0,], [ 60, 40, 0, 0,],],]
43
+
44
+ [optimization_parameters]
45
+ spending_profile = "flat"
46
+ surviving_spouse_spending_percent = 60
47
+ objective = "maxSpending"
48
+
49
+ [solver_options]
50
+ maxRothConversion = 400.0
51
+ noRothConversions = "None"
52
+ startRothConversions = 2026
53
+ bequest = 0
54
+ solver = "HiGHS"
55
+ spendingSlack = 0
56
+ amoRoth = true
57
+ amoSurplus = true
58
+ withSCLoop = true
59
+ withMedicare = "loop"
60
+ noLateSurplus = false
61
+ previousMAGIs = [ 200.0, 200.0,]
62
+
63
+ [results]
64
+ default_plots = "today"
@@ -48,10 +48,10 @@ objective = "maxBequest"
48
48
  netSpending = 80.0
49
49
  maxRothConversion = 50
50
50
  startRothConversions = 2025
51
- withMedicare = "None"
52
51
  solver = "HiGHS"
53
52
  spendingSlack = 0
54
53
  withSCLoop = false
54
+ withMedicare = "None"
55
55
 
56
56
  [results]
57
57
  default_plots = "today"
@@ -1,5 +1,5 @@
1
1
  case_name = "jack+jill"
2
- description = "This example aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A wages and contributions file called 'jack+jill.xlsx' is associated with this case. This case uses the historical rate sequence of 1969 as a test case for guiding spending amounts from a near worst-case historical scenario. This case also demonstrates that the optimal strategy for Roth conversions does not necessarily involve surfing a tax bracket. \nA good exercise for learning Owl's capabilities is to duplicate this case and compare two scenarios: one with optimized Roth conversions and one without. Another possible exercise could involve comparing a historical retirement in 1969 vs. one taken in 1966. Or anything else you can think of..."
2
+ description = "This example aims to demonstrate some of Owl's capabilities. Jack and Jill are a married couple a few years from retirement. A Household Financial Profile called 'HFP_jack+jill.xlsx' is associated with this case. This case uses the historical rate sequence of 1969 as a test case for guiding spending amounts from a near worst-case historical scenario. This case also demonstrates that the optimal strategy for Roth conversions does not necessarily involve surfing a tax bracket. \nA good exercise for learning Owl's capabilities is to duplicate this case and compare two scenarios: one with optimized Roth conversions and one without. Another possible exercise could involve comparing a historical retirement in 1969 vs. one taken in 1966. Or anything else you can think of..."
3
3
 
4
4
  [basic_info]
5
5
  status = "married"
@@ -52,11 +52,11 @@ objective = "maxSpending"
52
52
  maxRothConversion = 100
53
53
  noRothConversions = "Jill"
54
54
  startRothConversions = 2025
55
+ withSCLoop = true
55
56
  withMedicare = "loop"
56
57
  bequest = 400
57
58
  solver = "HiGHS"
58
59
  spendingSlack = 0
59
- withSCLoop = true
60
60
 
61
61
  [results]
62
62
  default_plots = "today"
@@ -1,5 +1,5 @@
1
1
  case_name = "joe"
2
- description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the 'joe.xlsx' spreadsheet."
2
+ description = "This is an example of a case involving a single individual. Joe is single and will retire in a few years. His wages and contributions are contained in the 'HFP_joe.xlsx' Household Financial Profile."
3
3
 
4
4
  [basic_info]
5
5
  status = "single"
@@ -50,6 +50,8 @@ objective = "maxSpending"
50
50
  maxRothConversion = 50
51
51
  startRothConversions = 2025
52
52
  bequest = 300
53
+ withSCLoop = true
54
+ withMedicare = "loop"
53
55
 
54
56
  [results]
55
57
  default_plots = "nominal"
@@ -1,5 +1,5 @@
1
1
  case_name = "john+sally"
2
- description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File 'john+sally.xlsx' contains wages and contributions associated with this case. Run this case with different rates to see the effects on Roth conversions."
2
+ description = "This example reproduces the case of John and Sally, discussed by Eric Sajdak. This case can be used to compare the heuristic strategy of surfing a tax bracket for performing Roth conversions to a solution optimized by linear programming. The former is a good approach when one assumes fixed rates. When rates are varying, and the market drops, an optimized solution shows that it is sometime advantageous to convert above the target tax bracket. File 'HFP_john+sally.xlsx' contains wages and contributions associated with this case. Run this case with different rates to see the effects on Roth conversions."
3
3
 
4
4
  [basic_info]
5
5
  status = "married"
@@ -50,10 +50,10 @@ netSpending = 100
50
50
  maxRothConversion = 200
51
51
  noRothConversions = "None"
52
52
  startRothConversions = 2025
53
+ withSCLoop = true
53
54
  withMedicare = "loop"
54
55
  solver = "HiGHS"
55
56
  spendingSlack = 0
56
- withSCLoop = true
57
57
 
58
58
  [results]
59
59
  default_plots = "today"
@@ -1,5 +1,5 @@
1
1
  case_name = "Jon+Jane"
2
- description = "This case reproduces a similar case discussed a while back on i-orp. It involves Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A wages and contributions file called 'jon+jane.xlsx' is associated with this case."
2
+ description = "This case reproduces a similar case discussed a while back on i-orp. It involves Jon and Jane close to retirement, and assumes a base case of optimistic returns of 10% with an inflation of 3.5%. A Household Financial Profile called 'HFP_jon+jane.xlsx' is associated with this case."
3
3
 
4
4
  [basic_info]
5
5
  status = "married"
@@ -50,11 +50,11 @@ objective = "maxSpending"
50
50
  maxRothConversion = 0.0
51
51
  noRothConversions = "None"
52
52
  startRothConversions = 2025
53
- withMedicare = "loop"
54
53
  bequest = 30.0
55
54
  solver = "HiGHS"
56
55
  spendingSlack = 0
57
56
  withSCLoop = true
57
+ withMedicare = "loop"
58
58
 
59
59
  [results]
60
60
  default_plots = "today"
@@ -1,5 +1,5 @@
1
1
  case_name = "kim+sam-bequest"
2
- description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. A HFP file is associated with this case."
2
+ description = "This is the case of Kim and Sam used as an example case for optimizing bequest and Roth conversions. A Household Financial Profile called 'HFP_kim+sam.xslx' is associated with this case."
3
3
 
4
4
  [basic_info]
5
5
  status = "married"
@@ -54,10 +54,10 @@ netSpending = 145
54
54
  maxRothConversion = 100
55
55
  noRothConversions = "None"
56
56
  startRothConversions = 2026
57
- withMedicare = "loop"
58
57
  solver = "HiGHS"
59
58
  spendingSlack = 0
60
59
  withSCLoop = true
60
+ withMedicare = "loop"
61
61
 
62
62
  [results]
63
63
  default_plots = "today"
@@ -1,5 +1,5 @@
1
1
  case_name = "kim+sam-spending"
2
- description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions. An HFP file is associated with this case."
2
+ description = "This is the case of Kim and Sam used as an example case for optimizing spending and Roth conversions. A Household Financial Profile called 'HFP-kim+sam.xslx' is associated with this case."
3
3
 
4
4
  [basic_info]
5
5
  status = "married"
@@ -53,11 +53,11 @@ objective = "maxSpending"
53
53
  maxRothConversion = 100
54
54
  noRothConversions = "None"
55
55
  startRothConversions = 2026
56
- withMedicare = "loop"
57
56
  bequest = 0
58
57
  solver = "HiGHS"
59
58
  spendingSlack = 0
60
59
  withSCLoop = true
60
+ withMedicare = "loop"
61
61
 
62
62
  [results]
63
63
  default_plots = "today"