freealg 0.7.11__tar.gz → 0.7.12__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 (66) hide show
  1. {freealg-0.7.11 → freealg-0.7.12}/PKG-INFO +2 -1
  2. {freealg-0.7.11 → freealg-0.7.12}/freealg/__init__.py +2 -2
  3. freealg-0.7.12/freealg/__version__.py +1 -0
  4. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/__init__.py +2 -1
  5. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_constraints.py +53 -12
  6. freealg-0.7.12/freealg/_algebraic_form/_decompress.py +641 -0
  7. freealg-0.7.12/freealg/_algebraic_form/_decompress2.py +204 -0
  8. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_edge.py +46 -68
  9. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_homotopy.py +62 -30
  10. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_moments.py +44 -57
  11. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/algebraic_form.py +143 -29
  12. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/__init__.py +3 -1
  13. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_deformed_marchenko_pastur.py +51 -0
  14. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_deformed_wigner.py +44 -0
  15. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/PKG-INFO +2 -1
  16. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/requires.txt +1 -0
  17. {freealg-0.7.11 → freealg-0.7.12}/requirements.txt +2 -1
  18. freealg-0.7.11/freealg/__version__.py +0 -1
  19. freealg-0.7.11/freealg/_algebraic_form/_decompress.py +0 -692
  20. freealg-0.7.11/freealg/_algebraic_form/_decompress2.py +0 -86
  21. {freealg-0.7.11 → freealg-0.7.12}/AUTHORS.txt +0 -0
  22. {freealg-0.7.11 → freealg-0.7.12}/CHANGELOG.rst +0 -0
  23. {freealg-0.7.11 → freealg-0.7.12}/LICENSE.txt +0 -0
  24. {freealg-0.7.11 → freealg-0.7.12}/MANIFEST.in +0 -0
  25. {freealg-0.7.11 → freealg-0.7.12}/README.rst +0 -0
  26. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_branch_points.py +0 -0
  27. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_continuation_algebraic.py +0 -0
  28. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_sheets_util.py +0 -0
  29. {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_support.py +0 -0
  30. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/__init__.py +0 -0
  31. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_chebyshev.py +0 -0
  32. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_damp.py +0 -0
  33. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_decompress.py +0 -0
  34. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_density_util.py +0 -0
  35. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_jacobi.py +0 -0
  36. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_linalg.py +0 -0
  37. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_pade.py +0 -0
  38. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_plot_util.py +0 -0
  39. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_sample.py +0 -0
  40. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_series.py +0 -0
  41. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_support.py +0 -0
  42. {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/free_form.py +0 -0
  43. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/__init__.py +0 -0
  44. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_continuation_genus0.py +0 -0
  45. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_continuation_genus1.py +0 -0
  46. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_elliptic_functions.py +0 -0
  47. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_sphere_maps.py +0 -0
  48. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_torus_maps.py +0 -0
  49. {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/geometric_form.py +0 -0
  50. {freealg-0.7.11 → freealg-0.7.12}/freealg/_util.py +0 -0
  51. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_chiral_block.py +0 -0
  52. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_kesten_mckay.py +0 -0
  53. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_marchenko_pastur.py +0 -0
  54. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_meixner.py +0 -0
  55. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_wachter.py +0 -0
  56. {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_wigner.py +0 -0
  57. {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/__init__.py +0 -0
  58. {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/_glue_util.py +0 -0
  59. {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/_rgb_hsv.py +0 -0
  60. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/SOURCES.txt +0 -0
  61. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/dependency_links.txt +0 -0
  62. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/not-zip-safe +0 -0
  63. {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/top_level.txt +0 -0
  64. {freealg-0.7.11 → freealg-0.7.12}/pyproject.toml +0 -0
  65. {freealg-0.7.11 → freealg-0.7.12}/setup.cfg +0 -0
  66. {freealg-0.7.11 → freealg-0.7.12}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freealg
3
- Version: 0.7.11
3
+ Version: 0.7.12
4
4
  Summary: Free probability for large matrices
5
5
  Home-page: https://github.com/ameli/freealg
6
6
  Download-URL: https://github.com/ameli/freealg/archive/main.zip
@@ -37,6 +37,7 @@ Requires-Dist: matplotlib
37
37
  Requires-Dist: colorcet
38
38
  Requires-Dist: statsmodels
39
39
  Requires-Dist: numba
40
+ Requires-Dist: tqdm
40
41
  Provides-Extra: test
41
42
  Requires-Dist: tox; extra == "test"
42
43
  Requires-Dist: pytest-cov; extra == "test"
@@ -8,13 +8,13 @@
8
8
 
9
9
  from ._free_form import FreeForm, eigvalsh, cond, norm, trace, slogdet, supp, \
10
10
  sample, kde
11
- from ._algebraic_form import AlgebraicForm
11
+ from ._algebraic_form import AlgebraicForm, decompress_newton
12
12
  from ._geometric_form import GeometricForm
13
13
  from . import visualization
14
14
  from . import distributions
15
15
 
16
16
  __all__ = ['FreeForm', 'distributions', 'visualization', 'eigvalsh', 'cond',
17
17
  'norm', 'trace', 'slogdet', 'supp', 'sample', 'kde',
18
- 'AlgebraicForm', 'GeometricForm']
18
+ 'AlgebraicForm', 'GeometricForm', 'decompress_newton']
19
19
 
20
20
  from .__version__ import __version__ # noqa: F401 E402
@@ -0,0 +1 @@
1
+ __version__ = "0.7.12"
@@ -7,5 +7,6 @@
7
7
  # directory of this source tree.
8
8
 
9
9
  from .algebraic_form import AlgebraicForm
10
+ from ._decompress7 import decompress_newton
10
11
 
11
- __all__ = ['AlgebraicForm']
12
+ __all__ = ['AlgebraicForm', 'decompress_newton']
@@ -1,4 +1,3 @@
1
-
2
1
  # SPDX-FileCopyrightText: Copyright 2025, Siavash Ameli <sameli@berkeley.edu>
3
2
  # SPDX-License-Identifier: BSD-3-Clause
4
3
  # SPDX-FileType: SOURCE
@@ -54,15 +53,61 @@ def _series_pow(mser, j, q_max):
54
53
  # build moment constraints matrix
55
54
  # ===============================
56
55
 
56
+ # def build_moment_constraint_matrix(pairs, deg_z, s, mu):
57
+ #
58
+ # mu = numpy.asarray(mu, dtype=float).ravel()
59
+ # if mu.size == 0:
60
+ # return numpy.zeros((0, len(pairs)), dtype=float)
61
+ #
62
+ # # m(z) = -sum_{p>=0} mu_p / z^{p+1}; t = 1/z so m(t) = -sum mu_p t^{p+1}
63
+ # r = mu.size - 1
64
+ # q_max = r
65
+ #
66
+ # mser = numpy.zeros(q_max + 1, dtype=float)
67
+ # for p in range(mu.size):
68
+ # q = p + 1
69
+ # if q <= q_max:
70
+ # mser[q] = -float(mu[p])
71
+ #
72
+ # # Precompute (m(t))^j coefficients up to t^{q_max}
73
+ # mpow = []
74
+ # for j in range(s + 1):
75
+ # mpow.append(_series_pow(mser, j, q_max))
76
+ #
77
+ # # Constraints: coeff of t^q in Q(t) := t^{deg_z} P(1/t, m(t)) must be 0
78
+ # # Q(t) = sum_{i,j} c_{i,j} * t^{deg_z - i} * (m(t))^j
79
+ # n_coef = len(pairs)
80
+ # B = numpy.zeros((q_max + 1, n_coef), dtype=float)
81
+ #
82
+ # for k, (i, j) in enumerate(pairs):
83
+ # shift = deg_z - i
84
+ # if shift < 0:
85
+ # continue
86
+ # mj = mpow[j]
87
+ # for q in range(q_max + 1):
88
+ # qq = q - shift
89
+ # if 0 <= qq <= q_max:
90
+ # B[q, k] = mj[qq]
91
+ #
92
+ # # Drop all-zero rows (can happen if index-set can't support higher
93
+ # # moments)
94
+ # row_norm = numpy.linalg.norm(B, axis=1)
95
+ # keep = row_norm > 0.0
96
+ # B = B[keep, :]
97
+ #
98
+ # return B
99
+
57
100
  def build_moment_constraint_matrix(pairs, deg_z, s, mu):
58
101
 
59
102
  mu = numpy.asarray(mu, dtype=float).ravel()
60
103
  if mu.size == 0:
61
104
  return numpy.zeros((0, len(pairs)), dtype=float)
62
105
 
63
- # m(z) = -sum_{p>=0} mu_p / z^{p+1}; t = 1/z so m(t) = -sum mu_p t^{p+1}
106
+ # mu has entries mu_0..mu_r
64
107
  r = mu.size - 1
65
- q_max = r
108
+
109
+ # Need t^{r+1} in m(t) = -sum mu_p t^{p+1}, otherwise mu_0 is dropped.
110
+ q_max = r + 1
66
111
 
67
112
  mser = numpy.zeros(q_max + 1, dtype=float)
68
113
  for p in range(mu.size):
@@ -70,29 +115,25 @@ def build_moment_constraint_matrix(pairs, deg_z, s, mu):
70
115
  if q <= q_max:
71
116
  mser[q] = -float(mu[p])
72
117
 
73
- # Precompute (m(t))^j coefficients up to t^{q_max}
74
118
  mpow = []
75
119
  for j in range(s + 1):
76
120
  mpow.append(_series_pow(mser, j, q_max))
77
121
 
78
- # Constraints: coeff of t^q in Q(t) := t^{deg_z} P(1/t, m(t)) must be 0
79
- # Q(t) = sum_{i,j} c_{i,j} * t^{deg_z - i} * (m(t))^j
80
122
  n_coef = len(pairs)
81
- B = numpy.zeros((q_max + 1, n_coef), dtype=float)
123
+
124
+ # We only want constraints for l=0..r -> that's q = 0..r in Q(t)
125
+ B = numpy.zeros((r + 1, n_coef), dtype=float)
82
126
 
83
127
  for k, (i, j) in enumerate(pairs):
84
128
  shift = deg_z - i
85
129
  if shift < 0:
86
130
  continue
87
131
  mj = mpow[j]
88
- for q in range(q_max + 1):
132
+ for q in range(r + 1):
89
133
  qq = q - shift
90
134
  if 0 <= qq <= q_max:
91
135
  B[q, k] = mj[qq]
92
136
 
93
- # Drop all-zero rows (can happen if index-set can't support higher moments)
94
137
  row_norm = numpy.linalg.norm(B, axis=1)
95
138
  keep = row_norm > 0.0
96
- B = B[keep, :]
97
-
98
- return B
139
+ return B[keep, :]