freealg 0.3.1__tar.gz → 0.3.3__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 (36) hide show
  1. {freealg-0.3.1 → freealg-0.3.3}/PKG-INFO +30 -15
  2. {freealg-0.3.1 → freealg-0.3.3}/README.rst +20 -14
  3. freealg-0.3.3/freealg/__version__.py +1 -0
  4. {freealg-0.3.1 → freealg-0.3.3}/freealg/_support.py +1 -1
  5. {freealg-0.3.1 → freealg-0.3.3}/freealg/eigh.py +58 -29
  6. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/PKG-INFO +30 -15
  7. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/requires.txt +1 -0
  8. {freealg-0.3.1 → freealg-0.3.3}/setup.py +13 -0
  9. freealg-0.3.1/freealg/__version__.py +0 -1
  10. {freealg-0.3.1 → freealg-0.3.3}/AUTHORS.txt +0 -0
  11. {freealg-0.3.1 → freealg-0.3.3}/CHANGELOG.rst +0 -0
  12. {freealg-0.3.1 → freealg-0.3.3}/LICENSE.txt +0 -0
  13. {freealg-0.3.1 → freealg-0.3.3}/MANIFEST.in +0 -0
  14. {freealg-0.3.1 → freealg-0.3.3}/freealg/__init__.py +0 -0
  15. {freealg-0.3.1 → freealg-0.3.3}/freealg/_chebyshev.py +0 -0
  16. {freealg-0.3.1 → freealg-0.3.3}/freealg/_damp.py +0 -0
  17. {freealg-0.3.1 → freealg-0.3.3}/freealg/_decompress.py +0 -0
  18. {freealg-0.3.1 → freealg-0.3.3}/freealg/_jacobi.py +0 -0
  19. {freealg-0.3.1 → freealg-0.3.3}/freealg/_pade.py +0 -0
  20. {freealg-0.3.1 → freealg-0.3.3}/freealg/_plot_util.py +0 -0
  21. {freealg-0.3.1 → freealg-0.3.3}/freealg/_sample.py +0 -0
  22. {freealg-0.3.1 → freealg-0.3.3}/freealg/_util.py +0 -0
  23. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/__init__.py +0 -0
  24. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/_kesten_mckay.py +0 -0
  25. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/_marchenko_pastur.py +0 -0
  26. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/_meixner.py +0 -0
  27. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/_wachter.py +0 -0
  28. {freealg-0.3.1 → freealg-0.3.3}/freealg/distributions/_wigner.py +0 -0
  29. {freealg-0.3.1 → freealg-0.3.3}/freealg/freeform.py +0 -0
  30. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/SOURCES.txt +0 -0
  31. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/dependency_links.txt +0 -0
  32. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/not-zip-safe +0 -0
  33. {freealg-0.3.1 → freealg-0.3.3}/freealg.egg-info/top_level.txt +0 -0
  34. {freealg-0.3.1 → freealg-0.3.3}/pyproject.toml +0 -0
  35. {freealg-0.3.1 → freealg-0.3.3}/requirements.txt +0 -0
  36. {freealg-0.3.1 → freealg-0.3.3}/setup.cfg +0 -0
@@ -1,7 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freealg
3
- Version: 0.3.1
3
+ Version: 0.3.3
4
4
  Summary: Free probability for large matrices
5
+ Home-page: https://github.com/ameli/freealg
6
+ Download-URL: https://github.com/ameli/freealg/archive/main.zip
7
+ Project-URL: Documentation, https://ameli.github.io/freealg
8
+ Project-URL: Source, https://github.com/ameli/freealg
9
+ Project-URL: Tracker, https://github.com/ameli/freealg/issues
5
10
  Keywords: linalg,free-probability
6
11
  Platform: Linux
7
12
  Platform: OSX
@@ -54,33 +59,42 @@ Requires-Dist: sphinx-gallery; extra == "docs"
54
59
  Requires-Dist: sphinxcontrib-youtube; extra == "docs"
55
60
  Requires-Dist: sphinxext-opengraph; extra == "docs"
56
61
  Requires-Dist: sphinx-argparse; extra == "docs"
62
+ Requires-Dist: sphinx-sitemap; extra == "docs"
57
63
  Dynamic: classifier
