owlplanner 2025.4.28__tar.gz → 2025.5.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 (121) hide show
  1. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/PKG-INFO +23 -27
  2. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/README.md +22 -26
  3. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/Dockerfile +34 -34
  4. owlplanner-2025.5.2/docs/owl.pdf +0 -0
  5. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/owl.tex +264 -547
  6. owlplanner-2025.5.2/git-cheats +11 -0
  7. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/pyproject.toml +1 -1
  8. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/requirements.txt +1 -0
  9. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/abcapi.py +17 -23
  10. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/plan.py +325 -298
  11. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/tax2025.py +2 -31
  12. owlplanner-2025.5.2/src/owlplanner/version.py +1 -0
  13. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_repro.py +2 -3
  14. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/About_Owl.py +11 -6
  15. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Documentation.py +32 -21
  16. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Optimization_Parameters.py +15 -9
  17. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/owlbridge.py +4 -5
  18. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/requirements.txt +2 -1
  19. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/sskeys.py +1 -1
  20. owlplanner-2025.4.28/docs/images/piecewiseConstant.png +0 -0
  21. owlplanner-2025.4.28/docs/owl.pdf +0 -0
  22. owlplanner-2025.4.28/reponse.txt +0 -20
  23. owlplanner-2025.4.28/src/owlplanner/version.py +0 -1
  24. owlplanner-2025.4.28/tests/test_irmaa.py +0 -58
  25. owlplanner-2025.4.28/ttt.py +0 -13
  26. owlplanner-2025.4.28/ttt2.py +0 -24
  27. owlplanner-2025.4.28/ttt3.py +0 -6
  28. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.devcontainer/devcontainer.json +0 -0
  29. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.flake8 +0 -0
  30. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.gitattributes +0 -0
  31. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.github/workflows/github-actions-runtests.yml +0 -0
  32. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/.gitignore +0 -0
  33. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/INSTALL.md +0 -0
  34. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/LICENSE +0 -0
  35. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/BF01580653.pdf +0 -0
  36. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
  37. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
  38. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
  39. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
  40. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
  41. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
  42. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
  43. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/bv_cvxbook.pdf +0 -0
  44. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/Papers/s10436-006-0062-y.pdf +0 -0
  45. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/USER_GUIDE.md +0 -0
  46. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/README.md +0 -0
  47. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/docker-compose.yml +0 -0
  48. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docker/fastentrypoint.sh +0 -0
  49. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxDef.png +0 -0
  50. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxFree.png +0 -0
  51. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/AD-taxable.png +0 -0
  52. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/Hist_Bequest.png +0 -0
  53. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/Hist_Spending.png +0 -0
  54. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/MC-tutorial2a.png +0 -0
  55. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/MC-tutorial2b.png +0 -0
  56. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/OwlUI.png +0 -0
  57. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/allocations.png +0 -0
  58. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/owl.png +0 -0
  59. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/profile.png +0 -0
  60. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/ratesCorrelations.png +0 -0
  61. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/ratesPlot.png +0 -0
  62. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/savingsPlot.png +0 -0
  63. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/sourcesPlot.png +0 -0
  64. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/spendingPlot.png +0 -0
  65. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/taxIncomePlot.png +0 -0
  66. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/images/taxesPlot.png +0 -0
  67. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/docs/newowl.tex +0 -0
  68. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_jack+jill.toml +0 -0
  69. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_joe.toml +0 -0
  70. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_john+sally.toml +0 -0
  71. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_jon+jane.toml +0 -0
  72. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_kim+sam-bequest.toml +0 -0
  73. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/case_kim+sam-spending.toml +0 -0
  74. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/jack+jill.xlsx +0 -0
  75. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/joe.xlsx +0 -0
  76. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/john+sally.xlsx +0 -0
  77. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/jon+jane.xlsx +0 -0
  78. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/examples/template.xlsx +0 -0
  79. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/john+sally.ipynb +0 -0
  80. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/kim+sam.ipynb +0 -0
  81. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/template.ipynb +0 -0
  82. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_1.ipynb +0 -0
  83. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_2.ipynb +0 -0
  84. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/notebooks/tutorial_3.ipynb +0 -0
  85. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/owlplanner.cmd +0 -0
  86. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/owlplanner.sh +0 -0
  87. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/__init__.py +0 -0
  88. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/config.py +0 -0
  89. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/data/__init__.py +0 -0
  90. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/data/rates.csv +0 -0
  91. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/logging.py +0 -0
  92. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/progress.py +0 -0
  93. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/rates.py +0 -0
  94. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/timelists.py +0 -0
  95. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/src/owlplanner/utils.py +0 -0
  96. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_logger.py +0 -0
  97. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_regressions.py +0 -0
  98. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_toml_cases.py +0 -0
  99. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/tests/test_units.py +0 -0
  100. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Asset_Allocation.py +0 -0
  101. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Create_Case.py +0 -0
  102. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Current_Assets.py +0 -0
  103. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Fixed_Income.py +0 -0
  104. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Graphs.py +0 -0
  105. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Historical_Range.py +0 -0
  106. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Logs.py +0 -0
  107. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Monte_Carlo.py +0 -0
  108. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Output_Files.py +0 -0
  109. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Quick_Start.py +0 -0
  110. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/README.md +0 -0
  111. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Rates_Selection.py +0 -0
  112. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Settings.py +0 -0
  113. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Wages_And_Contributions.py +0 -0
  114. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/Worksheets.py +0 -0
  115. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/main+fonts.py +0 -0
  116. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/main.py +0 -0
  117. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/plots.py +0 -0
  118. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/progress.py +0 -0
  119. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/sskeys.py.color +0 -0
  120. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/style.css +0 -0
  121. {owlplanner-2025.4.28 → owlplanner-2025.5.2}/ui/tomlexamples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.4.28
