owlplanner 2025.12.3__py3-none-any.whl → 2025.12.5__py3-none-any.whl
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/plan.py +9 -8
- owlplanner/version.py +1 -1
- {owlplanner-2025.12.3.dist-info → owlplanner-2025.12.5.dist-info}/METADATA +1 -1
- {owlplanner-2025.12.3.dist-info → owlplanner-2025.12.5.dist-info}/RECORD +6 -6
- {owlplanner-2025.12.3.dist-info → owlplanner-2025.12.5.dist-info}/WHEEL +0 -0
- {owlplanner-2025.12.3.dist-info → owlplanner-2025.12.5.dist-info}/licenses/LICENSE +0 -0
owlplanner/plan.py
CHANGED
|
@@ -1160,25 +1160,26 @@ class Plan(object):
|
|
|
1160
1160
|
h = self.horizons[i]
|
|
1161
1161
|
for n in range(h):
|
|
1162
1162
|
rhs = 0
|
|
1163
|
-
# To add compounded gains to
|
|
1163
|
+
# To add compounded gains to cumulative amounts. Always keep cgains >= 1.
|
|
1164
1164
|
cgains = 1
|
|
1165
1165
|
row = self.A.newRow()
|
|
1166
1166
|
row.addElem(_q3(self.C["b"], i, 2, n, self.N_i, self.N_j, self.N_n + 1), 1)
|
|
1167
1167
|
row.addElem(_q3(self.C["w"], i, 2, n, self.N_i, self.N_j, self.N_n), -1)
|
|
1168
1168
|
for dn in range(1, 6):
|
|
1169
1169
|
nn = n - dn
|
|
1170
|
-
if nn >= 0:
|
|
1170
|
+
if nn >= 0: # Past of future is now or in the future: use variables or parameters.
|
|
1171
1171
|
Tau1 = 1 + np.sum(self.alpha_ijkn[i, 2, :, nn] * self.tau_kn[:, nn], axis=0)
|
|
1172
|
-
|
|
1172
|
+
# Ignore market downs.
|
|
1173
|
+
cgains *= max(1, Tau1)
|
|
1173
1174
|
row.addElem(_q2(self.C["x"], i, nn, self.N_i, self.N_n), -cgains)
|
|
1174
|
-
# If a contribution
|
|
1175
|
+
# If a contribution, it has only penalty on gains, not on deposited amount.
|
|
1175
1176
|
rhs += (cgains - 1) * self.kappa_ijn[i, 2, nn]
|
|
1176
1177
|
else: # Past of future is in the past:
|
|
1177
|
-
# Parameters are stored at the end of contributions and conversions arrays.
|
|
1178
1178
|
cgains *= oldTau1
|
|
1179
|
-
#
|
|
1180
|
-
#
|
|
1181
|
-
rhs += cgains * self.kappa_ijn[i, 2, nn] + cgains * self.myRothX_in[i, nn]
|
|
1179
|
+
# Past years are stored at the end of contributions and conversions arrays.
|
|
1180
|
+
# Use negative index to access tail of array.
|
|
1181
|
+
rhs += (cgains - 1) * self.kappa_ijn[i, 2, nn] + cgains * self.myRothX_in[i, nn]
|
|
1182
|
+
# rhs += cgains * self.kappa_ijn[i, 2, nn] + cgains * self.myRothX_in[i, nn]
|
|
1182
1183
|
|
|
1183
1184
|
self.A.addRow(row, rhs, np.inf)
|
|
1184
1185
|
|
owlplanner/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "2025.12.
|
|
1
|
+
__version__ = "2025.12.05"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: owlplanner
|
|
3
|
-
Version: 2025.12.
|
|
3
|
+
Version: 2025.12.5
|
|
4
4
|
Summary: Owl - Optimal Wealth Lab: Retirement planner with great wisdom
|
|
5
5
|
Project-URL: HomePage, https://github.com/mdlacasse/owl
|
|
6
6
|
Project-URL: Repository, https://github.com/mdlacasse/owl
|
|
@@ -2,7 +2,7 @@ owlplanner/__init__.py,sha256=hJ2i4m2JpHPAKyQLjYOXpJzeEsgcTcKD-Vhm0AIjjWg,592
|
|
|
2
2
|
owlplanner/abcapi.py,sha256=rtg7d0UbftinokR9VlB49VUjDjzUq3ONnJbhMXVIrgo,6879
|
|
3
3
|
owlplanner/config.py,sha256=bEO5-QAy_rXjzTIJFEIFSfFSdELbJUDp4mRyU2wRBvA,12790
|
|
4
4
|
owlplanner/mylogging.py,sha256=OVGeDFO7LIZG91R6HMpZBzjno-B8PH8Fo00Jw2Pdgqw,2558
|
|
5
|
-
owlplanner/plan.py,sha256=
|
|
5
|
+
owlplanner/plan.py,sha256=FCtiG60AfdvgcUQgnQ4N2KlFXl6T0xC1pdyj9-GGwgY,117597
|
|
6
6
|
owlplanner/progress.py,sha256=dUUlFmSAKUei36rUj2BINRY10f_YEUo_e23d0es6nrc,530
|
|
7
7
|
owlplanner/rates.py,sha256=9Nmo8AKsyi5PoCUrzhr06phkSlNTv-TXzj5iYFU76AY,14113
|
|
8
8
|
owlplanner/socialsecurity.py,sha256=ODxJ7QqHomzKVVlCPMNa-H8ywOcEk8ktyyDJ2MDrMxo,2195
|
|
@@ -10,7 +10,7 @@ owlplanner/tax2025.py,sha256=4KYaT6TO6WU7wDjgdRW48lqfwvVCtaXs9tcw1nleKhg,10834
|
|
|
10
10
|
owlplanner/tax2026.py,sha256=hgCiCJWVzJITk0cA8W-zxl-a0kObijPZ1yXc0F6MAwk,10848
|
|
11
11
|
owlplanner/timelists.py,sha256=UdzH6A_-w4REn4A1po7yndSiy1R8_R-i_C-94re4JYY,4093
|
|
12
12
|
owlplanner/utils.py,sha256=afAjeO6Msf6Rn4jwz_7Ody9rHGWlBR7iQFqe1xzLNQc,2513
|
|
13
|
-
owlplanner/version.py,sha256=
|
|
13
|
+
owlplanner/version.py,sha256=tIESH6G3DgWFtRScfgtDIL48ULuRpQ0KcMjAFDHJ1D8,28
|
|
14
14
|
owlplanner/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
15
15
|
owlplanner/data/rates.csv,sha256=6fxg56BVVORrj9wJlUGFdGXKvOX5r7CSca8uhUbbuIU,3734
|
|
16
16
|
owlplanner/plotting/__init__.py,sha256=uhxqtUi0OI-QWNOO2LkXgQViW_9yM3rYb-204Wit974,250
|
|
@@ -18,7 +18,7 @@ owlplanner/plotting/base.py,sha256=UimGKpMTV-dVm3BX5Apr_Ltorc7dlDLCRPRQ3RF_v7c,2
|
|
|
18
18
|
owlplanner/plotting/factory.py,sha256=EDopIAPQr9zHRgemObko18FlCeRNhNCoLNNFAOq-X6s,1030
|
|
19
19
|
owlplanner/plotting/matplotlib_backend.py,sha256=AOEkapD94U5hGNoS0EdbRoe8mgdMHH4oOvkXADZS914,17957
|
|
20
20
|
owlplanner/plotting/plotly_backend.py,sha256=AO33GxBHGYG5osir_H1iRRtGxdhs4AjfLV2d_xm35nY,33138
|
|
21
|
-
owlplanner-2025.12.
|
|
22
|
-
owlplanner-2025.12.
|
|
23
|
-
owlplanner-2025.12.
|
|
24
|
-
owlplanner-2025.12.
|
|
21
|
+
owlplanner-2025.12.5.dist-info/METADATA,sha256=S8mJrqS-nw6cS91G6jOtK6kkN-xGvDKnMEwpBRv1LPs,55234
|
|
22
|
+
owlplanner-2025.12.5.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
23
|
+
owlplanner-2025.12.5.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
24
|
+
owlplanner-2025.12.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|