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.
- {freealg-0.7.11 → freealg-0.7.12}/PKG-INFO +2 -1
- {freealg-0.7.11 → freealg-0.7.12}/freealg/__init__.py +2 -2
- freealg-0.7.12/freealg/__version__.py +1 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/__init__.py +2 -1
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_constraints.py +53 -12
- freealg-0.7.12/freealg/_algebraic_form/_decompress.py +641 -0
- freealg-0.7.12/freealg/_algebraic_form/_decompress2.py +204 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_edge.py +46 -68
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_homotopy.py +62 -30
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_moments.py +44 -57
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/algebraic_form.py +143 -29
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/__init__.py +3 -1
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_deformed_marchenko_pastur.py +51 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_deformed_wigner.py +44 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/PKG-INFO +2 -1
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/requires.txt +1 -0
- {freealg-0.7.11 → freealg-0.7.12}/requirements.txt +2 -1
- freealg-0.7.11/freealg/__version__.py +0 -1
- freealg-0.7.11/freealg/_algebraic_form/_decompress.py +0 -692
- freealg-0.7.11/freealg/_algebraic_form/_decompress2.py +0 -86
- {freealg-0.7.11 → freealg-0.7.12}/AUTHORS.txt +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/CHANGELOG.rst +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/LICENSE.txt +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/MANIFEST.in +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/README.rst +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_branch_points.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_continuation_algebraic.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_sheets_util.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_algebraic_form/_support.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/__init__.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_chebyshev.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_damp.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_decompress.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_density_util.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_jacobi.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_linalg.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_pade.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_plot_util.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_sample.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_series.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/_support.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_free_form/free_form.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/__init__.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_continuation_genus0.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_continuation_genus1.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_elliptic_functions.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_sphere_maps.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/_torus_maps.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_geometric_form/geometric_form.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/_util.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_chiral_block.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_kesten_mckay.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_marchenko_pastur.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_meixner.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_wachter.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/distributions/_wigner.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/__init__.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/_glue_util.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg/visualization/_rgb_hsv.py +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/SOURCES.txt +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/dependency_links.txt +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/not-zip-safe +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/freealg.egg-info/top_level.txt +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/pyproject.toml +0 -0
- {freealg-0.7.11 → freealg-0.7.12}/setup.cfg +0 -0
- {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.
|
|
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"
|
|
@@ -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
|
-
#
|
|
106
|
+
# mu has entries mu_0..mu_r
|
|
64
107
|
r = mu.size - 1
|
|
65
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
return B
|
|
139
|
+
return B[keep, :]
|