owlplanner 2025.12.20__tar.gz → 2026.1.26__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 (261) hide show
  1. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/.github/workflows/github-actions-runtests.yml +1 -1
  2. owlplanner-2026.1.26/.gitignore +91 -0
  3. owlplanner-2026.1.26/.streamlit/config.toml +3 -0
  4. owlplanner-2026.1.26/AUTHORS +15 -0
  5. owlplanner-2026.1.26/Adamodar_Rates_2026.xlsx +0 -0
  6. owlplanner-2026.1.26/PARAMETERS.md +289 -0
  7. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/PKG-INFO +10 -2
  8. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/README.md +6 -1
  9. owlplanner-2026.1.26/RELEASE_NOTES.md +229 -0
  10. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/USER_GUIDE.md +89 -35
  11. owlplanner-2026.1.26/case_test.toml +69 -0
  12. owlplanner-2026.1.26/convert_rates.py +58 -0
  13. owlplanner-2026.1.26/docker/buildContainers.sh +8 -0
  14. owlplanner-2026.1.26/docs/papers +1 -0
  15. owlplanner-2026.1.26/examples/Case_drawdowncalc-comparison-1.toml +57 -0
  16. owlplanner-2026.1.26/examples/Case_jack+jill.toml +62 -0
  17. owlplanner-2026.1.26/examples/Case_joe.toml +55 -0
  18. owlplanner-2026.1.26/examples/Case_john+sally.toml +59 -0
  19. owlplanner-2026.1.26/examples/Case_jon+jane.toml +60 -0
  20. owlplanner-2026.1.26/examples/Case_kim+sam-bequest.toml +63 -0
  21. owlplanner-2026.1.26/examples/Case_kim+sam-spending.toml +63 -0
  22. owlplanner-2026.1.26/examples/HFP_jack+jill.xlsx +0 -0
  23. owlplanner-2026.1.26/examples/HFP_jack+jill_house.xlsx +0 -0
  24. owlplanner-2026.1.26/examples/HFP_joe.xlsx +0 -0
  25. owlplanner-2026.1.26/examples/HFP_john+sally.xlsx +0 -0
  26. owlplanner-2026.1.26/examples/HFP_jon+jane.xlsx +0 -0
  27. owlplanner-2026.1.26/examples/HFP_kim+sam.xlsx +0 -0
  28. owlplanner-2026.1.26/examples/HFP_template.xlsx +0 -0
  29. owlplanner-2026.1.26/iteration_data.csv +32 -0
  30. owlplanner-2026.1.26/iteration_data_2.csv +57 -0
  31. owlplanner-2026.1.26/myrates.csv +3 -0
  32. owlplanner-2026.1.26/myrates.xlsx +0 -0
  33. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/john+sally.ipynb +2 -2
  34. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/kim+sam.ipynb +2 -2
  35. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/template.ipynb +2 -1
  36. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/tutorial_1.ipynb +2 -1
  37. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/tutorial_2.ipynb +2 -1
  38. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/notebooks/tutorial_3.ipynb +2 -1
  39. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/owl.pdf +0 -0
  40. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/owl.tex +320 -166
  41. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/pyproject.toml +6 -0
  42. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/pytest.ini +3 -0
  43. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/requirements.txt +2 -1
  44. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/README.md +1 -1
  45. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/index.qmd +2 -2
  46. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/install-uv.qmd +9 -9
  47. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/installation.qmd +2 -2
  48. owlplanner-2026.1.26/src/owlplanner/In Discussion #58, the case of Kim and Sam.md +307 -0
  49. owlplanner-2026.1.26/src/owlplanner/__init__.py +27 -0
  50. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/abcapi.py +18 -17
  51. owlplanner-2026.1.26/src/owlplanner/cli/README.md +50 -0
  52. owlplanner-2026.1.26/src/owlplanner/cli/_main.py +52 -0
  53. owlplanner-2026.1.26/src/owlplanner/cli/cli_logging.py +56 -0
  54. owlplanner-2026.1.26/src/owlplanner/cli/cmd_list.py +83 -0
  55. owlplanner-2026.1.26/src/owlplanner/cli/cmd_run.py +86 -0
  56. owlplanner-2026.1.26/src/owlplanner/config.py +498 -0
  57. owlplanner-2026.1.26/src/owlplanner/data/__init__.py +21 -0
  58. owlplanner-2026.1.26/src/owlplanner/data/rates.csv +99 -0
  59. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/debts.py +36 -8
  60. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/fixedassets.py +95 -21
  61. owlplanner-2026.1.26/src/owlplanner/mylogging.py +216 -0
  62. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/plan.py +793 -349
  63. owlplanner-2026.1.26/src/owlplanner/plotting/__init__.py +25 -0
  64. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/plotting/base.py +17 -3
  65. owlplanner-2026.1.26/src/owlplanner/plotting/factory.py +50 -0
  66. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/plotting/matplotlib_backend.py +30 -7
  67. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/plotting/plotly_backend.py +32 -9
  68. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/progress.py +16 -3
  69. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/rates.py +366 -361
  70. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/socialsecurity.py +28 -19
  71. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/tax2026.py +109 -30
  72. owlplanner-2026.1.26/src/owlplanner/timelists.py +406 -0
  73. owlplanner-2026.1.26/src/owlplanner/utils.py +302 -0
  74. owlplanner-2026.1.26/src/owlplanner/version.py +20 -0
  75. owlplanner-2026.1.26/tests/test_abcapi_coverage.py +305 -0
  76. owlplanner-2026.1.26/tests/test_config_coverage.py +340 -0
  77. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/tests/test_debts.py +22 -0
  78. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/tests/test_fixedassets.py +331 -3
  79. owlplanner-2026.1.26/tests/test_historical.py +66 -0
  80. owlplanner-2026.1.26/tests/test_logger.py +49 -0
  81. owlplanner-2026.1.26/tests/test_ltcg.py +45 -0
  82. owlplanner-2026.1.26/tests/test_mc.py +66 -0
  83. owlplanner-2026.1.26/tests/test_mylogging_coverage.py +287 -0
  84. owlplanner-2026.1.26/tests/test_plan_edge_cases.py +426 -0
  85. owlplanner-2026.1.26/tests/test_rates.py +514 -0
  86. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/tests/test_regressions.py +41 -8
  87. owlplanner-2026.1.26/tests/test_repro.py +250 -0
  88. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/tests/test_socsec.py +22 -0
  89. owlplanner-2026.1.26/tests/test_summary.py +271 -0
  90. owlplanner-2026.1.26/tests/test_timelists.py +410 -0
  91. owlplanner-2026.1.26/tests/test_timelists_coverage.py +364 -0
  92. owlplanner-2026.1.26/tests/test_toml_cases.py +168 -0
  93. owlplanner-2026.1.26/tests/test_ui_asset_allocation.py +36 -0
  94. owlplanner-2026.1.26/tests/test_ui_compare_summaries.py +40 -0
  95. owlplanner-2026.1.26/tests/test_ui_sskeys.py +45 -0
  96. owlplanner-2026.1.26/tests/test_units.py +31 -0
  97. owlplanner-2026.1.26/tests/test_utils_coverage.py +283 -0
  98. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/About_Owl.py +30 -4
  99. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Asset_Allocation.py +24 -1
  100. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Create_Case.py +83 -14
  101. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Documentation.py +251 -126
  102. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Fixed_Income.py +44 -10
  103. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Graphs.py +22 -0
  104. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Historical_Range.py +22 -0
  105. owlplanner-2026.1.26/ui/Household_Financial_Profile.py +303 -0
  106. owlplanner-2026.1.26/ui/Logs.py +113 -0
  107. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Monte_Carlo.py +23 -1
  108. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Optimization_Parameters.py +75 -29
  109. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Output_Files.py +23 -1
  110. owlplanner-2026.1.26/ui/Parameters_Reference.py +37 -0
  111. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Quick_Start.py +36 -18
  112. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Rates_Selection.py +313 -262
  113. owlplanner-2026.1.26/ui/Savings_Assets.py +106 -0
  114. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/Settings.py +22 -0
  115. owlplanner-2026.1.26/ui/Worksheets.py +41 -0
  116. owlplanner-2026.1.26/ui/__init__.py +21 -0
  117. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/case_progress.py +43 -15
  118. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/main.py +25 -4
  119. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/owlbridge.py +235 -58
  120. owlplanner-2026.1.26/ui/progress.py +46 -0
  121. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/sskeys.py +122 -56
  122. owlplanner-2026.1.26/ui/tomlexamples.py +105 -0
  123. owlplanner-2025.12.20/.gitignore +0 -11
  124. owlplanner-2025.12.20/.streamlit/config.toml +0 -3
  125. owlplanner-2025.12.20/RELEASE_NOTES.md +0 -72
  126. owlplanner-2025.12.20/docs/papers/owl.pdf +0 -0
  127. owlplanner-2025.12.20/examples/Case_jack+jill.toml +0 -57
  128. owlplanner-2025.12.20/examples/Case_joe.toml +0 -54
  129. owlplanner-2025.12.20/examples/Case_john+sally.toml +0 -53
  130. owlplanner-2025.12.20/examples/Case_jon+jane.toml +0 -56
  131. owlplanner-2025.12.20/examples/Case_kim+sam-bequest.toml +0 -56
  132. owlplanner-2025.12.20/examples/Case_kim+sam-spending.toml +0 -56
  133. owlplanner-2025.12.20/examples/HFP_jack+jill.xlsx +0 -0
  134. owlplanner-2025.12.20/examples/HFP_jack+jill_house.xlsx +0 -0
  135. owlplanner-2025.12.20/examples/HFP_joe.xlsx +0 -0
  136. owlplanner-2025.12.20/examples/HFP_john+sally.xlsx +0 -0
  137. owlplanner-2025.12.20/examples/HFP_jon+jane.xlsx +0 -0
  138. owlplanner-2025.12.20/examples/HFP_kim+sam.xlsx +0 -0
  139. owlplanner-2025.12.20/examples/HFP_template.xlsx +0 -0
  140. owlplanner-2025.12.20/examples/case_drawdowncalc-comparison-1.toml +0 -57
  141. owlplanner-2025.12.20/paste.py +0 -68
  142. owlplanner-2025.12.20/site-src/papers/images/AD-taxDef.png +0 -0
  143. owlplanner-2025.12.20/site-src/papers/images/AD-taxFree.png +0 -0
  144. owlplanner-2025.12.20/site-src/papers/images/AD-taxable.png +0 -0
  145. owlplanner-2025.12.20/site-src/papers/images/Hist_Bequest.png +0 -0
  146. owlplanner-2025.12.20/site-src/papers/images/Hist_Spending.png +0 -0
  147. owlplanner-2025.12.20/site-src/papers/images/MC-tutorial2a.png +0 -0
  148. owlplanner-2025.12.20/site-src/papers/images/MC-tutorial2b.png +0 -0
  149. owlplanner-2025.12.20/site-src/papers/images/OwlUI.png +0 -0
  150. owlplanner-2025.12.20/site-src/papers/images/allocations.png +0 -0
  151. owlplanner-2025.12.20/site-src/papers/images/piecewiseConstant.png +0 -0
  152. owlplanner-2025.12.20/site-src/papers/images/profile.png +0 -0
  153. owlplanner-2025.12.20/site-src/papers/images/ratesCorrelations.png +0 -0
  154. owlplanner-2025.12.20/site-src/papers/images/ratesPlot.png +0 -0
  155. owlplanner-2025.12.20/site-src/papers/images/savingsPlot.png +0 -0
  156. owlplanner-2025.12.20/site-src/papers/images/sourcesPlot.png +0 -0
  157. owlplanner-2025.12.20/site-src/papers/images/spendingPlot.png +0 -0
  158. owlplanner-2025.12.20/site-src/papers/images/taxIncomePlot.png +0 -0
  159. owlplanner-2025.12.20/site-src/papers/images/taxesPlot.png +0 -0
  160. owlplanner-2025.12.20/site-src/papers/owl.pdf +0 -0
  161. owlplanner-2025.12.20/site-src/papers/owl.tex +0 -1552
  162. owlplanner-2025.12.20/src/owlplanner/__init__.py +0 -8
  163. owlplanner-2025.12.20/src/owlplanner/config.py +0 -315
  164. owlplanner-2025.12.20/src/owlplanner/data/__init__.py +0 -0
  165. owlplanner-2025.12.20/src/owlplanner/data/rates.csv +0 -98
  166. owlplanner-2025.12.20/src/owlplanner/mylogging.py +0 -84
  167. owlplanner-2025.12.20/src/owlplanner/plotting/__init__.py +0 -12
  168. owlplanner-2025.12.20/src/owlplanner/plotting/factory.py +0 -37
  169. owlplanner-2025.12.20/src/owlplanner/tax2025.py +0 -359
  170. owlplanner-2025.12.20/src/owlplanner/timelists.py +0 -230
  171. owlplanner-2025.12.20/src/owlplanner/utils.py +0 -127
  172. owlplanner-2025.12.20/src/owlplanner/version.py +0 -1
  173. owlplanner-2025.12.20/tests/test_logger.py +0 -21
  174. owlplanner-2025.12.20/tests/test_repro.py +0 -125
  175. owlplanner-2025.12.20/tests/test_toml_cases.py +0 -57
  176. owlplanner-2025.12.20/tests/test_ui_asset_allocation.py +0 -14
  177. owlplanner-2025.12.20/tests/test_ui_compare_summaries.py +0 -18
  178. owlplanner-2025.12.20/tests/test_ui_sskeys.py +0 -24
  179. owlplanner-2025.12.20/tests/test_units.py +0 -11
  180. owlplanner-2025.12.20/ui/AI +0 -48
  181. owlplanner-2025.12.20/ui/Household_Financial_Profile.py +0 -259
  182. owlplanner-2025.12.20/ui/Logs.py +0 -14
  183. owlplanner-2025.12.20/ui/NewDocumentation.py +0 -987
  184. owlplanner-2025.12.20/ui/Savings_Assets.py +0 -83
  185. owlplanner-2025.12.20/ui/Worksheets.py +0 -19
  186. owlplanner-2025.12.20/ui/__init__.py +0 -0
  187. owlplanner-2025.12.20/ui/owl.png +0 -0
  188. owlplanner-2025.12.20/ui/progress.py +0 -29
  189. owlplanner-2025.12.20/ui/tomlexamples.py +0 -34
  190. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/.devcontainer/devcontainer.json +0 -0
  191. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/.flake8 +0 -0
  192. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/.gitattributes +0 -0
  193. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/.streamlit/fullconfig.toml +0 -0
  194. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/INSTALL.md +0 -0
  195. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/LICENSE +0 -0
  196. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/awi.txt +0 -0
  197. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/Dockerfile.bare +0 -0
  198. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/Dockerfile.static +0 -0
  199. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/README.md +0 -0
  200. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/buildContainers.cmd +0 -0
  201. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/buildPackage.cmd +0 -0
  202. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/buildPackage.sh +0 -0
  203. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/buildentrypoint.sh +0 -0
  204. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/docker-compose.yml +0 -0
  205. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docker/runentrypoint.sh +0 -0
  206. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/examples/example-1.html +0 -0
  207. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/index.html +0 -0
  208. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/install-uv.html +0 -0
  209. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/installation.html +0 -0
  210. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/search.json +0 -0
  211. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/bootstrap/bootstrap-45a48b56c8ad2523a9a31c69be39928e.min.css +0 -0
  212. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/bootstrap/bootstrap-icons.css +0 -0
  213. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/bootstrap/bootstrap-icons.woff +0 -0
  214. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/bootstrap/bootstrap.min.js +0 -0
  215. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/clipboard/clipboard.min.js +0 -0
  216. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/anchor.min.js +0 -0
  217. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/axe/axe-check.js +0 -0
  218. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/popper.min.js +0 -0
  219. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/quarto-syntax-highlighting-587c61ba64f3a5504c4d52d930310e48.css +0 -0
  220. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/quarto.js +0 -0
  221. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/tabsets/tabsets.js +0 -0
  222. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/tippy.css +0 -0
  223. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-html/tippy.umd.min.js +0 -0
  224. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-nav/headroom.min.js +0 -0
  225. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-nav/quarto-nav.js +0 -0
  226. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-search/autocomplete.umd.js +0 -0
  227. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-search/fuse.min.js +0 -0
  228. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/site_libs/quarto-search/quarto-search.js +0 -0
  229. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/docs/users_guide.html +0 -0
  230. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/owlplanner.cmd +0 -0
  231. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/owlplanner.sh +0 -0
  232. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/AD-taxDef.png +0 -0
  233. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/AD-taxFree.png +0 -0
  234. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/AD-taxable.png +0 -0
  235. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/Hist_Bequest.png +0 -0
  236. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/Hist_Spending.png +0 -0
  237. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/MC-tutorial2a.png +0 -0
  238. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/MC-tutorial2b.png +0 -0
  239. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/OwlUI.png +0 -0
  240. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/allocations.png +0 -0
  241. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/owl.png +0 -0
  242. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/piecewiseConstant.png +0 -0
  243. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/profile.png +0 -0
  244. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/ratesCorrelations.png +0 -0
  245. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/ratesPlot.png +0 -0
  246. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/savingsPlot.png +0 -0
  247. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/sourcesPlot.png +0 -0
  248. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/spendingPlot.png +0 -0
  249. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/taxIncomePlot.png +0 -0
  250. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/papers/images/taxesPlot.png +0 -0
  251. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/.gitignore +0 -0
  252. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/_quarto.yml +0 -0
  253. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/assets/owl.png +0 -0
  254. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/examples/example-1.qmd +0 -0
  255. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/examples/workbook_jack & jill - tutorial.xlsx +0 -0
  256. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/site-src/users_guide.qmd +0 -0
  257. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/data/awi.csv +0 -0
  258. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/data/bendpoints.csv +0 -0
  259. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/src/owlplanner/data/newawi.csv +0 -0
  260. {owlplanner-2025.12.20 → owlplanner-2026.1.26}/ui/README.md +0 -0
  261. {owlplanner-2025.12.20/site-src/papers/images → owlplanner-2026.1.26/ui}/owl.png +0 -0