3
+ Version: 2025.5.2
4
4
  Summary: Owl: 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
@@ -719,8 +719,7 @@ or fixed rates either derived from historical averages, or set by the user.
719
719
 
720
720
  There are a few ways to run Owl:
721
721
 
722
- - Run Owl directly on the Streamlit Community Server at
723
- [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
722
+ - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
724
723
 
725
724
  - Run locally on your computer using a Docker image.
726
725
  Follow these [instructions](docker/README.md) for this option.
@@ -759,8 +758,8 @@ while providing a codebase where they can learn and contribute. There are and we
759
758
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
760
759
  collecting your data, or academic papers that share the results without really sharing the details of
761
760
  the underlying mathematical models.
762
- The algorithms in Owl rely on the open-source HiGHS linear programming solver.
763
- The complete formulation and detailed description of the underlying
761
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
762
+ detailed description of the underlying
764
763
  mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
765
764
 
766
765
  It is anticipated that most end users will use Owl through the graphical interface
@@ -773,18 +772,16 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
773
772
  In particular, if one is interested in comparing different withdrawal strategies,
774
773
  [FI Calc](ficalc.app) is an elegant application that addresses this need.
775
774
  If, however, you also want to optimize spending, bequest, and Roth conversions, with
776
- an approach also considering Medicare costs and federal income tax over the next few years,
775
+ an approach also considering Medicare and federal income tax over the next few years,
777
776
  then Owl is definitely a tool that can help guide your decisions.
778
777
 
779
778
  --------------------------------------------------------------------------------------
780
779
  ## Capabilities
781
- Owl can optimize for either the maximum net spending amount under the constraint
782
- of a given bequest (which can be zero),
780
+ Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
783
781
  or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
784
- under the assumption of a heirs marginal tax rate.
785
- Roth conversions are also considered, subject to an optional maximum Roth conversion amount,
786
- and optimized to suit the goals of the selected objective function, while considering
787
- Medicare costs, and federal income tax under different rates of return assumptions.
782
+ and under the assumption of a heirs marginal tax rate.
783
+ Roth conversions are also considered, subject to an optional maximum conversion amount,
784
+ and optimized to suit the goals of the selected objective function.
788
785
  All calculations are indexed for inflation, which is either provided as a fixed rate,
789
786
  or through historical values, as are all other rates used for the calculations.
790
787
  These rates can be used for backtesting different scenarios by choosing
@@ -842,29 +839,29 @@ which are all tracked separately for married individuals. Asset transition to th
842
839
  is done according to beneficiary fractions for each type of savings account.
843
840
  Tax status covers married filing jointly and single, depending on the number of individuals reported.
844
841
 
845
- Federal income tax, Medicare part B premiums, and IRMAA calculations are part of the optimization.
842
+ Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
846
843
  Future values are simple projections of current values with the assumed inflation rates.
847
844
 
848
845
  ### Limitations
849
846
  Owl is work in progress. At the current time:
850
847
  - Only the US federal income tax is considered (and minimized through the optimization algorithm).
851
848
  Head of household filing status has not been added but can easily be.
852
- - Required minimum distributions are always performed and calculated,
853
- but tables for spouses more than 10 years apart are not included.
849
+ - Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
854
850
  These cases are detected and will generate an error message.
855
851
  - Social security rule for surviving spouse assumes that benefits were taken at full retirement age.
852
+ - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
853
+ If there is interest, that could be added in the future.
856
854
  - In the current implementation, social securiy is always taxed at 85%.
857
- - Medicare calculations require the use of binary variables which add to the computational costs.
858
- I've observed run requiring up to 10 seconds.
859
- These calculations can be turned off when shorter time to solutions are required.
860
- The use of a commercial solver (e.g. MOSEK) can substantially reduce computing time
861
- but require a license.
855
+ - Medicare calculations are done through a self-consistent loop.
856
+ This means that the Medicare premiums are calculated after an initial solution is generated,
857
+ and then a new solution is re-generated with these premiums as a constraint.
858
+ In some situations, when the income (MAGI) is near an IRMAA bracket, oscillatory solutions can arise.
859
+ While the solutions generated are very close to one another, Owl will pick the smallest solution
860
+ for being conservative.
862
861
  - Part D is not included in the IRMAA calculations. Being considerably more significant,
863
862
  only Part B is taken into account.
864
- - Future tax brackets are pure speculations derived from the little we know now and projected
865
- to the next 30 years. Your guesses are as good as mine.
866
- - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
867
- If there is interest, that could be added in the future.
863
+ - Future tax brackets are pure speculations derived from the little we know now and projected to the next 30 years.
864
+ Your guesses are as good as mine.
868
865
 
869
866
  The solution from an optimization algorithm has only two states: feasible and infeasible.
870
867
  Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
@@ -877,8 +874,7 @@ assets to support, even with no estate being left.
877
874
  ---------------------------------------------------------------
878
875
  ## Documentation
879
876
 
880
- - Documentation for the app user interface is available from the interface
881
- [itself](https://owlplanner.streamlit.app/Documentation).
877
+ - Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
882
878
  - Installation guide and software requirements can be found [here](INSTALL.md).
883
879
  - User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
884
880
 
@@ -895,7 +891,7 @@ assets to support, even with no estate being left.
895
891
 
896
892
  ---------------------------------------------------------------------
897
893
 
898
- Copyright © 2025 - Martin-D. Lacasse
894
+ Copyright © 2024 - Martin-D. Lacasse
899
895
 
900
896
  Disclaimers: I am not a financial planner. You make your own decisions.
901
897
  This program comes with no guarantee. Use at your own risk.
@@ -16,8 +16,7 @@ or fixed rates either derived from historical averages, or set by the user.
16
16
 
17
17
  There are a few ways to run Owl:
18
18
 
19
- - Run Owl directly on the Streamlit Community Server at
20
- [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
19
+ - Run Owl directly on the Streamlit Community Server at [owlplanner.streamlit.app](https://owlplanner.streamlit.app).
21
20
 
22
21
  - Run locally on your computer using a Docker image.
23
22
  Follow these [instructions](docker/README.md) for this option.
@@ -56,8 +55,8 @@ while providing a codebase where they can learn and contribute. There are and we
56
55
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
57
56
  collecting your data, or academic papers that share the results without really sharing the details of
58
57
  the underlying mathematical models.
59
- The algorithms in Owl rely on the open-source HiGHS linear programming solver.
60
- The complete formulation and detailed description of the underlying
58
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
59
+ detailed description of the underlying
61
60
  mathematical model can be found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
62
61
 
63
62
  It is anticipated that most end users will use Owl through the graphical interface
@@ -70,18 +69,16 @@ Not every retirement decision strategy can be framed as an easy-to-solve optimiz
70
69
  In particular, if one is interested in comparing different withdrawal strategies,
71
70
  [FI Calc](ficalc.app) is an elegant application that addresses this need.
72
71
  If, however, you also want to optimize spending, bequest, and Roth conversions, with
73
- an approach also considering Medicare costs and federal income tax over the next few years,
72
+ an approach also considering Medicare and federal income tax over the next few years,
74
73
  then Owl is definitely a tool that can help guide your decisions.
75
74
 
76
75
  --------------------------------------------------------------------------------------
77
76
  ## Capabilities
78
- Owl can optimize for either the maximum net spending amount under the constraint
79
- of a given bequest (which can be zero),
77
+ Owl can optimize for either maximum net spending under the constraint of a given bequest (which can be zero),
80
78
  or maximize the after-tax value of a bequest under the constraint of a desired net spending profile,
81
- under the assumption of a heirs marginal tax rate.
82
- Roth conversions are also considered, subject to an optional maximum Roth conversion amount,
83
- and optimized to suit the goals of the selected objective function, while considering
84
- Medicare costs, and federal income tax under different rates of return assumptions.
79
+ and under the assumption of a heirs marginal tax rate.
80
+ Roth conversions are also considered, subject to an optional maximum conversion amount,
81
+ and optimized to suit the goals of the selected objective function.
85
82
  All calculations are indexed for inflation, which is either provided as a fixed rate,
86
83
  or through historical values, as are all other rates used for the calculations.
87
84
  These rates can be used for backtesting different scenarios by choosing
@@ -139,29 +136,29 @@ which are all tracked separately for married individuals. Asset transition to th
139
136
  is done according to beneficiary fractions for each type of savings account.
140
137
  Tax status covers married filing jointly and single, depending on the number of individuals reported.
141
138
 
142
- Federal income tax, Medicare part B premiums, and IRMAA calculations are part of the optimization.
139
+ Medicare and IRMAA calculations are performed through a self-consistent loop on cash flow constraints.
143
140
  Future values are simple projections of current values with the assumed inflation rates.
144
141
 
145
142
  ### Limitations
146
143
  Owl is work in progress. At the current time:
147
144
  - Only the US federal income tax is considered (and minimized through the optimization algorithm).
148
145
  Head of household filing status has not been added but can easily be.
149
- - Required minimum distributions are always performed and calculated,
150
- but tables for spouses more than 10 years apart are not included.
146
+ - Required minimum distributions are calculated, but tables for spouses more than 10 years apart are not included.
151
147
  These cases are detected and will generate an error message.
152
148
  - Social security rule for surviving spouse assumes that benefits were taken at full retirement age.
149
+ - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
150
+ If there is interest, that could be added in the future.
153
151
  - In the current implementation, social securiy is always taxed at 85%.
154
- - Medicare calculations require the use of binary variables which add to the computational costs.
155
- I've observed run requiring up to 10 seconds.
156
- These calculations can be turned off when shorter time to solutions are required.
157
- The use of a commercial solver (e.g. MOSEK) can substantially reduce computing time
158
- but require a license.
152
+ - Medicare calculations are done through a self-consistent loop.
153
+ This means that the Medicare premiums are calculated after an initial solution is generated,
154
+ and then a new solution is re-generated with these premiums as a constraint.
155
+ In some situations, when the income (MAGI) is near an IRMAA bracket, oscillatory solutions can arise.
156
+ While the solutions generated are very close to one another, Owl will pick the smallest solution
157
+ for being conservative.
159
158
  - Part D is not included in the IRMAA calculations. Being considerably more significant,
160
159
  only Part B is taken into account.
161
- - Future tax brackets are pure speculations derived from the little we know now and projected
162
- to the next 30 years. Your guesses are as good as mine.
163
- - Current version has no optimization of asset allocations between individuals and/or types of savings accounts.
164
- If there is interest, that could be added in the future.
160
+ - Future tax brackets are pure speculations derived from the little we know now and projected to the next 30 years.
161
+ Your guesses are as good as mine.
165
162
 
166
163
  The solution from an optimization algorithm has only two states: feasible and infeasible.
167
164
  Therefore, unlike event-driven simulators that can tell you that your distribution strategy runs
@@ -174,8 +171,7 @@ assets to support, even with no estate being left.
174
171
  ---------------------------------------------------------------
175
172
  ## Documentation
176
173
 
177
- - Documentation for the app user interface is available from the interface
178
- [itself](https://owlplanner.streamlit.app/Documentation).
174
+ - Documentation for the app user interface is available from the interface [itself](https://owlplanner.streamlit.app/Documentation).
179
175
  - Installation guide and software requirements can be found [here](INSTALL.md).
180
176
  - User guide for the underlying Python package as used in a Jupyter notebook can be found [here](USER_GUIDE.md).
181
177
 
@@ -192,7 +188,7 @@ assets to support, even with no estate being left.
192
188
 
193
189
  ---------------------------------------------------------------------
194
190
 
195
- Copyright © 2025 - Martin-D. Lacasse
191
+ Copyright © 2024 - Martin-D. Lacasse
196
192
 
197
193
  Disclaimers: I am not a financial planner. You make your own decisions.
198
194
  This program comes with no guarantee. Use at your own risk.
@@ -1,34 +1,34 @@
1
- # docker/Dockerfile
2
-
3
- FROM python:3.13-slim
4
-
5
- WORKDIR /app
6
-
7
- RUN apt-get update; \
8
- apt-get upgrade; \
9
- apt-get install -y --no-install-recommends \
10
- curl \
11
- git \
12
- ; \
13
- rm -rf /var/lib/apt/lists/*
14
-
15
- COPY fastentrypoint.sh /usr/bin/entrypoint.sh
16
-
17
- RUN chmod 555 /usr/bin/entrypoint.sh
18
-
19
- # Build in the container for faster starts.
20
- RUN python -m pip install --no-cache-dir --upgrade pip
21
-
22
- RUN pip install --no-cache-dir build
23
-
24
- RUN git clone --depth 1 https://github.com/mdlacasse/Owl.git owl
25
-
26
- RUN cd /app/owl && python -m build
27
-
28
- RUN cd /app/owl && pip install --no-cache-dir .
29
-
30
- EXPOSE 8501
31
-
32
- HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
33
-
34
- ENTRYPOINT ["/bin/bash", "/usr/bin/entrypoint.sh"]
1
+ # docker/Dockerfile
2
+
3
+ FROM python:3.13-slim
4
+
5
+ WORKDIR /app
6
+
7
+ RUN apt-get update; \
8
+ apt-get upgrade; \
9
+ apt-get install -y --no-install-recommends \
10
+ curl \
11
+ git \
12
+ ; \
13
+ rm -rf /var/lib/apt/lists/*
14
+
15
+ COPY fastentrypoint.sh /usr/bin/entrypoint.sh
16
+
17
+ RUN chmod 555 /usr/bin/entrypoint.sh
18
+
19
+ # Build in the container for faster starts.
20
+ RUN python -m pip install --no-cache-dir --upgrade pip
21
+
22
+ RUN pip install --no-cache-dir build
23
+
24
+ RUN git clone --depth 1 https://github.com/mdlacasse/Owl.git owl
25
+
26
+ RUN cd /app/owl && python -m build
27
+
28
+ RUN cd /app/owl && pip install --no-cache-dir .
29
+
30
+ EXPOSE 8501
31
+
32
+ HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
33
+
34
+ ENTRYPOINT ["/bin/bash", "/usr/bin/entrypoint.sh"]
Binary file