owlplanner 2025.2.22__py3-none-any.whl → 2025.2.23__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/config.py CHANGED
@@ -19,7 +19,7 @@ from owlplanner import logging
19
19
  from owlplanner.rates import FROM, TO
20
20
 
21
21
 
22
- def saveConfig(plan, file, mylog):
22
+ def saveConfig(myplan, file, mylog):
23
23
  """
24
24
  Save case parameters and return a dictionary containing all parameters.
25
25
  """
@@ -27,87 +27,87 @@ def saveConfig(plan, file, mylog):
27
27
  accountTypes = ["taxable", "tax-deferred", "tax-free"]
28
28
 
29
29
  diconf = {}
30
- diconf["Plan Name"] = plan._name
31
- diconf["Description"] = plan._description
30
+ diconf["Plan Name"] = myplan._name
31
+ diconf["Description"] = myplan._description
32
32
 
33
33
  # Basic Info.
34
34
  diconf["Basic Info"] = {
35
- "Status": ["unknown", "single", "married"][plan.N_i],
36
- "Names": plan.inames,
37
- "Birth year": plan.yobs.tolist(),
38
- "Life expectancy": plan.expectancy.tolist(),
39
- "Start date": plan.startDate,
35
+ "Status": ["unknown", "single", "married"][myplan.N_i],
36
+ "Names": myplan.inames,
37
+ "Birth year": myplan.yobs.tolist(),
38
+ "Life expectancy": myplan.expectancy.tolist(),
39
+ "Start date": myplan.startDate,
40
40
  }
41
41
 
42
42
  # Assets.
43
43
  diconf["Assets"] = {}
44
- for j in range(plan.N_j):
45
- amounts = plan.beta_ij[:, j] / 1000
44
+ for j in range(myplan.N_j):
45
+ amounts = myplan.beta_ij[:, j] / 1000
46
46
  diconf["Assets"][f"{accountTypes[j]} savings balances"] = amounts.tolist()
47
- if plan.N_i == 2:
48
- diconf["Assets"]["Beneficiary fractions"] = plan.phi_j.tolist()
49
- diconf["Assets"]["Spousal surplus deposit fraction"] = plan.eta
47
+ if myplan.N_i == 2:
48
+ diconf["Assets"]["Beneficiary fractions"] = myplan.phi_j.tolist()
49
+ diconf["Assets"]["Spousal surplus deposit fraction"] = myplan.eta
50
50
 
51
51
  # Wages and Contributions.
52
- diconf["Wages and Contributions"] = {"Contributions file name": plan.timeListsFileName}
52
+ diconf["Wages and Contributions"] = {"Contributions file name": myplan.timeListsFileName}
53
53
 
54
54
  # Fixed Income.
55
55
  diconf["Fixed Income"] = {
56
- "Pension amounts": (plan.pensionAmounts / 1000).tolist(),
57
- "Pension ages": plan.pensionAges.tolist(),
58
- "Pension indexed": plan.pensionIndexed,
59
- "Social security amounts": (plan.ssecAmounts / 1000).tolist(),
60
- "Social security ages": plan.ssecAges.tolist(),
56
+ "Pension amounts": (myplan.pensionAmounts / 1000).tolist(),
57
+ "Pension ages": myplan.pensionAges.tolist(),
58
+ "Pension indexed": myplan.pensionIndexed,
59
+ "Social security amounts": (myplan.ssecAmounts / 1000).tolist(),
60
+ "Social security ages": myplan.ssecAges.tolist(),
61
61
  }
62
62
 
63
63
  # Rates Selection.
64
64
  diconf["Rates Selection"] = {
65
- "Heirs rate on tax-deferred estate": float(100 * plan.nu),
66
- "Long-term capital gain tax rate": float(100 * plan.psi),
67
- "Dividend tax rate": float(100 * plan.mu),
68
- "TCJA expiration year": plan.yTCJA,
69
- "Method": plan.rateMethod,
65
+ "Heirs rate on tax-deferred estate": float(100 * myplan.nu),
66
+ "Long-term capital gain tax rate": float(100 * myplan.psi),
67
+ "Dividend tax rate": float(100 * myplan.mu),
68
+ "TCJA expiration year": myplan.yTCJA,
69
+ "Method": myplan.rateMethod,
70
70
  }