@@ -12,7 +12,7 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- python-version: ["3.9", "3.10", "3.13"]
15
+ python-version: ["3.10", "3.13", "3.14"]
16
16
 
17
17
  steps:
18
18
  - uses: actions/checkout@v4
@@ -0,0 +1,91 @@
1
+ # --------------------------------------------------
2
+ # Python
3
+ # --------------------------------------------------
4
+ __pycache__/
5
+ *.py[cod]
6
+ *.so
7
+ .coverage
8
+ .coverage.*
9
+ .pytest_cache/
10
+ .mypy_cache/
11
+ .ruff_cache/
12
+
13
+ # --------------------------------------------------
14
+ # Virtual environments
15
+ # --------------------------------------------------
16
+ .venv/
17
+ venv/
18
+ .env/
19
+
20
+ # --------------------------------------------------
21
+ # Conda (optional developer use)
22
+ # --------------------------------------------------
23
+ .conda/
24
+ conda-meta/
25
+ *.conda
26
+ *.conda-lock
27
+ environment.lock.yml
28
+
29
+ # --------------------------------------------------
30
+ # uv / packaging
31
+ # --------------------------------------------------
32
+ dist/
33
+ build/
34
+ *.egg-info/
35
+
36
+ # IMPORTANT:
37
+ # uv.lock IS TRACKED (do not ignore) but...
38
+ # Left there for now to prevent Streamlit lock down
39
+ # Added before building packages in docker/scripts
40
+ uv.lock
41
+
42
+ # --------------------------------------------------
43
+ # Quarto
44
+ # --------------------------------------------------
45
+ .quarto/
46
+ *_cache/
47
+ *_files/
48
+
49
+ # --------------------------------------------------
50
+ # Jupyter
51
+ # --------------------------------------------------
52
+ .ipynb_checkpoints/
53
+
54
+ # --------------------------------------------------
55
+ # Streamlit
56
+ # --------------------------------------------------
57
+ .streamlit/secrets.toml
58
+
59
+ # --------------------------------------------------
60
+ # dotenv / secrets
61
+ # --------------------------------------------------
62
+ .env
63
+ .env.*
64
+ !.env.example
65
+
66
+ # --------------------------------------------------
67
+ # Logs & temporary files
68
+ # --------------------------------------------------
69
+ *.log
70
+ *.aux
71
+ *~
72
+
73
+ # --------------------------------------------------
74
+ # OS / editor noise
75
+ # --------------------------------------------------
76
+ .DS_Store
77
+ Thumbs.db
78
+ *.swp
79
+ *.swo
80
+
81
+ # --------------------------------------------------
82
+ # Project-specific ignored folders
83
+ # --------------------------------------------------
84
+ otherFiles/
85
+ myfiles/
86
+ secrets/
87
+
88
+ # --------------------------------------------------
89
+ # GitHub Pages
90
+ # --------------------------------------------------
91
+ # docs/ IS TRACKED (Quarto output)
@@ -0,0 +1,3 @@
1
+ [theme]
2
+ base = "dark"
3
+ # dataframeHeaderBackgroundColor = "#692f24"
@@ -0,0 +1,15 @@
1
+ # This is the list of Owlplanner's significant contributors.
2
+ #
3
+ # This does not necessarily list everyone who has contributed code.
4
+ # To see the full list of contributors, see the revision history in
5
+ # source control.
6
+ Martin-D. Lacasse (mdlacasse, original author)
7
+ Robert E. Anderson (NH-RedAnt)
8
+ Clark Jefcoat (hubcity)
9
+ kg333
10
+ John Leonard (jleonard99)
11
+ Benjamin Quinn (blquinn)
12
+ Dale Seng (sengsational)
13
+ Josh Williams (noimjosh)
14
+ Gene Wood (gene1wood)
15
+
@@ -0,0 +1,289 @@
1
+ # Owl Parameters
2
+
3
+ This document describes all parameters used in Owl TOML configuration files. The TOML file structure is organized into sections for clarity, and can be consumed by both the UI and CLI applications.
4
+
5
+ **Note:** Throughout this document, `N_i` refers to the number of individuals in the plan (1 for single, 2 for married).
6
+
7
+ ---
8
+
9
+ ## Root Level Parameters
10
+
11
+ These parameters are defined at the root level of the TOML file (not within any section).
12
+
13
+ | Parameter | Type | Description |
14
+ |-----------|------|-------------|
15
+ | `case_name` | string | Name of the case/plan |
16
+ | `description` | string | A short text describing the purpose of the case |
17
+
18
+ ---
19
+
20
+ ## [basic_info]
21
+
22
+ Basic information about the individuals in the plan.
23
+
24
+ | Parameter | Type | Description |
25
+ |-----------|------|-------------|
26
+ | `status` | string | Filing status. Valid values: `"single"`, `"married"` |
27
+ | `names` | list of strings | Names of the individuals in the plan. Must contain 1 or 2 names. Length determines `N_i` |
28
+ | `date_of_birth` | list of `N_i` ISO dates | Date of birth for each individual in ISO format (e.g., `"1967-01-15"`). Defaults to `"1965-01-15"` if not specified |
29
+ | `life_expectancy` | list of `N_i` integers | Life expectancy in years for each individual |
30
+ | `start_date` | string | Start date of the plan (e.g., `"01-01"`, `"01/01"`, `"2026-01-01"`). Only the month and day are used; the plan always starts in the current year. Defaults to `"today"` if not specified |
31
+
32
+ ---
33
+
34
+ ## [savings_assets]
35
+
36
+ Initial account balances and beneficiary information.
37
+
38
+ | Parameter | Type | Description |
39
+ |-----------|------|-------------|
40
+ | `taxable_savings_balances` | list of `N_i` floats | Initial balance in taxable accounts for each individual (in thousands of dollars) |
41
+ | `tax_deferred_savings_balances` | list of `N_i` floats | Initial balance in tax-deferred accounts (e.g., 401k, traditional IRA) for each individual (in thousands of dollars) |
42
+ | `tax_free_savings_balances` | list of `N_i` floats | Initial balance in tax-free accounts (e.g., Roth IRA, Roth 401k) for each individual (in thousands of dollars) |
43
+ | `beneficiary_fractions` | list of 3 floats | *(Married only)* Fraction of each account type (taxable, tax-deferred, tax-free) bequeathed to the surviving spouse. Each value should be between 0.0 and 1.0 |
44
+ | `spousal_surplus_deposit_fraction` | float | *(Married only)* Fraction of surplus to deposit in the second spouse's taxable account. Value between 0.0 and 1.0 |
45
+
46
+ ---
47
+
48
+ ## [household_financial_profile]
49
+
50
+ Reference to the Excel file containing wages, contributions, and other time-varying financial data.
51
+
52
+ | Parameter | Type | Description |
53
+ |-----------|------|-------------|
54
+ | `HFP_file_name` | string | Name of the Excel file (`.xlsx`) containing wages, contributions, Roth conversions, and big-ticket items. Use `"None"` if no file is associated with the case |
55
+
56
+ **Note:** The Excel file should contain one sheet per individual with columns for: year, anticipated wages, taxable contributions, 401k contributions, Roth 401k contributions, IRA contributions, Roth IRA contributions, Roth conversions, and big-ticket items.
57
+
58
+ ---
59
+
60
+ ## [fixed_income]
61
+
62
+ Pension and Social Security information.
63
+
64
+ | Parameter | Type | Description |
65
+ |-----------|------|-------------|
66
+ | `pension_monthly_amounts` | list of `N_i` floats | Monthly pension amount for each individual (in dollars). Use `0` if no pension |
67
+ | `pension_ages` | list of `N_i` floats | Age at which pension starts for each individual |
68
+ | `pension_indexed` | list of `N_i` booleans | Whether each pension is indexed for inflation |
69
+ | `social_security_pia_amounts` | list of `N_i` integers | Primary Insurance Amount (PIA) for Social Security for each individual (in dollars) |
70
+ | `social_security_ages` | list of `N_i` floats | Age at which Social Security benefits start for each individual |
71
+
72
+ ---
73
+
74
+ ## [rates_selection]
75
+
76
+ Investment return rates and inflation assumptions.
77
+
78
+ | Parameter | Type | Description |
79
+ |-----------|------|-------------|
80
+ | `heirs_rate_on_tax_deferred_estate` | float | Tax rate (as percentage, e.g., `30.0` for 30%) that heirs will pay on inherited tax-deferred accounts |
81
+ | `dividend_rate` | float | Dividend rate as a percentage (e.g., `1.72` for 1.72%) |
82
+ | `obbba_expiration_year` | integer | Year when the OBBBA (One Big Beautiful Bill Act) provisions expire. Default is `2032` |
83
+ | `method` | string | Method for determining rates. Valid values: `"default"`, `"optimistic"`, `"conservative"`, `"user"`, `"historical"`, `"historical average"`, `"stochastic"`, `"histochastic"` |
84
+
85
+ ### Conditional Parameters Based on `method`
86
+
87
+ #### For `method = "user"` or `"stochastic"`:
88
+ | Parameter | Type | Description |
89
+ |-----------|------|-------------|
90
+ | `values` | list of 4 floats | Fixed rate values as percentages: [S&P 500 return, Corporate Baa bonds return, 10-year Treasury notes return, Inflation rate] |
91
+
92
+ #### For `method = "stochastic"`:
93
+ | Parameter | Type | Description |
94
+ |-----------|------|-------------|
95
+ | `standard_deviations` | list of 4 floats | Standard deviations (as percentages) for each rate type |
96
+ | `correlations` | array | Correlation matrix (4×4) or flattened upper triangle (6 values) for the four rate types |
97
+
98
+ #### For `method = "stochastic"` or `"histochastic"`:
99
+ | Parameter | Type | Description |
100
+ |-----------|------|-------------|
101
+ | `rate_seed` | integer | Random seed for reproducible stochastic rates |
102
+ | `reproducible_rates` | boolean | Whether stochastic rates should be reproducible |
103
+
104
+ #### For `method = "historical"`, `"historical average"`, or `"histochastic"`:
105
+ | Parameter | Type | Description |
106
+ |-----------|------|-------------|
107
+ | `from` | integer | Starting year for historical data range (must be between 1928 and 2025) |
108
+ | `to` | integer | Ending year for historical data range (must be between 1928 and 2025, and greater than `from`) |
109
+
110
+ **Note:** `from`/`to` are stored for all methods in saved case files. Methods that do not use them ignore these fields.
111
+
112
+ ---
113
+
114
+ ## [asset_allocation]
115
+
116
+ Asset allocation strategy and how it changes over time.
117
+
118
+ | Parameter | Type | Description |
119
+ |-----------|------|-------------|
120
+ | `interpolation_method` | string | Method for interpolating asset allocation over time. Valid values: `"linear"`, `"s-curve"` |
121
+ | `interpolation_center` | float | Center point of the interpolation curve (in years from start). Ignored for `"linear"` |
122
+ | `interpolation_width` | float | Width of the interpolation curve (in years). Ignored for `"linear"` |
123
+ | `type` | string | Type of allocation strategy. Valid values: `"account"`, `"individual"`, `"spouses"` |
124
+
125
+ ### Conditional Parameters Based on `type`
126
+
127
+ #### For `type = "account"`:
128
+ | Parameter | Type | Description |
129
+ |-----------|------|-------------|
130
+ | `taxable` | 3D array | Asset allocation bounds for taxable accounts. Structure: `[[[initial_stocks, initial_bonds, initial_fixed, initial_real_estate], [final_stocks, final_bonds, final_fixed, final_real_estate]]]` for each individual |
131
+ | `tax-deferred` | 3D array | Asset allocation bounds for tax-deferred accounts (same structure as `taxable`) |
132
+ | `tax-free` | 3D array | Asset allocation bounds for tax-free accounts (same structure as `taxable`) |
133
+
134
+ #### For `type = "individual"` or `"spouses"`:
135
+ | Parameter | Type | Description |
136
+ |-----------|------|-------------|
137
+ | `generic` | 3D array | Generic asset allocation bounds. Structure: `[[[initial_stocks, initial_bonds, initial_fixed, initial_real_estate], [final_stocks, final_bonds, final_fixed, final_real_estate]], ...]` for each individual. For single individuals, only one pair is needed |
138
+
139
+ **Note:** All allocation values are percentages that should sum to 100 for each time point. The four asset classes are: stocks, bonds, fixed assets, and real estate.
140
+
141
+ ---
142
+
143
+ ## [optimization_parameters]
144
+
145
+ Parameters controlling the optimization objective and spending profile.
146
+
147
+ | Parameter | Type | Description |
148
+ |-----------|------|-------------|
149
+ | `spending_profile` | string | Type of spending profile. Valid values: `"flat"`, `"smile"` |
150
+ | `surviving_spouse_spending_percent` | integer | Percentage of spending amount for the surviving spouse (0-100). Default is `60` |
151
+ | `objective` | string | Optimization objective. Valid values: `"maxSpending"`, `"maxBequest"` |
152
+
153
+ ### Conditional Parameters for `spending_profile = "smile"`:
154
+ | Parameter | Type | Description |
155
+ |-----------|------|-------------|
156
+ | `smile_dip` | integer | Percentage to decrease spending during the "slow-go" years (0-100). Default is `15` |
157
+ | `smile_increase` | integer | Percentage to increase (or decrease if negative) spending over the time span (-100 to 100). Default is `12` |
158
+ | `smile_delay` | integer | Number of years from the start before spending begins to decrease (0 to plan duration - 2). Default is `0` |
159
+
160
+ **Note:** The "smile" profile creates a spending pattern that starts high, decreases during middle years, and increases again later in retirement.
161
+
162
+ ---
163
+
164
+ ## [solver_options]
165
+
166
+ Options controlling the optimization solver and constraints.
167
+
168
+ | Parameter | Type | Description | Default |
169
+ |-----------|------|-------------|---------|
170
+ | `absTol` | float | *(Advanced)* Absolute convergence tolerance for the self-consistent loop objective. | `20` |
171
+ | `amoConstraints` | boolean | *(Advanced)* Whether to use at-most-one (AMO) constraints in the optimization. | `true` |
172
+ | `amoRoth` | boolean | *(Advanced)* Whether to enforce at-most-one (AMO) constraints preventing simultaneous Roth conversions and tax-free withdrawals. | `true` |
173
+ | `amoSurplus` | boolean | *(Advanced)* Whether to enforce XOR constraints preventing simultaneous surplus deposits and withdrawals from taxable or tax-free accounts. | `true` |
174
+ | `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
+ | `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` |
177
+ | `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
+ | `maxIter` | integer | *(Advanced)* Maximum number of iterations for the self-consistent loop. Must be at least 1. | `29` |
179
+ | `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 |
180
+ | `maxTime` | float | *(Advanced)* Solver time limit in seconds. | `900` |
181
+ | `netSpending` | float | Target net spending amount in today's dollars (in `units`). Used when `objective = "maxBequest"`. | Required for `maxBequest` |
182
+ | `noLateSurplus` | boolean | Disallow surplus deposits in the final two years of the plan. | `false` |
183
+ | `noRothConversions` | string | Name of individual for whom Roth conversions are disabled, or `"None"` to allow conversions for all. | `"None"` |
184
+ | `oppCostX` | float | *(Advanced)* Opportunity cost applied to Roth conversions (percent). | `0` |
185
+ | `previousMAGIs` | array | *(Advanced)* Two-element list of prior-year MAGI values (in `units`) for Medicare calculations. | `[0, 0]` |
186
+ | `relTol` | float | *(Advanced)* Relative convergence tolerance for the self-consistent loop objective. | `max(1e-6, gap / 300)` |
187
+ | `solver` | string | Solver to use for optimization. Valid values: `"HiGHS"`, `"PuLP/CBC"`, `"PuLP/HiGHS"`, `"MOSEK"`. | `"HiGHS"` |
188
+ | `spendingSlack` | integer | Percentage allowed to deviate from the spending profile (0-50). | `0` |
189
+ | `startRothConversions` | integer | Year when Roth conversions can begin (clamped to the current year). | Current year |
190
+ | `swapRothConverters` | integer | *(Advanced)* For plans involvng spouses, only allow one spouse to perform Roth conversions per year. The year provided determines a transition year when roles are swapped. The sign selects who converts first: positive means person 1 can convert first and person 2 any time after; negative year means person 2 before and person 1 after. This option overrides the `noRothConversions` option. | `0` |
191
+ | `units` | string | Units for amounts. Valid values: `"1"` (dollars), `"k"` (thousands), `"M"` (millions). | `"k"` |
192
+ | `verbose` | boolean | Enable solver verbosity/output where supported. | `false` |
193
+ | `withMedicare` | string | Medicare IRMAA handling. Valid values: `"None"`, `"loop"`, `"optimize"` (expert). | `"loop"` |
194
+ | `withSCLoop` | boolean | Whether to use the self-consistent loop for solving. | `true` |
195
+
196
+ **Note:** The solver options dictionary is passed directly to the optimization routine. Only the options listed above are validated; other options may be accepted but are not documented here.
197
+
198
+ ---
199
+
200
+ ## [results]
201
+
202
+ Parameters controlling result display and output.
203
+
204
+ | Parameter | Type | Description |
205
+ |-----------|------|-------------|
206
+ | `default_plots` | string | Default plot display mode. Valid values: `"nominal"` (nominal dollars), `"today"` (today's dollars) |
207
+
208
+ ---
209
+
210
+ ## Notes on Data Types
211
+
212
+ - **Floats**: All monetary amounts are typically in thousands of dollars unless otherwise specified
213
+ - **Integers**: Used for years, ages, and counts
214
+ - **Booleans**: `true` or `false` in TOML
215
+ - **ISO Dates**: Format `"YYYY-MM-DD"` (e.g., `"1967-01-15"`)
216
+ - **Lists**: Arrays in TOML, e.g., `[1, 2, 3]` or `["Name1", "Name2"]`
217
+ - **3D Arrays**: Nested arrays, e.g., `[[[60, 40, 0, 0], [70, 30, 0, 0]]]`
218
+
219
+ ## Example TOML Structure
220
+
221
+ ```toml
222
+ case_name = "example"
223
+ description = "Example case description"
224
+
225
+ [basic_info]
226
+ status = "married"
227
+ names = ["Person1", "Person2"]
228
+ date_of_birth = ["1965-01-15", "1967-03-20"]
229
+ life_expectancy = [89, 92]
230
+ start_date = "2026-01-01"
231
+
232
+ [savings_assets]
233
+ taxable_savings_balances = [100.0, 50.0]
234
+ tax_deferred_savings_balances = [500.0, 300.0]
235
+ tax_free_savings_balances = [200.0, 150.0]
236
+ beneficiary_fractions = [1.0, 1.0, 1.0]
237
+ spousal_surplus_deposit_fraction = 0.5
238
+
239
+ [household_financial_profile]
240
+ HFP_file_name = "HFP_example.xlsx"
241
+
242
+ [fixed_income]
243
+ pension_monthly_amounts = [0, 0]
244
+ pension_ages = [65.0, 65.0]
245
+ pension_indexed = [false, false]
246
+ social_security_pia_amounts = [2360, 1642]
247
+ social_security_ages = [70.0, 67.0]
248
+
249
+ [rates_selection]
250
+ heirs_rate_on_tax_deferred_estate = 30.0
251
+ dividend_rate = 1.8
252
+ obbba_expiration_year = 2032
253
+ method = "historical average"
254
+ from = 1969
255
+ to = 2002
256
+
257
+ [asset_allocation]
258
+ interpolation_method = "s-curve"
259
+ interpolation_center = 15.0
260
+ interpolation_width = 5.0
261
+ type = "individual"
262
+ generic = [[[60, 40, 0, 0], [70, 30, 0, 0]], [[60, 40, 0, 0], [80, 20, 0, 0]]]
263
+
264
+ [optimization_parameters]
265
+ spending_profile = "smile"
266
+ surviving_spouse_spending_percent = 60
267
+ smile_dip = 15
268
+ smile_increase = 12
269
+ smile_delay = 0
270
+ objective = "maxSpending"
271
+
272
+ [solver_options]
273
+ maxRothConversion = 100
274
+ noRothConversions = "None"
275
+ startRothConversions = 2025
276
+ withMedicare = "loop"
277
+ bequest = 500
278
+ solver = "HiGHS"
279
+ spendingSlack = 0
280
+ amoRoth = true
281
+ amoSurplus = true
282
+ withSCLoop = true
283
+ maxIter = 29
284
+ maxTime = 900
285
+
286
+ [results]
287
+ default_plots = "nominal"
288
+ ```
289
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.12.20
3
+ Version: 2026.1.26
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
@@ -683,6 +683,7 @@ License: GNU GENERAL PUBLIC LICENSE
683
683
  the library. If this is what you want to do, use the GNU Lesser General
684
684
  Public License instead of this License. But first, please read
685
685
  <https://www.gnu.org/licenses/why-not-lgpl.html>.
686
+ License-File: AUTHORS
686
687
  License-File: LICENSE
687
688
  Classifier: Development Status :: 5 - Production/Stable
688
689
  Classifier: Intended Audience :: End Users/Desktop
@@ -691,8 +692,10 @@ Classifier: Operating System :: OS Independent
691
692
  Classifier: Programming Language :: Python :: 3
692
693
  Classifier: Topic :: Office/Business :: Financial :: Investment
693
694
  Requires-Python: >=3.10
695
+ Requires-Dist: click>=8.3.1
694
696
  Requires-Dist: highspy
695
697
  Requires-Dist: jupyter>=1.1.1
698
+ Requires-Dist: loguru>=0.7.3
696
699
  Requires-Dist: matplotlib
697
700
  Requires-Dist: numpy
698
701
  Requires-Dist: odfpy
@@ -712,7 +715,7 @@ Description-Content-Type: text/markdown
712
715
 
713
716
  ## A retirement exploration tool based on linear programming
714
717
 
715
- <img align=right src="https://github.com/mdlacasse/Owl/blob/main/docs/images/owl.png?raw=true" width="250">
718
+ <img align="right" src="papers/images/owl.png" width="250">
716
719
 
717
720
  -------------------------------------------------------------------------------------
718
721
 
@@ -724,6 +727,10 @@ Users can select varying return rates to perform historical back testing,
724
727
  stochastic rates for performing Monte Carlo analyses,
725
728
  or fixed rates either derived from historical averages, or set by the user.
726
729
 
730
+ Owl is designed for US retirees as it considers US federal tax laws,
731
+ Medicare premiums, rules for 401k including required minimum distributions,
732
+ maturation rules for Roth accounts and conversions, social security rules, etc.
733
+
727
734
  There are three ways to run Owl:
728
735
 
729
736
  - **Streamlit Hub:** Run Owl remotely as hosted on the Streamlit Community Server at
@@ -763,6 +770,7 @@ Follow these [instructions](INSTALL.md) to install from the source code and self
763
770
  It can also run on [MOSEK](https://mosek.com) if available on your computer.
764
771
  - Owl planner relies on the following [Python](https://python.org) packages:
765
772
  - [highspy](https://highs.dev),
773
+ [loguru](https://github.com/Delgan/loguru),
766
774
  [Matplotlib](https://matplotlib.org),
767
775
  [Numpy](https://numpy.org),
768
776
  [odfpy](https://https://pypi.org/project/odfpy),
@@ -3,7 +3,7 @@
3
3
 
4
4
  ## A retirement exploration tool based on linear programming
5
5
 
6
- <img align=right src="https://github.com/mdlacasse/Owl/blob/main/docs/images/owl.png?raw=true" width="250">
6
+ <img align="right" src="papers/images/owl.png" width="250">
7
7
 
8
8
  -------------------------------------------------------------------------------------
9
9
 
@@ -15,6 +15,10 @@ Users can select varying return rates to perform historical back testing,
15
15
  stochastic rates for performing Monte Carlo analyses,
16
16
  or fixed rates either derived from historical averages, or set by the user.
17
17
 
18
+ Owl is designed for US retirees as it considers US federal tax laws,
19
+ Medicare premiums, rules for 401k including required minimum distributions,
20
+ maturation rules for Roth accounts and conversions, social security rules, etc.
21
+
18
22
  There are three ways to run Owl:
19
23
 
20
24
  - **Streamlit Hub:** Run Owl remotely as hosted on the Streamlit Community Server at
@@ -54,6 +58,7 @@ Follow these [instructions](INSTALL.md) to install from the source code and self
54
58
  It can also run on [MOSEK](https://mosek.com) if available on your computer.
55
59
  - Owl planner relies on the following [Python](https://python.org) packages:
56
60
  - [highspy](https://highs.dev),
61
+ [loguru](https://github.com/Delgan/loguru),
57
62
  [Matplotlib](https://matplotlib.org),
58
63
  [Numpy](https://numpy.org),
59
64
  [odfpy](https://https://pypi.org/project/odfpy),