58
64
  Dynamic: description
59
65
  Dynamic: description-content-type
66
+ Dynamic: download-url
67
+ Dynamic: home-page
60
68
  Dynamic: keywords
61
69
  Dynamic: license-file
62
70
  Dynamic: platform
71
+ Dynamic: project-url
63
72
  Dynamic: provides-extra
64
73
  Dynamic: requires-dist
65
74
  Dynamic: requires-python
66
75
  Dynamic: summary
67
76
 
68
- .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
77
+ .. .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
78
+ .. :align: left
79
+ .. :width: 240
80
+ .. :class: custom-dark
81
+
82
+ .. figure:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
69
83
  :align: left
70
84
  :width: 240
71
- :class: custom-dark
72
85
 
73
86
  `Paper <https://arxiv.org/abs/2506.11994>`__ |
74
87
  `Slides <https://www.dropbox.com/scl/fi/03gjuyz17k9yhsqy0isoz/free_decomporession_slides.pdf?rlkey=8f82mhciyl2ju02l7hv1md5li&st=26xmhjga&dl=0>`__ |
75
88
  `Docs <https://ameli.github.io/freealg>`__ |
76
- `Live Demo <https://ameli.github.io/freealg/jlite/lab/index.html?path=quick_start.ipynb>`__
89
+ `Live Demo <https://colab.research.google.com/github/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__
77
90
 
78
91
  .. `Slides <https://ameli.github.io/freealg/_static/data/slides.pdf>`__ |
79
92
 
80
- *freealg* is a Python package that employs **free** probability to evaluate the spectral
81
- densities of large matrix **form**\ s. The fundamental algorithm employed by *freealg* is
82
- **free decompression**, which extrapolates from the empirical spectral densities of small
83
- submatrices to infer the eigenspectrum of extremely large matrices.
93
+ *freealg* is a Python package that employs **free** probability to evaluate the
94
+ spectral densities of large matrix **form**\ s. The fundamental algorithm
95
+ employed by *freealg* is **free decompression**, which extrapolates from the
96
+ empirical spectral densities of small submatrices to infer the eigenspectrum
97
+ of extremely large matrices.
84
98
 
85
99
  Install
86
100
  =======
@@ -106,8 +120,8 @@ Documentation is available at `ameli.github.io/freealg <https://ameli.github.io/
106
120
  Quick Usage
107
121
  ===========
108
122
 
109
- The following code estimates the eigenvalues of a very large Wishart matrix using a much
110
- smaller Wishart matrix.
123
+ The following code estimates the eigenvalues of a very large Wishart matrix
124
+ using a much smaller Wishart matrix.
111
125
 
112
126
  .. code-block:: python
113
127
 
@@ -116,7 +130,8 @@ smaller Wishart matrix.
116
130
  >>> A = mp.matrix(1000) # Sample a 1000 x 1000 Wishart matrix
117
131
  >>> eigs = fa.eigfree(A, 100_000) # Estimate the eigenvalues of 100000 x 100000
118
132
 
119
- For more details on how to interface with *freealg* check out the `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
133
+ For more details on how to interface with *freealg* check out the
134
+ `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
120
135
 
121
136
 
122
137
  Test
@@ -140,14 +155,14 @@ How to Contribute
140
155
  =================
141
156
 
142
157
  We welcome contributions via GitHub's pull request. Developers should review
143
- our [Contributing Guidelines](CONTRIBUTING.rst) before submitting their code.
144
- If you do not feel comfortable modifying the code, we also welcome feature
145
- requests and bug reports.
158
+ our [Contributing Guidelines](https://github.com/ameli/freealg/blob/main/CONTRIBUTING.rst)
159
+ before submitting their code. If you do not feel comfortable modifying the
160
+ code, we also welcome feature requests and bug reports.
146
161
 
147
162
  How to Cite
148
163
  ===========
149
164
 
150
- If you use this work, please cite the `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
165
+ If you use this work, please cite our `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
151
166
 
152
167
  .. code::
153
168
 
@@ -1,19 +1,24 @@
1
- .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
1
+ .. .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
2
+ .. :align: left
3
+ .. :width: 240
4
+ .. :class: custom-dark
5
+
6
+ .. figure:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
2
7
  :align: left
3
8
  :width: 240
4
- :class: custom-dark
5
9
 
6
10
  `Paper <https://arxiv.org/abs/2506.11994>`__ |
7
11
  `Slides <https://www.dropbox.com/scl/fi/03gjuyz17k9yhsqy0isoz/free_decomporession_slides.pdf?rlkey=8f82mhciyl2ju02l7hv1md5li&st=26xmhjga&dl=0>`__ |
8
12
  `Docs <https://ameli.github.io/freealg>`__ |
9
- `Live Demo <https://ameli.github.io/freealg/jlite/lab/index.html?path=quick_start.ipynb>`__
13
+ `Live Demo <https://colab.research.google.com/github/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__
10
14
 
11
15
  .. `Slides <https://ameli.github.io/freealg/_static/data/slides.pdf>`__ |
12
16
 
13
- *freealg* is a Python package that employs **free** probability to evaluate the spectral
14
- densities of large matrix **form**\ s. The fundamental algorithm employed by *freealg* is
15
- **free decompression**, which extrapolates from the empirical spectral densities of small
16
- submatrices to infer the eigenspectrum of extremely large matrices.
17
+ *freealg* is a Python package that employs **free** probability to evaluate the
18
+ spectral densities of large matrix **form**\ s. The fundamental algorithm
19
+ employed by *freealg* is **free decompression**, which extrapolates from the
20
+ empirical spectral densities of small submatrices to infer the eigenspectrum
21
+ of extremely large matrices.
17
22
 
18
23
  Install
19
24
  =======
@@ -39,8 +44,8 @@ Documentation is available at `ameli.github.io/freealg <https://ameli.github.io/
39
44
  Quick Usage
40
45
  ===========
41
46
 
42
- The following code estimates the eigenvalues of a very large Wishart matrix using a much
43
- smaller Wishart matrix.
47
+ The following code estimates the eigenvalues of a very large Wishart matrix
48
+ using a much smaller Wishart matrix.
44
49
 
45
50
  .. code-block:: python
46
51
 
@@ -49,7 +54,8 @@ smaller Wishart matrix.
49
54
  >>> A = mp.matrix(1000) # Sample a 1000 x 1000 Wishart matrix
50
55
  >>> eigs = fa.eigfree(A, 100_000) # Estimate the eigenvalues of 100000 x 100000
51
56
 
52
- For more details on how to interface with *freealg* check out the `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
57
+ For more details on how to interface with *freealg* check out the
58
+ `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
53
59
 
54
60
 
55
61
  Test
@@ -73,14 +79,14 @@ How to Contribute
73
79
  =================
74
80
 
75
81
  We welcome contributions via GitHub's pull request. Developers should review
76
- our [Contributing Guidelines](CONTRIBUTING.rst) before submitting their code.
77
- If you do not feel comfortable modifying the code, we also welcome feature
78
- requests and bug reports.
82
+ our [Contributing Guidelines](https://github.com/ameli/freealg/blob/main/CONTRIBUTING.rst)
83
+ before submitting their code. If you do not feel comfortable modifying the
84
+ code, we also welcome feature requests and bug reports.
79
85
 
80
86
  How to Cite
81
87
  ===========
82
88
 
83
- If you use this work, please cite the `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
89
+ If you use this work, please cite our `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
84
90
 
85
91
  .. code::
86
92
 
@@ -0,0 +1 @@
1
+ __version__ = "0.3.3"
@@ -127,7 +127,7 @@ def detect_support(eigs, method='asymp', k=None, p=0.001, **kwargs):
127
127
  * ``'interior'``: estimates a support assuming the range overestimates;
128
128
  uses quantiles (p, 1-p).
129
129
  * ``'interior_smooth'``: same as ``'interior'`` but using kernel
130
- density estimation, from [2].
130
+ density estimation, from [2]_.
131
131
 
132
132
  k : int, default = None
133
133
  Number of extreme order statistics to use for ``method='regression'``.
@@ -17,6 +17,42 @@ from .freeform import FreeForm
17
17
  __all__ = ['eigh', 'cond', 'norm', 'trace', 'slogdet']
18
18
 
19
19
 
20
+ # ===============
21
+ # subsample apply
22
+ # ===============
23
+
24
+ def _subsample_apply(f, A, output_array=False):
25
+ """
26
+ Compute f(A_n) over subsamples A_n of A. If the output of
27
+ f is an array (e.g. eigvals), specify output_array to be True.
28
+ """
29
+
30
+ if A.ndim != 2 or A.shape[0] != A.shape[1]:
31
+ raise RuntimeError("Only square matrices are permitted.")
32
+
33
+ n = A.shape[0]
34
+
35
+ # Size of sample matrix
36
+ n_s = int(80*(1 + numpy.log(n)))
37
+ # If matrix is not large enough, return eigenvalues
38
+ if n < n_s:
39
+ return f(A), n, n
40
+
41
+ # Number of samples
42
+ num_samples = int(10 * (n / n_s)**0.5)
43
+
44
+ # Collect eigenvalue samples
45
+ samples = []
46
+ for _ in range(num_samples):
47
+ indices = numpy.random.choice(n, n_s, replace=False)
48
+ samples.append(f(A[numpy.ix_(indices, indices)]))
49
+
50
+ if output_array:
51
+ return numpy.concatenate(samples).ravel(), n, n_s
52
+
53
+ return numpy.array(samples), n, n_s
54
+
55
+
20
56
  # ====
21
57
  # eigh
22
58
  # ====
@@ -87,28 +123,11 @@ def eigh(A, N=None, psd=None, plots=False):
87
123
  >>> eigs = eigh(A)
88
124
  """
89
125
 
90
- if A.ndim != 2 or A.shape[0] != A.shape[1]:
91
- raise RuntimeError("Only square matrices are permitted.")
92
- n = A.shape[0]
126
+ samples, n, n_s = _subsample_apply(compute_eig, A, output_array=True)
93
127
 
94
128
  if N is None:
95
129
  N = n
96
130
 
97
- # Size of sample matrix
98
- n_s = int(80*(1 + numpy.log(n)))
99
- # If matrix is not large enough, return eigenvalues
100
- if n < n_s:
101
- return compute_eig(A)
102
- # Number of samples
103
- num_samples = int(10 * (n / n_s)**0.5)
104
-
105
- # Collect eigenvalue samples
106
- samples = []
107
- for _ in range(num_samples):
108
- indices = numpy.random.choice(n, n_s, replace=False)
109
- samples.append(compute_eig(A[numpy.ix_(indices, indices)]))
110
- samples = numpy.concatenate(samples).ravel()
111
-
112
131
  # If all eigenvalues are positive, set PSD flag
113
132
  if psd is None:
114
133
  psd = samples.min() > 0
@@ -224,7 +243,7 @@ def norm(A, N=None, order=None):
224
243
  order : {float, ``''inf``, ``'-inf'``, ``'fro'``, ``'nuc'``}, default=2
225
244
  Order of the norm.
226
245
 
227
- * float :math:`p`: Schtten p-norm.
246
+ * float :math:`p`: Schatten p-norm.
228
247
  * ``'inf'``: Largest absolute eigenvalue
229
248
  :math:`\\max \\vert \\lambda_i \\vert)`
230
249
  * ``'-inf'``: Smallest absolute eigenvalue
@@ -300,19 +319,19 @@ def norm(A, N=None, order=None):
300
319
  # trace
301
320
  # =====
302
321
 
303
- def trace(A, N=None):
322
+ def trace(A, N=None, p=1.0):
304
323
  """
305
- Estimate the trace of a Hermitian matrix.
324
+ Estimate the trace of a power of a Hermitian matrix.
306
325
 
307
- This function estimates the trace of the matrix :math:`\\mathbf{A}` or a
308
- larger matrix containing :math:`\\mathbf{A}` using free decompression.
326
+ This function estimates the trace of the matrix power :math:`\\mathbf{A}^p`
327
+ or that of a larger matrix containing :math:`\\mathbf{A}`.
309
328
 
310
329
  Parameters
311
330
  ----------
312
331
 
313
332
  A : numpy.ndarray
314
- The symmetric real-valued matrix :math:`\\mathbf{A}` whose condition
315
- number (or that of a matrix containing :math:`\\mathbf{A}`) are to be
333
+ The symmetric real-valued matrix :math:`\\mathbf{A}` whose trace of
334
+ a power (or that of a matrix containing :math:`\\mathbf{A}`) is to be
316
335
  computed.
317
336
 
318
337
  N : int, default=None
@@ -320,6 +339,10 @@ def trace(A, N=None):
320
339
  eigenvalues of. If None, returns estimates of the eigenvalues of
321
340
  :math:`\\mathbf{A}` itself.
322
341
 
342
+ p : float, default=1.0
343
+ The exponent :math:`p` in :math:`\\mathbf{A}^p`.
344
+
345
+
323
346
  Returns
324
347
  -------
325
348
 
@@ -337,7 +360,9 @@ def trace(A, N=None):
337
360
  Notes
338
361
  -----
339
362
 
340
- This is a convenience function using :func:`freealg.eigh`.
363
+ The trace is highly amenable to subsampling: under free decompression
364
+ the average eigenvalue is assumed constant, so the trace increases
365
+ linearly. Traces of powers fall back to :func:`freealg.eigh`.
341
366
 
342
367
  Examples
343
368
  --------
@@ -353,10 +378,14 @@ def trace(A, N=None):
353
378
  >>> trace(A, 100_000)
354
379
  """
355
380
 
356
- eigs = eigh(A, N)
357
- trace_ = numpy.sum(eigs)
381
+ if numpy.isclose(p, 1.0):
382
+ samples, n, n_s = _subsample_apply(numpy.trace, A, output_array=False)
383
+ if N is None:
384
+ N = n
385
+ return numpy.mean(samples) * (N / n_s)
358
386
 
359
- return trace_
387
+ eig = eigh(A, N)
388
+ return numpy.sum(eig ** p)
360
389
 
361
390
 
362
391
  # =======
@@ -1,7 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freealg
3
- Version: 0.3.1
3
+ Version: 0.3.3
4
4
  Summary: Free probability for large matrices
5
+ Home-page: https://github.com/ameli/freealg
6
+ Download-URL: https://github.com/ameli/freealg/archive/main.zip
7
+ Project-URL: Documentation, https://ameli.github.io/freealg
8
+ Project-URL: Source, https://github.com/ameli/freealg
9
+ Project-URL: Tracker, https://github.com/ameli/freealg/issues
5
10
  Keywords: linalg,free-probability
6
11
  Platform: Linux
7
12
  Platform: OSX
@@ -54,33 +59,42 @@ Requires-Dist: sphinx-gallery; extra == "docs"
54
59
  Requires-Dist: sphinxcontrib-youtube; extra == "docs"
55
60
  Requires-Dist: sphinxext-opengraph; extra == "docs"
56
61
  Requires-Dist: sphinx-argparse; extra == "docs"
62
+ Requires-Dist: sphinx-sitemap; extra == "docs"
57
63
  Dynamic: classifier
58
64
  Dynamic: description
59
65
  Dynamic: description-content-type
66
+ Dynamic: download-url
67
+ Dynamic: home-page
60
68
  Dynamic: keywords
61
69
  Dynamic: license-file
62
70
  Dynamic: platform
71
+ Dynamic: project-url
63
72
  Dynamic: provides-extra
64
73
  Dynamic: requires-dist
65
74
  Dynamic: requires-python
66
75
  Dynamic: summary
67
76
 
68
- .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
77
+ .. .. image:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
78
+ .. :align: left
79
+ .. :width: 240
80
+ .. :class: custom-dark
81
+
82
+ .. figure:: https://raw.githubusercontent.com/ameli/freealg/refs/heads/main/docs/source/_static/images/icons/logo-freealg-light.png
69
83
  :align: left
70
84
  :width: 240
71
- :class: custom-dark
72
85
 
73
86
  `Paper <https://arxiv.org/abs/2506.11994>`__ |
74
87
  `Slides <https://www.dropbox.com/scl/fi/03gjuyz17k9yhsqy0isoz/free_decomporession_slides.pdf?rlkey=8f82mhciyl2ju02l7hv1md5li&st=26xmhjga&dl=0>`__ |
75
88
  `Docs <https://ameli.github.io/freealg>`__ |
76
- `Live Demo <https://ameli.github.io/freealg/jlite/lab/index.html?path=quick_start.ipynb>`__
89
+ `Live Demo <https://colab.research.google.com/github/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__
77
90
 
78
91
  .. `Slides <https://ameli.github.io/freealg/_static/data/slides.pdf>`__ |
79
92
 
80
- *freealg* is a Python package that employs **free** probability to evaluate the spectral
81
- densities of large matrix **form**\ s. The fundamental algorithm employed by *freealg* is
82
- **free decompression**, which extrapolates from the empirical spectral densities of small
83
- submatrices to infer the eigenspectrum of extremely large matrices.
93
+ *freealg* is a Python package that employs **free** probability to evaluate the
94
+ spectral densities of large matrix **form**\ s. The fundamental algorithm
95
+ employed by *freealg* is **free decompression**, which extrapolates from the
96
+ empirical spectral densities of small submatrices to infer the eigenspectrum
97
+ of extremely large matrices.
84
98
 
85
99
  Install
86
100
  =======
@@ -106,8 +120,8 @@ Documentation is available at `ameli.github.io/freealg <https://ameli.github.io/
106
120
  Quick Usage
107
121
  ===========
108
122
 
109
- The following code estimates the eigenvalues of a very large Wishart matrix using a much
110
- smaller Wishart matrix.
123
+ The following code estimates the eigenvalues of a very large Wishart matrix
124
+ using a much smaller Wishart matrix.
111
125
 
112
126
  .. code-block:: python
113
127
 
@@ -116,7 +130,8 @@ smaller Wishart matrix.
116
130
  >>> A = mp.matrix(1000) # Sample a 1000 x 1000 Wishart matrix
117
131
  >>> eigs = fa.eigfree(A, 100_000) # Estimate the eigenvalues of 100000 x 100000
118
132
 
119
- For more details on how to interface with *freealg* check out the `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
133
+ For more details on how to interface with *freealg* check out the
134
+ `Quick Start Guide <https://github.com/ameli/freealg/blob/main/notebooks/quick_start.ipynb>`__.
120
135
 
121
136
 
122
137
  Test
@@ -140,14 +155,14 @@ How to Contribute
140
155
  =================
141
156
 
142
157
  We welcome contributions via GitHub's pull request. Developers should review
143
- our [Contributing Guidelines](CONTRIBUTING.rst) before submitting their code.
144
- If you do not feel comfortable modifying the code, we also welcome feature
145
- requests and bug reports.
158
+ our [Contributing Guidelines](https://github.com/ameli/freealg/blob/main/CONTRIBUTING.rst)
159
+ before submitting their code. If you do not feel comfortable modifying the
160
+ code, we also welcome feature requests and bug reports.
146
161
 
147
162
  How to Cite
148
163
  ===========
149
164
 
150
- If you use this work, please cite the `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
165
+ If you use this work, please cite our `arXiv paper <https://arxiv.org/abs/2506.11994>`__.
151
166
 
152
167
  .. code::
153
168
 
@@ -24,6 +24,7 @@ sphinx-gallery
24
24
  sphinxcontrib-youtube
25
25
  sphinxext-opengraph
26
26
  sphinx-argparse
27
+ sphinx-sitemap
27
28
 
28
29
  [test]
29
30
  tox
@@ -158,6 +158,12 @@ def main(argv):
158
158
  # Description
159
159
  description = 'Free probability for large matrices'
160
160
 
161
+ # URLs
162
+ url = 'https://github.com/ameli/freealg'
163
+ download_url = url + '/archive/main.zip'
164
+ documentation_url = 'https://ameli.github.io/freealg'
165
+ tracker_url = url + '/issues'
166
+
161
167
  # Inputs to setup
162
168
  metadata = dict(
163
169
  name=package_name,
@@ -166,6 +172,13 @@ def main(argv):
166
172
  long_description=long_description,
167
173
  long_description_content_type='text/x-rst',
168
174
  keywords="""linalg, free-probability""",
175
+ url=url,
176
+ download_url=download_url,
177
+ project_urls={
178
+ "Documentation": documentation_url,
179
+ "Source": url,
180
+ "Tracker": tracker_url,
181
+ },
169
182
  platforms=['Linux', 'OSX', 'Windows'],
170
183
  packages=setuptools.find_packages(exclude=[
171
184
  'tests.*',
@@ -1 +0,0 @@
1
- __version__ = "0.3.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes