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 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 original amount.
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: # Past of future is now or in the future: use variables and parameters.
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
- cgains *= Tau1
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 - it can be withdrawn but not the gains.
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
- # If a contribution, it has no penalty, but assume a conversion.
1180
- # rhs += (cgains - 1) * self.kappa_ijn[i, 2, nn] + cgains * self.myRothX_in[i, nn]
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.03"
1
+ __version__ = "2025.12.05"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.12.3
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=NgrzZPWvxV9lMWfLLilVdxY4QdswZjuOjxgPR8CgSHA,117522
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=4vemu4v7aVVvv0jXrGPQlk_6PPXwT_p-wdqdrbPl7QI,28
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.3.dist-info/METADATA,sha256=V7_0-bsuSMQqs1wsbMAVxMcY3bg2gAwjs3z9Fm139Mk,55234
22
- owlplanner-2025.12.3.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
23
- owlplanner-2025.12.3.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
24
- owlplanner-2025.12.3.dist-info/RECORD,,
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,,