owlplanner 2025.5.1__tar.gz → 2025.5.3__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 (120) hide show
  1. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/PKG-INFO +1 -1
  2. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docker/Dockerfile +34 -34
  3. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/pyproject.toml +1 -1
  4. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/requirements.txt +1 -0
  5. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/plan.py +8 -3
  6. owlplanner-2025.5.3/src/owlplanner/version.py +1 -0
  7. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/About_Owl.py +11 -6
  8. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Optimization_Parameters.py +6 -1
  9. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/requirements.txt +1 -1
  10. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/sskeys.py +1 -1
  11. owlplanner-2025.5.1/.thediffs.swp +0 -0
  12. owlplanner-2025.5.1/reponse.txt +0 -20
  13. owlplanner-2025.5.1/src/owlplanner/version.py +0 -1
  14. owlplanner-2025.5.1/thediffs +0 -0
  15. owlplanner-2025.5.1/ttt.py +0 -13
  16. owlplanner-2025.5.1/ttt2.py +0 -24
  17. owlplanner-2025.5.1/ttt3.py +0 -6
  18. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/.devcontainer/devcontainer.json +0 -0
  19. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/.flake8 +0 -0
  20. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/.gitattributes +0 -0
  21. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/.github/workflows/github-actions-runtests.yml +0 -0
  22. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/.gitignore +0 -0
  23. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/INSTALL.md +0 -0
  24. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/LICENSE +0 -0
  25. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/BF01580653.pdf +0 -0
  26. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
  27. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
  28. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
  29. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
  30. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
  31. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
  32. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
  33. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/bv_cvxbook.pdf +0 -0
  34. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/Papers/s10436-006-0062-y.pdf +0 -0
  35. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/README.md +0 -0
  36. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/USER_GUIDE.md +0 -0
  37. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docker/README.md +0 -0
  38. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docker/docker-compose.yml +0 -0
  39. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docker/fastentrypoint.sh +0 -0
  40. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/AD-taxDef.png +0 -0
  41. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/AD-taxFree.png +0 -0
  42. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/AD-taxable.png +0 -0
  43. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/Hist_Bequest.png +0 -0
  44. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/Hist_Spending.png +0 -0
  45. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/MC-tutorial2a.png +0 -0
  46. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/MC-tutorial2b.png +0 -0
  47. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/OwlUI.png +0 -0
  48. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/allocations.png +0 -0
  49. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/owl.png +0 -0
  50. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/profile.png +0 -0
  51. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/ratesCorrelations.png +0 -0
  52. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/ratesPlot.png +0 -0
  53. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/savingsPlot.png +0 -0
  54. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/sourcesPlot.png +0 -0
  55. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/spendingPlot.png +0 -0
  56. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/taxIncomePlot.png +0 -0
  57. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/images/taxesPlot.png +0 -0
  58. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/newowl.tex +0 -0
  59. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/owl.pdf +0 -0
  60. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/docs/owl.tex +0 -0
  61. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_jack+jill.toml +0 -0
  62. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_joe.toml +0 -0
  63. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_john+sally.toml +0 -0
  64. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_jon+jane.toml +0 -0
  65. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_kim+sam-bequest.toml +0 -0
  66. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/case_kim+sam-spending.toml +0 -0
  67. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/jack+jill.xlsx +0 -0
  68. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/joe.xlsx +0 -0
  69. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/john+sally.xlsx +0 -0
  70. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/jon+jane.xlsx +0 -0
  71. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/examples/template.xlsx +0 -0
  72. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/git-cheats +0 -0
  73. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/john+sally.ipynb +0 -0
  74. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/kim+sam.ipynb +0 -0
  75. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/template.ipynb +0 -0
  76. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/tutorial_1.ipynb +0 -0
  77. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/tutorial_2.ipynb +0 -0
  78. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/notebooks/tutorial_3.ipynb +0 -0
  79. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/owlplanner.cmd +0 -0
  80. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/owlplanner.sh +0 -0
  81. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/__init__.py +0 -0
  82. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/abcapi.py +0 -0
  83. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/config.py +0 -0
  84. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/data/__init__.py +0 -0
  85. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/data/rates.csv +0 -0
  86. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/logging.py +0 -0
  87. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/progress.py +0 -0
  88. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/rates.py +0 -0
  89. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/tax2025.py +0 -0
  90. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/timelists.py +0 -0
  91. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/src/owlplanner/utils.py +0 -0
  92. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/tests/test_logger.py +0 -0
  93. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/tests/test_regressions.py +0 -0
  94. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/tests/test_repro.py +0 -0
  95. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/tests/test_toml_cases.py +0 -0
  96. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/tests/test_units.py +0 -0
  97. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Asset_Allocation.py +0 -0
  98. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Create_Case.py +0 -0
  99. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Current_Assets.py +0 -0
  100. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Documentation.py +0 -0
  101. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Fixed_Income.py +0 -0
  102. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Graphs.py +0 -0
  103. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Historical_Range.py +0 -0
  104. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Logs.py +0 -0
  105. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Monte_Carlo.py +0 -0
  106. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Output_Files.py +0 -0
  107. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Quick_Start.py +0 -0
  108. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/README.md +0 -0
  109. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Rates_Selection.py +0 -0
  110. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Settings.py +0 -0
  111. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Wages_And_Contributions.py +0 -0
  112. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/Worksheets.py +0 -0
  113. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/main+fonts.py +0 -0
  114. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/main.py +0 -0
  115. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/owlbridge.py +0 -0
  116. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/plots.py +0 -0
  117. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/progress.py +0 -0
  118. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/sskeys.py.color +0 -0
  119. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/style.css +0 -0
  120. {owlplanner-2025.5.1 → owlplanner-2025.5.3}/ui/tomlexamples.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.5.1