71
- if plan.rateMethod in ["user", "stochastic"]:
72
- diconf["Rates Selection"]["Values"] = (100 * plan.rateValues).tolist()
73
- if plan.rateMethod in ["stochastic"]:
74
- diconf["Rates Selection"]["Standard deviations"] = (100 * plan.rateStdev).tolist()
75
- diconf["Rates Selection"]["Correlations"] = plan.rateCorr.tolist()
76
- if plan.rateMethod in ["historical average", "historical", "histochastic"]:
77
- diconf["Rates Selection"]["From"] = int(plan.rateFrm)
78
- diconf["Rates Selection"]["To"] = int(plan.rateTo)
71
+ if myplan.rateMethod in ["user", "stochastic"]:
72
+ diconf["Rates Selection"]["Values"] = (100 * myplan.rateValues).tolist()
73
+ if myplan.rateMethod in ["stochastic"]:
74
+ diconf["Rates Selection"]["Standard deviations"] = (100 * myplan.rateStdev).tolist()
75
+ diconf["Rates Selection"]["Correlations"] = myplan.rateCorr.tolist()
76
+ if myplan.rateMethod in ["historical average", "historical", "histochastic"]:
77
+ diconf["Rates Selection"]["From"] = int(myplan.rateFrm)
78
+ diconf["Rates Selection"]["To"] = int(myplan.rateTo)
79
79
  else:
80
80
  diconf["Rates Selection"]["From"] = int(FROM)
81
81
  diconf["Rates Selection"]["To"] = int(TO)
82
82
 
83
83
  # Asset Allocation.
84
84
  diconf["Asset Allocation"] = {
85
- "Interpolation method": plan.interpMethod,
86
- "Interpolation center": float(plan.interpCenter),
87
- "Interpolation width": float(plan.interpWidth),
88
- "Type": plan.ARCoord,
85
+ "Interpolation method": myplan.interpMethod,
86
+ "Interpolation center": float(myplan.interpCenter),
87
+ "Interpolation width": float(myplan.interpWidth),
88
+ "Type": myplan.ARCoord,
89
89
  }
90
- if plan.ARCoord == "account":
90
+ if myplan.ARCoord == "account":
91
91
  for accType in accountTypes:
92
- diconf["Asset Allocation"][accType] = plan.boundsAR[accType]
92
+ diconf["Asset Allocation"][accType] = myplan.boundsAR[accType]
93
93
  else:
94
- diconf["Asset Allocation"]["generic"] = plan.boundsAR["generic"]
94
+ diconf["Asset Allocation"]["generic"] = myplan.boundsAR["generic"]
95
95
 
96
96
  # Optimization Parameters.
97
97
  diconf["Optimization Parameters"] = {
98
- "Spending profile": plan.spendingProfile,
99
- "Surviving spouse spending percent": int(100 * plan.chi),
98
+ "Spending profile": myplan.spendingProfile,
99
+ "Surviving spouse spending percent": int(100 * myplan.chi),
100
100
  }
101
- if plan.spendingProfile == "smile":
102
- diconf["Optimization Parameters"]["Smile dip"] = int(plan.smileDip)
103
- diconf["Optimization Parameters"]["Smile increase"] = int(plan.smileIncrease)
104
- diconf["Optimization Parameters"]["Smile delay"] = int(plan.smileDelay)
101
+ if myplan.spendingProfile == "smile":
102
+ diconf["Optimization Parameters"]["Smile dip"] = int(myplan.smileDip)
103
+ diconf["Optimization Parameters"]["Smile increase"] = int(myplan.smileIncrease)
104
+ diconf["Optimization Parameters"]["Smile delay"] = int(myplan.smileDelay)
105
105
 
106
- diconf["Optimization Parameters"]["Objective"] = plan.objective
107
- diconf["Solver Options"] = plan.solverOptions
106
+ diconf["Optimization Parameters"]["Objective"] = myplan.objective
107
+ diconf["Solver Options"] = myplan.solverOptions
108
108
 
109
109
  # Results.
110
- diconf["Results"] = {"Default plots": plan.defaultPlots}
110
+ diconf["Results"] = {"Default plots": myplan.defaultPlots}
111
111
 
112
112
  if isinstance(file, str):
113
113
  filename = file
@@ -186,7 +186,7 @@ def readConfig(file, *, verbose=True, logstreams=None, readContributions=True):
186
186
  s = ["", "s"][icount - 1]
187
187
  mylog.vprint(f"Plan for {icount} individual{s}: {inames}.")
188
188
  p = plan.Plan(inames, yobs, expectancy, name, startDate=startDate, verbose=True, logstreams=logstreams)
189
- plan._description = diconf.get("Description", "")
189
+ p._description = diconf.get("Description", "")
190
190
 
191
191
  # Assets.
192
192
  balances = {}
owlplanner/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "2025.02.22"
1
+ __version__ = "2025.02.23"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.2.22
3
+ Version: 2025.2.23
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,6 +1,6 @@
1
1
  owlplanner/__init__.py,sha256=QqrdT0Qks20osBTg7h0vJHAxpP9lL7DA99xb0nYbtw4,254
2
2
  owlplanner/abcapi.py,sha256=LbzW_KcNy0IeHp42MUHwGu_H67B2h_e1_vu-c2ACTkQ,6646
3
- owlplanner/config.py,sha256=yoi9dTpA-BVCPnbcDwPWO8dkTDFeMft4KRvuqZepzxA,12164
3
+ owlplanner/config.py,sha256=bvqoOWrdPrWYQF9-PS_n00MoyZkAsmMOSczhTUFRGVU,12257
4
4
  owlplanner/logging.py,sha256=tYMw04O-XYSzjTj36fmKJGLcE1VkK6k6oJNeqtKXzuc,2530
5
5
  owlplanner/plan.py,sha256=RTkIT5tJ_Ar0hCBx0G1ScjaGLuxdsRDqwWC1eosp5po,113860
6
6
  owlplanner/progress.py,sha256=8jlCvvtgDI89zXVNMBg1-lnEyhpPvKQS2X5oAIpoOVQ,384
@@ -8,10 +8,10 @@ owlplanner/rates.py,sha256=TN407qU4n-bac1oymkQ_n2QKEPwFQxy6JZVGwgIkLQU,15585
8
8
  owlplanner/tax2025.py,sha256=B-A5eU3wxdcAaxRCbT3qI-JEKoD_ZeNbg_86XhNdQEI,7745
9
9
  owlplanner/timelists.py,sha256=tYieZU67FT6TCcQQis36JaXGI7dT6NqD7RvdEjgJL4M,4026
10
10
  owlplanner/utils.py,sha256=HM70W60qB41zfnbl2LltNwAuLYHyy5XYbwnbNcaa6FE,2351
11
- owlplanner/version.py,sha256=9rZICePFVRaLH3DbBPmhbkwGMbL4PJlxOgWYgOrbcGw,28
11
+ owlplanner/version.py,sha256=85qxkfG2OiCeMaWpV6ROXWN2-KYejMXo-QU_lI_mUOM,28
12
12
  owlplanner/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  owlplanner/data/rates.csv,sha256=6fxg56BVVORrj9wJlUGFdGXKvOX5r7CSca8uhUbbuIU,3734
14
- owlplanner-2025.2.22.dist-info/METADATA,sha256=nl-Se08p2SfUG8NbbeHQslxuaRA-VWKBvkAlI2vpid0,53506
15
- owlplanner-2025.2.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- owlplanner-2025.2.22.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
17
- owlplanner-2025.2.22.dist-info/RECORD,,
14
+ owlplanner-2025.2.23.dist-info/METADATA,sha256=SfUn8ugA-N7NDg2XhNt0oBQOSbCi2GqARxGIqkYAMc8,53506
15
+ owlplanner-2025.2.23.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ owlplanner-2025.2.23.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
17
+ owlplanner-2025.2.23.dist-info/RECORD,,