owlplanner 2025.5.1__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.
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/PKG-INFO +1 -1
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docker/Dockerfile +34 -34
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/pyproject.toml +1 -1
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/requirements.txt +1 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/plan.py +6 -2
- owlplanner-2025.5.2/src/owlplanner/version.py +1 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/About_Owl.py +11 -6
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Documentation.py +9 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Optimization_Parameters.py +6 -1
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/requirements.txt +1 -1
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/sskeys.py +1 -1
- owlplanner-2025.5.1/.thediffs.swp +0 -0
- owlplanner-2025.5.1/reponse.txt +0 -20
- owlplanner-2025.5.1/src/owlplanner/version.py +0 -1
- owlplanner-2025.5.1/thediffs +0 -0
- owlplanner-2025.5.1/ttt.py +0 -13
- owlplanner-2025.5.1/ttt2.py +0 -24
- owlplanner-2025.5.1/ttt3.py +0 -6
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/.flake8 +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/.gitattributes +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/.gitignore +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/INSTALL.md +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/LICENSE +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/BF01580653.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/FE00006821-Class-VI-Injection-Permit--Salient-Features-and-Regulatory-Challenges_Final.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/Kou-OptionPricingDouble-2004.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/Multi-Period Mean Expected-Shortfall Strategies Cut Your Losses and Ride Your Gains .pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/Optimal Asset Allocation for Retirement Saving Deterministic Vs. Time Consistent Adaptive Strategies.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/Rule-based_strategies_for_dynamic_life_cycle_inves.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/Snyder-LinearProgrammingSpecial-1984.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/WileyModelBuildinginMathematicalProgramming5th2013.sharethefiles.com.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/bv_cvxbook.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/Papers/s10436-006-0062-y.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/README.md +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/USER_GUIDE.md +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docker/README.md +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/allocations.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/owl.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/profile.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/newowl.tex +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/owl.pdf +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/docs/owl.tex +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_jack+jill.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_joe.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_john+sally.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_jon+jane.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_kim+sam-bequest.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/case_kim+sam-spending.toml +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/joe.xlsx +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/examples/template.xlsx +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/git-cheats +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/owlplanner.cmd +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/owlplanner.sh +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/config.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/tax2025.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/tests/test_logger.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/tests/test_regressions.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/tests/test_repro.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/tests/test_units.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Create_Case.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Current_Assets.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Graphs.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Logs.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Output_Files.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Quick_Start.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/README.md +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Settings.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/Worksheets.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/main+fonts.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/main.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/owlbridge.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/plots.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/progress.py +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/sskeys.py.color +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/style.css +0 -0
- {owlplanner-2025.5.1 → owlplanner-2025.5.2}/ui/tomlexamples.py +0 -0
|
@@ -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"]
|
|
@@ -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)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2025.05.02"
|
|
@@ -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
|
|
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 [
|
|
18
|
+
found in this [document](https://raw.github.com/mdlacasse/Owl/main/docs/owl.pdf).
|
|
20
19
|
|
|
21
|
-
Copyright ©
|
|
20
|
+
Copyright © 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
|
|
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
|
"""
|
|
@@ -277,6 +277,15 @@ the `Roth conv` column on the
|
|
|
277
277
|
A year from which Roth conversions can begin to be considered can also be selected: no Roth
|
|
278
278
|
conversions will be allowed before the year specified.
|
|
279
279
|
|
|
280
|
+
In order to mitigate cases where Roth conversions can only provide marginal gains,
|
|
281
|
+
an opportunity cost can be set for Roth conversions. This value is
|
|
282
|
+
a percentage amount removed from the Roth conversion to compensate for the
|
|
283
|
+
opportunity loss resulting from the payment of estimated income tax.
|
|
284
|
+
This is a heuristical approach
|
|
285
|
+
creating a virtual penalty on conversions resulting in a smaller amount
|
|
286
|
+
being deposited in the tax-exempt account.
|
|
287
|
+
Opportunity cost is configurable from 0 to 5%. Leave to 0% if unsure.
|
|
288
|
+
|
|
280
289
|
Calculations of Medicare and IRMAA can be turned on or off. This will typically speed up
|
|
281
290
|
the calculations by a factor of 2 to 3, which can be useful when running Monte Carlo simulations.
|
|
282
291
|
If the age of individuals makes them eligible for Medicare within the next three years,
|
|
@@ -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
|
-
|
|
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")
|
|
@@ -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
|
owlplanner-2025.5.1/reponse.txt
DELETED
|
@@ -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"
|
owlplanner-2025.5.1/thediffs
DELETED
|
Binary file
|
owlplanner-2025.5.1/ttt.py
DELETED
owlplanner-2025.5.1/ttt2.py
DELETED
|
@@ -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)
|
owlplanner-2025.5.1/ttt3.py
DELETED
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|