owlplanner 2025.2.19__tar.gz → 2025.2.21__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.2.19 → owlplanner-2025.2.21}/PKG-INFO +1 -1
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/owl.pdf +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/owl.tex +16 -15
- owlplanner-2025.2.21/examples/case_jon+jane.toml +56 -0
- owlplanner-2025.2.21/examples/jon+jane.xlsx +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/pyproject.toml +1 -1
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/config.py +6 -1
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/plan.py +2 -2
- owlplanner-2025.2.21/src/owlplanner/version.py +1 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Quick_Start.py +3 -2
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/owlbridge.py +2 -1
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/requirements.txt +1 -1
- owlplanner-2025.2.19/src/owlplanner/version.py +0 -1
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/.devcontainer/devcontainer.json +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/.flake8 +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/.gitattributes +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/.github/workflows/github-actions-runtests.yml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/.gitignore +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/INSTALL.md +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/LICENSE +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/README.md +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/USER_GUIDE.md +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docker/Dockerfile +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docker/README.md +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docker/docker-compose.yml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docker/fastentrypoint.sh +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/AD-taxDef.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/AD-taxFree.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/AD-taxable.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/Hist_Bequest.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/Hist_Spending.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/MC-tutorial2a.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/MC-tutorial2b.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/OwlUI.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/allocations.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/owl.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/profile.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/ratesCorrelations.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/ratesPlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/savingsPlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/sourcesPlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/spendingPlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/taxIncomePlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/docs/images/taxesPlot.png +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/case_jack+jill.toml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/case_joe.toml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/case_john+sally.toml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/case_kim+sam-bequest.toml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/case_kim+sam-spending.toml +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/jack+jill.xlsx +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/joe.xlsx +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/john+sally.xlsx +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/examples/template.xlsx +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/john+sally.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/kim+sam.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/template.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/tutorial_1.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/tutorial_2.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/notebooks/tutorial_3.ipynb +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/owlplanner.cmd +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/owlplanner.sh +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/requirements.txt +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/__init__.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/abcapi.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/data/__init__.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/data/rates.csv +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/logging.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/progress.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/rates.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/tax2025.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/timelists.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/src/owlplanner/utils.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/tests/test_logger.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/tests/test_regressions.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/tests/test_repro.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/tests/test_toml_cases.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/tests/test_units.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ttt.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/About_Owl.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Asset_Allocation.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Assets.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Create_Case.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Documentation.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Fixed_Income.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Graphs.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Historical_Range.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Logs.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Monte_Carlo.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Optimization_Parameters.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Output_Files.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/README.md +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Rates_Selection.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Settings.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Wages_And_Contributions.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/Worksheets.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/main+fonts.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/main.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/plots.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/progress.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/sskeys.py +0 -0
- {owlplanner-2025.2.19 → owlplanner-2025.2.21}/ui/style.css +0 -0
|
Binary file
|
|
@@ -160,7 +160,8 @@ Parameter values are either set by the user, historical data, or by the tax code
|
|
|
160
160
|
\gamma_n = \prod_{n' = 0}^{n-1} (1 + \tau_{3n'}),
|
|
161
161
|
\end{equation}
|
|
162
162
|
with $\gamma_0 := 1$, and where $n'$ is a dummy index.
|
|
163
|
-
As the time span of interest goes from the first year to the
|
|
163
|
+
As the time span of interest goes from the first year to the beginning
|
|
164
|
+
of the year following the last year,
|
|
164
165
|
variable $\gamma_n$ will have $N_n + 1$ elements.
|
|
165
166
|
Parameters indexed for inflation will be indicated by a bar on top as in $\bar{\sigma}_n$.
|
|
166
167
|
\item [$\sigma_n$]
|
|
@@ -218,7 +219,7 @@ Parameter values are either set by the user, historical data, or by the tax code
|
|
|
218
219
|
brackets are adjusted accordingly.
|
|
219
220
|
\item [$\theta_{tn}$]
|
|
220
221
|
Tax rate for tax bracket $t$ in year $n$. Using $N_t$ time series allows to adjust income
|
|
221
|
-
tax rates in foreseeable future.
|
|
222
|
+
tax rates in the foreseeable future.
|
|
222
223
|
For example, in 2024 the rates (in decimal) are .10, .12, .22, .24, .32, .35, and .37.
|
|
223
224
|
It is speculated that the rates will revert back to 2017 rates in 2026 with
|
|
224
225
|
.10, .15, .25, .28, .33, .35, and .396. See Eq.~(\ref{Eq:IncTax0}) for its use.
|
|
@@ -286,8 +287,8 @@ or an s-curve as in
|
|
|
286
287
|
(e.g., sell a house, inheritance) or negative (e.g., buy a house, large gifts).
|
|
287
288
|
\item [$\pi_{in}$]
|
|
288
289
|
Sum of pension benefits for individual $i$ in year $n$. These amounts are typically
|
|
289
|
-
specified along with the ages at which these benefits begin.
|
|
290
|
-
|
|
290
|
+
specified along with the ages at which these benefits begin. Pensions
|
|
291
|
+
can optionally be indexed for inflation.
|
|
291
292
|
\item [$\zeta_{in}$]
|
|
292
293
|
Social security benefits for individual $i$ in year $n$. Starting age and the passing
|
|
293
294
|
of one individual for spouses will determine the time series. $\bar{\zeta}_{in}$ is
|
|
@@ -298,7 +299,8 @@ or an s-curve as in
|
|
|
298
299
|
for the heirs expressed in today's dollars. See parameter $\nu$ for the heirs tax rate.
|
|
299
300
|
\item [$\kappa_{ijn}$]
|
|
300
301
|
Sum of contributions to savings account $j$ made by individual $i$ during year $n$.
|
|
301
|
-
We assume that contributions are made at half-year to
|
|
302
|
+
We assume that contributions are made at half-year to better represent periodic
|
|
303
|
+
contributions made throughout the year.
|
|
302
304
|
In practice, a contribution
|
|
303
305
|
amount $\kappa_{ijn}$ is specified in which case the contribution to each asset
|
|
304
306
|
class is
|
|
@@ -309,7 +311,7 @@ or an s-curve as in
|
|
|
309
311
|
Sum of wages obtained by individual $i$ during year $n$.
|
|
310
312
|
Do not confuse wages $\omega$ with withdrawals $w$.
|
|
311
313
|
\item [$\mu$]
|
|
312
|
-
Dividend return rate in taxable accounts. Average is little above 2\% for S\&P 500.
|
|
314
|
+
Dividend return rate for equities in taxable accounts. Average is little above 2\% for S\&P 500.
|
|
313
315
|
\item [$\nu$]
|
|
314
316
|
Heirs income tax rate to be applied on the tax-deferred portion of the estate. This is not an estate tax
|
|
315
317
|
but rather the federal income marginal tax rate for the heirs.
|
|
@@ -359,8 +361,8 @@ or an s-curve as in
|
|
|
359
361
|
\label{Eq:IRMAA}
|
|
360
362
|
\mathcal{M}_n = \sum_{iq} z_{iqn} \bar{C}_{qn}.
|
|
361
363
|
\end{equation}
|
|
362
|
-
If the plan
|
|
363
|
-
|
|
364
|
+
If the plan needs data from 1 or 2 years ago as Medicare has already started or will in the next years,
|
|
365
|
+
values for years before current year need to be provided.
|
|
364
366
|
|
|
365
367
|
While this approach has been implemented and tested, the robustness of the {\em big M} approach
|
|
366
368
|
is not guaranteed. Moreover, the introduction of a large number ($5\times N_i\times N_m$,
|
|
@@ -409,7 +411,7 @@ All intermediate variables are in uppercase letters.
|
|
|
409
411
|
|
|
410
412
|
\item [$Q_n$]
|
|
411
413
|
Qualified dividends and long-term capital gains obtained in year $n$.
|
|
412
|
-
They only involve
|
|
414
|
+
They only involve dividends occurring in the taxable savings accounts $(j=0)$ that
|
|
413
415
|
were obtained from equities $(k=0)$, or sales of stocks due to withdrawals
|
|
414
416
|
from taxable savings accounts.
|
|
415
417
|
For simplicity, we assume that all equity sales only generate long-term capital gains and
|
|
@@ -422,10 +424,10 @@ All intermediate variables are in uppercase letters.
|
|
|
422
424
|
A formulation where only a fraction of dividends are qualified can easily be
|
|
423
425
|
implemented with the addition of another parameter.
|
|
424
426
|
Notice that we are using return rates from the previous year.
|
|
425
|
-
The first terms on the right-hand side represent
|
|
426
|
-
|
|
427
|
-
half the yearly contributions. The
|
|
428
|
-
|
|
427
|
+
The first terms on the right-hand side represent dividends generated by
|
|
428
|
+
equities $(k=0)$ in the $(j=0)$ taxable savings account plus
|
|
429
|
+
half the yearly contributions. The second term account for withdrawals $w$
|
|
430
|
+
of equities assumed to have been purchased a year ago.
|
|
429
431
|
It does not account for losses, but a market drop
|
|
430
432
|
would most likely result in stock purchase rather than sale.
|
|
431
433
|
For withdrawals, we make the assumption of
|
|
@@ -605,8 +607,7 @@ add the market returns to the savings balances.
|
|
|
605
607
|
if needed due to RMDs or receiving large sums of money,
|
|
606
608
|
could be made at the end of the year. Let's formulate this approach
|
|
607
609
|
in more detail and investigate for potential problems.
|
|
608
|
-
Timing controls which terms get multiplied by the rate of return $(1 + \
|
|
609
|
-
for a particular asset $k$.
|
|
610
|
+
Timing controls which terms get multiplied by the rate of return $(1 + \mathcal{T}_{ijn})$.
|
|
610
611
|
Therefore, our current choice would yield
|
|
611
612
|
\begin{eqnarray}
|
|
612
613
|
\label{Eq:C3a}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"Plan Name" = "Jon+Jane"
|
|
2
|
+
|
|
3
|
+
["Basic Info"]
|
|
4
|
+
Status = "married"
|
|
5
|
+
Names = [ "Jon", "Jane",]
|
|
6
|
+
"Birth year" = [ 1965, 1968,]
|
|
7
|
+
"Life expectancy" = [ 92, 92,]
|
|
8
|
+
"Start date" = "01-01"
|
|
9
|
+
|
|
10
|
+
[Assets]
|
|
11
|
+
"taxable savings balances" = [ 50.0, 0.0,]
|
|
12
|
+
"tax-deferred savings balances" = [ 900.0, 500.0,]
|
|
13
|
+
"tax-free savings balances" = [ 0.0, 0.0,]
|
|
14
|
+
"Beneficiary fractions" = [ 1.0, 1.0, 1.0,]
|
|
15
|
+
"Spousal surplus deposit fraction" = 0.0
|
|
16
|
+
|
|
17
|
+
["Wages and Contributions"]
|
|
18
|
+
"Contributions file name" = "edited values"
|
|
19
|
+
|
|
20
|
+
["Fixed Income"]
|
|
21
|
+
"Pension amounts" = [ 0.0, 0.0,]
|
|
22
|
+
"Pension ages" = [ 65, 65,]
|
|
23
|
+
"Pension indexed" = [ false, false,]
|
|
24
|
+
"Social security amounts" = [ 21.0, 21.0,]
|
|
25
|
+
"Social security ages" = [ 65, 65,]
|
|
26
|
+
|
|
27
|
+
["Rates Selection"]
|
|
28
|
+
"Heirs rate on tax-deferred estate" = 30.0
|
|
29
|
+
"Long-term capital gain tax rate" = 15.0
|
|
30
|
+
"Dividend tax rate" = 2.0
|
|
31
|
+
"TCJA expiration year" = 2026
|
|
32
|
+
Method = "user"
|
|
33
|
+
Values = [ 10.0, 0.0, 0.0, 3.5000000000000004,]
|
|
34
|
+
From = 1928
|
|
35
|
+
To = 2024
|
|
36
|
+
|
|
37
|
+
["Asset Allocation"]
|
|
38
|
+
"Interpolation method" = "linear"
|
|
39
|
+
"Interpolation center" = 15.0
|
|
40
|
+
"Interpolation width" = 5.0
|
|
41
|
+
Type = "individual"
|
|
42
|
+
generic = [ [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],], [ [ 100, 0, 0, 0,], [ 100, 0, 0, 0,],],]
|
|
43
|
+
|
|
44
|
+
["Optimization Parameters"]
|
|
45
|
+
"Spending profile" = "flat"
|
|
46
|
+
"Surviving spouse spending percent" = 60
|
|
47
|
+
Objective = "maxSpending"
|
|
48
|
+
|
|
49
|
+
["Solver Options"]
|
|
50
|
+
maxRothConversion = 0.0
|
|
51
|
+
noRothConversions = "None"
|
|
52
|
+
withMedicare = true
|
|
53
|
+
bequest = 30.0
|
|
54
|
+
|
|
55
|
+
[Results]
|
|
56
|
+
"Default plots" = "today"
|
|
Binary file
|
|
@@ -180,7 +180,7 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
|
|
|
180
180
|
# status = diconf['Basic Info']['Status']
|
|
181
181
|
yobs = diconf["Basic Info"]["Birth year"]
|
|
182
182
|
expectancy = diconf["Basic Info"]["Life expectancy"]
|
|
183
|
-
startDate = diconf["Basic Info"]
|
|
183
|
+
startDate = diconf["Basic Info"].get("Start date", "today")
|
|
184
184
|
icount = len(yobs)
|
|
185
185
|
s = ["", "s"][icount - 1]
|
|
186
186
|
mylog.vprint(f"Plan for {icount} individual{s}: {inames}.")
|
|
@@ -295,6 +295,11 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
|
|
|
295
295
|
# Solver Options.
|
|
296
296
|
p.solverOptions = diconf["Solver Options"]
|
|
297
297
|
|
|
298
|
+
# Check consistency of noRothConversions.
|
|
299
|
+
name = p.solverOptions.get("noRothConversions", "None")
|
|
300
|
+
if name != "None" and name not in p.inames:
|
|
301
|
+
raise ValueError(f"Unknown name {name} for noRothConversions.")
|
|
302
|
+
|
|
298
303
|
# Results.
|
|
299
304
|
p.setDefaultPlots(diconf["Results"]["Default plots"])
|
|
300
305
|
|
|
@@ -995,7 +995,7 @@ class Plan(object):
|
|
|
995
995
|
self.DeltaBar_tn = self.Delta_tn * self.gamma_n[:-1]
|
|
996
996
|
self.zetaBar_in = self.zeta_in * self.gamma_n[:-1]
|
|
997
997
|
self.xiBar_n = self.xi_n * self.gamma_n[:-1]
|
|
998
|
-
self.piBar_in = self.pi_in
|
|
998
|
+
self.piBar_in = np.array(self.pi_in)
|
|
999
999
|
for i in range(self.N_i):
|
|
1000
1000
|
if self.pensionIndexed[i]:
|
|
1001
1001
|
self.piBar_in[i] *= self.gamma_n[:-1]
|
|
@@ -2895,7 +2895,7 @@ def _stackPlot(x, inames, title, irange, series, snames, location, yformat="\\$k
|
|
|
2895
2895
|
|
|
2896
2896
|
if len(nonzeroSeries) == 0:
|
|
2897
2897
|
# print('Nothing to plot for', title)
|
|
2898
|
-
return None
|
|
2898
|
+
return None, None
|
|
2899
2899
|
|
|
2900
2900
|
fig, ax = plt.subplots(figsize=(6, 4))
|
|
2901
2901
|
plt.grid(visible="both")
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2025.02.21"
|
|
@@ -24,8 +24,9 @@ This file is in *toml* format which is editable with a simple text editor.
|
|
|
24
24
|
time table with anticipated wages, future contributions
|
|
25
25
|
to savings accounts, and anticipated big-ticket items, which can be either expenses or income.
|
|
26
26
|
This file is in Excel or LibreOffice format, and has one tab per individual in the plan.
|
|
27
|
+
If no file is provided, values will default to zero, but these values can be edited in the app.
|
|
27
28
|
|
|
28
|
-
With these two files, a scenario can be created and solved
|
|
29
|
+
With these two files, a scenario can be created and solved with only a few steps. We will use the case
|
|
29
30
|
of Jack and Jill provided here as an example:
|
|
30
31
|
1) Download these two files from the GitHub repository
|
|
31
32
|
(right-click on the link and select `Save link as...`):
|
|
@@ -46,7 +47,7 @@ experiment with different parameters.
|
|
|
46
47
|
|
|
47
48
|
For creating your own cases, you can start
|
|
48
49
|
from scratch by selecting `New Case...` in the selection box while on the **Create Case** page,
|
|
49
|
-
and fill in the information needed on each page
|
|
50
|
+
and fill in the information needed on each page in the `Case Setup` section.
|
|
50
51
|
Once a case has been fully parameterized and successfully optimized,
|
|
51
52
|
its parameters can be saved by using the `Download case file...` button on the `Output Files` page.
|
|
52
53
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2025.02.19"
|
|
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
|