3
+ Version: 2025.5.3
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
@@ -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"]
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "owlplanner"
7
- version = "2025.05.01"
7
+ version = "2025.05.03"
8
8
  authors = [
9
9
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
10
10
  ]
@@ -4,6 +4,7 @@ seaborn
4
4
  pandas
5
5
  openpyxl
6
6
  odfpy
7
+ pulp
7
8
  scipy
8
9
  streamlit
9
10
  toml
@@ -377,7 +377,7 @@ class Plan(object):
377
377
  refdate = date.today()
378
378
  self.startDate = refdate.strftime("%Y-%m-%d")
379
379
  else:
380
- mydatelist = mydate.split("-")
380
+ mydatelist = mydate.replace("/", "-").split("-")
381
381
  if len(mydatelist) == 2 or len(mydatelist) == 3:
382
382
  self.startDate = mydate
383
383
  # Ignore the year provided.
@@ -1081,6 +1081,9 @@ class Plan(object):
1081
1081
  spLo = 1 - self.lambdha
1082
1082
  spHi = 1 + self.lambdha
1083
1083
 
1084
+ oppCostX = options.get("oppCostX", 0.)
1085
+ xnet = 1 - oppCostX/100.
1086
+
1084
1087
  tau_ijn = np.zeros((Ni, Nj, Nn))
1085
1088
  for i in range(Ni):
1086
1089
  for j in range(Nj):
@@ -1277,7 +1280,7 @@ class Plan(object):
1277
1280
  row.addElem(_q2(Cd, i, n, Ni, Nn), -fac1 * u.krond(j, 0) * Tau1_ijn[i, 0, n])
1278
1281
  row.addElem(
1279
1282
  _q2(Cx, i, n, Ni, Nn),
1280
- -fac1 * (u.krond(j, 2) - u.krond(j, 1)) * Tau1_ijn[i, j, n],
1283
+ -fac1 * (xnet*u.krond(j, 2) - u.krond(j, 1)) * Tau1_ijn[i, j, n],
1281
1284
  )
1282
1285
 
1283
1286
  if Ni == 2 and n_d < Nn and i == i_s and n == n_d - 1:
@@ -1288,7 +1291,7 @@ class Plan(object):
1288
1291
  row.addElem(_q2(Cd, i_d, n, Ni, Nn), -fac2 * u.krond(j, 0) * Tau1_ijn[i_d, 0, n])
1289
1292
  row.addElem(
1290
1293
  _q2(Cx, i_d, n, Ni, Nn),
1291
- -fac2 * (u.krond(j, 2) - u.krond(j, 1)) * Tau1_ijn[i_d, j, n],
1294
+ -fac2 * (xnet*u.krond(j, 2) - u.krond(j, 1)) * Tau1_ijn[i_d, j, n],
1292
1295
  )
1293
1296
  A.addRow(row, rhs, rhs)
1294
1297
 
@@ -1655,6 +1658,7 @@ class Plan(object):
1655
1658
  "startRothConversions",
1656
1659
  "units",
1657
1660
  "withMedicare",
1661
+ "oppCostX",
1658
1662
  ]
1659
1663
  # We might modify options if required.
1660
1664
  myoptions = dict(options)
@@ -1761,6 +1765,7 @@ class Plan(object):
1761
1765
  self.mylog.vprint("WARNING: Exiting loop on maximum iterations.")
1762
1766
  break
1763
1767
 
1768
+ it += 1
1764
1769
  old_solutions.append(-solution)
1765
1770
  old_x = xx
1766
1771
 
@@ -0,0 +1 @@
1
+ __version__ = "2025.05.03"
@@ -12,23 +12,24 @@ st.write(f"This is Owl version {owb.version()} running on Streamlit {st.__versio
12
12
 
13
13
  st.write(
14
14
  """
15
- - Owl is released under GPL Licence through a publicly available
16
- repository on [GitHub](https://github.com/mdlacasse/owl).
17
-
15
+ - Owl is an open-source retirement planner capable of optimization through linear programming.
16
+ - Source code is available from a repository on [GitHub](https://github.com/mdlacasse/owl).
18
17
  - Mathematical formulation of the linear optimization problem can be
19
- found [here](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
18
+ found in this [document](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
20
19
 
21
- Copyright &copy; 2024 - Martin-D. Lacasse
20
+ Copyright &copy; 2025 - Martin-D. Lacasse
22
21
 
23
22
  #### :orange[Credits]
24
23
  - Historical rates are from [Aswath Damodaran](https://pages.stern.nyu.edu/~adamodar/).
25
- - Linear programming optimization solver is from [HiGHS](https://highs.dev).
24
+ - Linear programming optimization solvers are from
25
+ [HiGHS](https://highs.dev) and [PuLP](https://coin-or.github.io/pulp/).
26
26
  - Owl planner relies on the following [Python](https://python.org) packages:
27
27
  - [Matplotlib](https://matplotlib.org),
28
28
  [Numpy](https://numpy.org),
29
29
  [odfpy](https://https://pypi.org/project/odfpy),
30
30
  [openpyxl](https://openpyxl.readthedocs.io),
31
31
  [Pandas](https://pandas.pydata.org),
32
+ [PuLP](https://coin-or.github.io/pulp),
32
33
  [Scipy](https://scipy.org),
33
34
  [Seaborn](https://seaborn.pydata.org),
34
35
  [toml](https://toml.io),
@@ -48,6 +49,10 @@ or directly by [email](mailto://martin.d.lacasse@gmail.com).
48
49
  after a session is closed. You can choose to download selected parts of your
49
50
  own data to your computer before closing the session.
50
51
 
52
+ #### :orange[License]
53
+ - This software is released under the
54
+ [Gnu General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html#license-text).
55
+
51
56
  #### :orange[Disclaimer]
52
57
  - This program is provided for educational purposes and comes with no guarantee. Use at your own risk.
53
58
  """
@@ -52,6 +52,10 @@ else:
52
52
  kz.initKey("maxRothConversion", 50)
53
53
  ret = kz.getNum("Maximum annual Roth conversion (\\$k)", "maxRothConversion", disabled=fromFile, help=helpmsg)
54
54
  ret = kz.getToggle("Convert as in wages and contributions tables", "readRothX")
55
+ # kz.initKey("oppCostX", 0.)
56
+ # helpmsg = "Estimated opportunity cost for paying estimated tax on Roth conversions."
57
+ # ret = kz.getNum("Opportunity cost for conversion (%)", "oppCostX", step=0.01, format="%.2f",
58
+ # min_value=0., max_value=5., help=helpmsg)
55
59
 
56
60
  with col2:
57
61
  helpmsg = "Do not perform Roth conversions before that year."
@@ -88,7 +92,8 @@ else:
88
92
  if owb.hasMOSEK():
89
93
  choices += ["MOSEK"]
90
94
  kz.initKey("solver", choices[0])
91
- ret = kz.getRadio("Linear programming solver", choices, "solver")
95
+ helpmsg = "Select different solvers for comparison purposes. Use HiGHS for best performance."
96
+ ret = kz.getRadio("Linear programming solver", choices, "solver", help=helpmsg)
92
97
 
93
98
  st.divider()
94
99
  st.write("##### Spending Profile")
@@ -8,4 +8,4 @@ pulp
8
8
  scipy
9
9
  streamlit
10
10
  toml
11
- owlplanner >= 2025.05.01
11
+ owlplanner >= 2025.05.03
@@ -364,7 +364,7 @@ def getSolveParameters():
364
364
 
365
365
  options = {}
366
366
  optList = ["netSpending", "maxRothConversion", "noRothConversions", "startRothConversions",
367
- "withMedicare", "bequest", "solver", "spendingSlack"]
367
+ "withMedicare", "bequest", "solver", "spendingSlack", "oppCostX"]
368
368
  for opt in optList:
369
369
  val = getKey(opt)
370
370
  if val is not None:
Binary file
@@ -1,20 +0,0 @@
1
-
2
- Hi Mike,
3
-
4
- Thank you so much for the income tax preparation. I have a few questions after reviewing the return:
5
-
6
- - Roth conversion was made as an in-plan conversion from a 401k to a Roth-401k. Do we still need form 8606?
7
- - Out of curiosity, Roth conversion was for $240,000.00 with 0.79 deamed coming from a designated Roth contribution. Why was the $1 been added as a taxable item in statement 4? This is a minor point (and therefore can stay as is). Just curiosity as I said.
8
- - How do I pay your fees?
9
-
10
- Questions for the future:
11
- - You mentioned that the 2023 filing has to be corrected. Is it to my benefit or against it?
12
- - I am planning to stop my consulting job at the end of May. Would it still be worth creating a Corporation for 5 months?
13
- - I will probably move to FL later this year (I was in Atlanta for my daughter - she will likely move to CA shortly). I am planning to perform another large Roth conversion this year (preventing large RMDs). I will need your advice as to when to proceed.
14
-
15
-
16
- I submitted signed form 8879 through your portal.
17
-
18
- Thanks again,
19
-
20
- Martin
@@ -1 +0,0 @@
1
- __version__ = "2025.05.01"
Binary file
@@ -1,13 +0,0 @@
1
- import streamlit as st
2
- from streamlit_extras.let_it_rain import rain
3
-
4
- def example():
5
- rain(
6
- # emoji="🦉",
7
- emoji="🦩",
8
- font_size=48,
9
- falling_speed=5,
10
- animation_length=1,
11
- )
12
-
13
- example()
@@ -1,24 +0,0 @@
1
- import streamlit as st
2
- from streamlit_theme import st_theme
3
-
4
- header = st.container()
5
- with header:
6
- # Print the entire theme dictionary
7
- st.write("Getting theme settings...")
8
-
9
- # Get the current theme
10
- current_theme = st_theme()
11
-
12
- if current_theme:
13
- print(current_theme)
14
- else:
15
- print('Got none', current_theme)
16
-
17
- # Check if the theme is dark or light
18
- # if current_theme["isDark"]:
19
- # st.write("Current theme is dark")
20
- # else:
21
- # st.write("Current theme is light")
22
-
23
- # Print the entire theme dictionary
24
- st.write("Current theme settings:", current_theme)
@@ -1,6 +0,0 @@
1
- import streamlit as st
2
-
3
- bc = st.get_option("theme.backgroundColor")
4
- tc = st.get_option("theme.textColor")
5
-
6
- st.write(f"text color is {tc} with background color {bc}")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes