owlplanner 2025.11.5__tar.gz → 2025.11.9__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.
Files changed (116) hide show
  1. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/PKG-INFO +13 -8
  2. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/README.md +7 -3
  3. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/RELEASE_NOTES.md +5 -1
  4. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/pyproject.toml +9 -5
  5. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plan.py +2 -2
  6. owlplanner-2025.11.9/src/owlplanner/version.py +1 -0
  7. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Documentation.py +4 -0
  8. owlplanner-2025.11.5/src/owlplanner/version.py +0 -1
  9. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.devcontainer/devcontainer.json +0 -0
  10. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.flake8 +0 -0
  11. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.gitattributes +0 -0
  12. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.github/workflows/github-actions-runtests.yml +0 -0
  13. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.gitignore +0 -0
  14. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.streamlit/config.toml +0 -0
  15. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/.streamlit/fullconfig.toml +0 -0
  16. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/INSTALL.md +0 -0
  17. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/LICENSE +0 -0
  18. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/USER_GUIDE.md +0 -0
  19. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/Dockerfile.bare +0 -0
  20. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/Dockerfile.static +0 -0
  21. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/README.md +0 -0
  22. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/buildentrypoint.sh +0 -0
  23. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/docker-compose.yml +0 -0
  24. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docker/runentrypoint.sh +0 -0
  25. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/AD-taxDef.png +0 -0
  26. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/AD-taxFree.png +0 -0
  27. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/AD-taxable.png +0 -0
  28. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/Hist_Bequest.png +0 -0
  29. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/Hist_Spending.png +0 -0
  30. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/MC-tutorial2a.png +0 -0
  31. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/MC-tutorial2b.png +0 -0
  32. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/OwlUI.png +0 -0
  33. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/allocations.png +0 -0
  34. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/owl.png +0 -0
  35. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/piecewiseConstant.png +0 -0
  36. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/profile.png +0 -0
  37. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/ratesCorrelations.png +0 -0
  38. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/ratesPlot.png +0 -0
  39. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/savingsPlot.png +0 -0
  40. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/sourcesPlot.png +0 -0
  41. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/spendingPlot.png +0 -0
  42. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/taxIncomePlot.png +0 -0
  43. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/images/taxesPlot.png +0 -0
  44. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/owl.pdf +0 -0
  45. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/docs/owl.tex +0 -0
  46. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_drawdowncalc-comparison-1.toml +0 -0
  47. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_jack+jill.toml +0 -0
  48. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_joe.toml +0 -0
  49. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_john+sally.toml +0 -0
  50. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_jon+jane.toml +0 -0
  51. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_kim+sam-bequest.toml +0 -0
  52. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/case_kim+sam-spending.toml +0 -0
  53. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/jack+jill.xlsx +0 -0
  54. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/joe.xlsx +0 -0
  55. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/john+sally.xlsx +0 -0
  56. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/jon+jane.xlsx +0 -0
  57. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/kim+sam.xlsx +0 -0
  58. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/examples/template.xlsx +0 -0
  59. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/john+sally.ipynb +0 -0
  60. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/kim+sam.ipynb +0 -0
  61. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/template.ipynb +0 -0
  62. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/tutorial_1.ipynb +0 -0
  63. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/tutorial_2.ipynb +0 -0
  64. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/notebooks/tutorial_3.ipynb +0 -0
  65. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/owlplanner.cmd +0 -0
  66. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/owlplanner.sh +0 -0
  67. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/pytest.ini +0 -0
  68. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/requirements.txt +0 -0
  69. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/__init__.py +0 -0
  70. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/abcapi.py +0 -0
  71. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/config.py +0 -0
  72. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/data/__init__.py +0 -0
  73. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/data/rates.csv +0 -0
  74. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/mylogging.py +0 -0
  75. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plotting/__init__.py +0 -0
  76. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plotting/base.py +0 -0
  77. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plotting/factory.py +0 -0
  78. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plotting/matplotlib_backend.py +0 -0
  79. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/plotting/plotly_backend.py +0 -0
  80. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/progress.py +0 -0
  81. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/rates.py +0 -0
  82. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/tax2025.py +0 -0
  83. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/tax2026.py +0 -0
  84. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/timelists.py +0 -0
  85. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/src/owlplanner/utils.py +0 -0
  86. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_logger.py +0 -0
  87. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_regressions.py +0 -0
  88. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_repro.py +0 -0
  89. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_toml_cases.py +0 -0
  90. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_ui_asset_allocation.py +0 -0
  91. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_ui_compare_summaries.py +0 -0
  92. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_ui_sskeys.py +0 -0
  93. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/tests/test_units.py +0 -0
  94. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/About_Owl.py +0 -0
  95. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Asset_Allocation.py +0 -0
  96. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Create_Case.py +0 -0
  97. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Current_Assets.py +0 -0
  98. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Fixed_Income.py +0 -0
  99. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Graphs.py +0 -0
  100. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Historical_Range.py +0 -0
  101. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Logs.py +0 -0
  102. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Monte_Carlo.py +0 -0
  103. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Optimization_Parameters.py +0 -0
  104. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Output_Files.py +0 -0
  105. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Quick_Start.py +0 -0
  106. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/README.md +0 -0
  107. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Rates_Selection.py +0 -0
  108. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Settings.py +0 -0
  109. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Wages_and_Contributions.py +0 -0
  110. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/Worksheets.py +0 -0
  111. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/__init__.py +0 -0
  112. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/main.py +0 -0
  113. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/owlbridge.py +0 -0
  114. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/progress.py +0 -0
  115. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/sskeys.py +0 -0
  116. {owlplanner-2025.11.5 → owlplanner-2025.11.9}/ui/tomlexamples.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: owlplanner
3
- Version: 2025.11.5
4
- Summary: Owl: Retirement planner with great wisdom
3
+ Version: 2025.11.9
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
7
7
  Project-URL: Issues, https://github.com/mdlacasse/owl/issues
@@ -684,19 +684,20 @@ License: GNU GENERAL PUBLIC LICENSE
684
684
  Public License instead of this License. But first, please read
685
685
  <https://www.gnu.org/licenses/why-not-lgpl.html>.
686
686
  License-File: LICENSE
687
- Classifier: Development Status :: 4 - Beta
687
+ Classifier: Development Status :: 5 - Production/Stable
688
688
  Classifier: Intended Audience :: End Users/Desktop
689
689
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
690
690
  Classifier: Operating System :: OS Independent
691
691
  Classifier: Programming Language :: Python :: 3
692
692
  Classifier: Topic :: Office/Business :: Financial :: Investment
693
- Requires-Python: >=3.8
693
+ Requires-Python: >=3.10
694
+ Requires-Dist: highspy
694
695
  Requires-Dist: matplotlib
695
696
  Requires-Dist: numpy
696
697
  Requires-Dist: odfpy
697
698
  Requires-Dist: openpyxl
698
699
  Requires-Dist: pandas
699
- Requires-Dist: plotly
700
+ Requires-Dist: plotly>=6.3
700
701
  Requires-Dist: pulp
701
702
  Requires-Dist: scipy
702
703
  Requires-Dist: seaborn
@@ -750,13 +751,17 @@ your strategy under different market assumptions, helping to better understand y
750
751
 
751
752
  -------------------------------------------------------------------------------------
752
753
  ## Purpose and vision
753
- The goal of Owl is to create a free and open-source ecosystem that has cutting-edge optimization capabilities,
754
+ One goal of Owl is to provide a free and open-source ecosystem that has cutting-edge optimization capabilities,
754
755
  allowing for the next generation of Python-literate retirees to experiment with their own financial future
755
- while providing a codebase where they can learn and contribute. There are and were
756
+ while providing a codebase where they can learn and contribute. At the same time, an intuitive and easy-to-use
757
+ user interface based on Streamlit allows a broad set of users to benefit from the application as it only requires basic financial knowledge.
758
+
759
+ There are and were
756
760
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
757
761
  collecting your data, or academic papers that share the results without really sharing the details of
758
762
  the underlying mathematical models.
759
- The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
763
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver and but they have also been ported to
764
+ other platforms such as Mosek and COIN-OR. The complete formulation and
760
765
  detailed description of the underlying
761
766
  mathematical model can be found [here](https://github.com/mdlacasse/Owl/blob/main/docs/owl.pdf).
762
767
 
@@ -44,13 +44,17 @@ your strategy under different market assumptions, helping to better understand y
44
44
 
45
45
  -------------------------------------------------------------------------------------
46
46
  ## Purpose and vision
47
- The goal of Owl is to create a free and open-source ecosystem that has cutting-edge optimization capabilities,
47
+ One goal of Owl is to provide a free and open-source ecosystem that has cutting-edge optimization capabilities,
48
48
  allowing for the next generation of Python-literate retirees to experiment with their own financial future
49
- while providing a codebase where they can learn and contribute. There are and were
49
+ while providing a codebase where they can learn and contribute. At the same time, an intuitive and easy-to-use
50
+ user interface based on Streamlit allows a broad set of users to benefit from the application as it only requires basic financial knowledge.
51
+
52
+ There are and were
50
53
  good retirement optimizers in the recent past, but the vast majority of them are either proprietary platforms
51
54
  collecting your data, or academic papers that share the results without really sharing the details of
52
55
  the underlying mathematical models.
53
- The algorithms in Owl rely on the open-source HiGHS linear programming solver. The complete formulation and
56
+ The algorithms in Owl rely on the open-source HiGHS linear programming solver and but they have also been ported to
57
+ other platforms such as Mosek and COIN-OR. The complete formulation and
54
58
  detailed description of the underlying
55
59
  mathematical model can be found [here](https://github.com/mdlacasse/Owl/blob/main/docs/owl.pdf).
56
60
 
@@ -1,3 +1,8 @@
1
+ ### Version 2025.11.09
2
+ - Moved development status to production/stable in pyproject
3
+ - Made version propagate everywhere needed
4
+ - Added node limit on milp to avoid Streamlit server shutdown on memory consumption
5
+
1
6
  ### Version 2025.11.05
2
7
  - Mentioning Owl as Optimal Wealth Lab
3
8
  - Port to Streamlit 1.50 which broke many widgets
@@ -5,7 +10,6 @@
5
10
  - Rework Docker to smaller Alpine image and fix docs
6
11
 
7
12
  ### Version 2025.07.01
8
-
9
13
  Added:
10
14
  - Settings option for menu position thanks to Streamlit 1.46 top and sidebar capabilities. Default is top.
11
15
  - Net Investment Income Tax calculations in self-consistent loop.
@@ -2,20 +2,23 @@
2
2
  requires = ["hatchling"]
3
3
  build-backend = "hatchling.build"
4
4
 
5
+ [tool.hatch.version]
6
+ path = "src/owlplanner/version.py"
7
+
5
8
  [project]
6
9
  name = "owlplanner"
7
- version = "2025.11.05"
10
+ dynamic = ["version"]
8
11
  authors = [
9
12
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
10
13
  ]
11
14
  maintainers = [
12
15
  { name="Martin-D. Lacasse", email="martin.d.lacasse@gmail.com" },
13
16
  ]
14
- description = "Owl: Retirement planner with great wisdom"
17
+ description = "Owl - Optimal Wealth Lab: Retirement planner with great wisdom"
15
18
  readme = "README.md"
16
- requires-python = ">=3.8"
19
+ requires-python = ">=3.10"
17
20
  classifiers = [
18
- "Development Status :: 4 - Beta",
21
+ "Development Status :: 5 - Production/Stable",
19
22
  "Programming Language :: Python :: 3",
20
23
  "Intended Audience :: End Users/Desktop",
21
24
  "Topic :: Office/Business :: Financial :: Investment",
@@ -24,12 +27,13 @@ classifiers = [
24
27
  "Programming Language :: Python :: 3",
25
28
  ]
26
29
  dependencies = [
30
+ "highspy",
27
31
  "matplotlib",
28
32
  "numpy",
29
33
  "odfpy",
30
34
  "openpyxl",
31
35
  "pandas",
32
- "plotly",
36
+ "plotly>=6.3",
33
37
  "pulp",
34
38
  "seaborn",
35
39
  "scipy",
@@ -1669,7 +1669,7 @@ class Plan(object):
1669
1669
  self.prevMAGI = np.zeros(2)
1670
1670
  if "previousMAGIs" in myoptions:
1671
1671
  magi = myoptions["previousMAGIs"]
1672
- if 3 < len(magi) < 2:
1672
+ if len(magi) != 2:
1673
1673
  raise ValueError("previousMAGIs must have 2 values.")
1674
1674
 
1675
1675
  self.prevMAGI = self.optionsUnits * np.array(magi)
@@ -1786,7 +1786,7 @@ class Plan(object):
1786
1786
  "disp": False,
1787
1787
  "mip_rel_gap": 1e-7,
1788
1788
  "presolve": True,
1789
- # "node_limit": 10000 # Limit search nodes for faster solutions
1789
+ "node_limit": 1000000 # Limit search nodes for faster solutions
1790
1790
  }
1791
1791
 
1792
1792
  self._buildConstraints(objective, options)
@@ -0,0 +1 @@
1
+ __version__ = "2025.11.09"
@@ -20,6 +20,10 @@ with col1:
20
20
  The goal of Owl is to provide a free and open-source ecosystem that has cutting-edge
21
21
  optimization capabilities, allowing for the new generation of computer-literate retirees
22
22
  to experiment with their own financial future while providing a codebase where they can learn and contribute.
23
+ At the same time, Streamlit provides an intuitive and easy-to-use
24
+ interface which allows a broad set of users to benefit from the application
25
+ as it only requires basic financial knowledge.
26
+
23
27
  Strictly speaking, Owl is not a planning tool, but more an environment for exploring *what if* scenarios.
24
28
  It provides different realizations of a financial strategy through the rigorous
25
29
  mathematical optimization of relevant decision variables. Using a linear programming approach,
@@ -1 +0,0 @@
1
- __version__ = "2025.11.05"
File without changes
File without changes