From 5aa202175242a6a03cd0239bf00ca04c8783c019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Fri, 26 Jul 2024 09:40:03 +0200 Subject: [PATCH 01/11] wip Divio --- docs/index.md | 125 ++++++++++++++------------------------------------ mkdocs.yml | 3 +- 2 files changed, 37 insertions(+), 91 deletions(-) diff --git a/docs/index.md b/docs/index.md index fcead3ce..c43e3a85 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,97 +1,42 @@ -# Sparse +--- +hide: + - navigation + - toc +--- -This implements sparse arrays of arbitrary dimension on top of +# Sparse +This project implements sparse arrays of arbitrary dimension on top of [numpy][] and [`scipy.sparse`][]. It generalizes the [`scipy.sparse.coo_matrix`][] and [`scipy.sparse.dok_matrix`][] layouts, but extends beyond just rows and columns to an arbitrary number of dimensions. - -Additionally, this project maintains compatibility with the -[`numpy.ndarray`][] interface rather than the -[`numpy.matrix`][] interface used in -[`scipy.sparse`][] - -These differences make this project useful in certain situations where -scipy.sparse matrices are not well suited, but it should not be -considered a full replacement. The data structures in pydata/sparse -complement and can be used in conjunction with the fast linear algebra -routines inside [`scipy.sparse`][]. A format conversion or copy may be -required. - -## Motivation - -Sparse arrays, or arrays that are mostly empty or filled with zeros, are -common in many scientific applications. To save space we often avoid -storing these arrays in traditional dense formats, and instead choose -different data structures. Our choice of data structure can -significantly affect our storage and computational costs when working -with these arrays. - -## Design - -The main data structure in this library follows the [Coordinate List -(COO)](https://en.wikipedia.org/wiki/Sparse_matrix#Coordinate_list_(COO)) -layout for sparse matrices, but extends it to multiple dimensions. - -The COO layout, which stores the row index, column index, and value of -every element: - - -| row | col | data | -|-----|-----|------| -| 0 | 0 | 10 | -| 0 | 2 | 13 | -| 1 | 3 | 9 | -| 3 | 8 | 21 | - -It is straightforward to extend the COO layout to an arbitrary number of -dimensions: - - -| dim1 | dim2 | dim3 | \... | data | -|------|------|------|------|------| -| 0 | 0 | 0 | . | 10 | -| 0 | 0 | 3 | . | 13 | -| 0 | 2 | 2 | . | 9 | -| 3 | 1 | 4 | . | 21 | - -This makes it easy to *store* a multidimensional sparse array, but we -still need to reimplement all of the array operations like transpose, -reshape, slicing, tensordot, reductions, etc., which can be challenging -in general. - -This library also includes several other data structures. Similar to -COO, the [Dictionary of Keys -(DOK)](https://en.wikipedia.org/wiki/Sparse_matrix#Dictionary_of_keys_(DOK)) -format for sparse matrices generalizes well to an arbitrary number of -dimensions. DOK is well-suited for writing and mutating. Most other -operations are not supported for DOK. A common workflow may involve -writing an array with DOK and then converting to another format for -other operations. - -The [Compressed Sparse Row/Column -(CSR/CSC)](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_(CSC_or_CCS)) -formats are widely used in scientific computing are now supported by -pydata/sparse. The CSR/CSC formats excel at compression and mathematical -operations. While these formats are restricted to two dimensions, -pydata/sparse supports the GCXS sparse array format, based on [GCRS/GCCS -from](https://ieeexplore.ieee.org/abstract/document/7237032/similar#similar) -which generalizes CSR/CSC to n-dimensional arrays. Like their -two-dimensional CSR/CSC counterparts, GCXS arrays compress well. Whereas -the storage cost of COO depends heavily on the number of dimensions of -the array, the number of dimensions only minimally affects the storage -cost of GCXS arrays, which results in favorable compression ratios -across many use cases. - -Together these formats cover a wide array of applications of sparsity. -Additionally, with each format complying with the -[`numpy.ndarray`][] interface and following -the appropriate dispatching protocols, pydata/sparse arrays can interact -with other array libraries and seamlessly take part in -pydata-ecosystem-based workflows. - -## LICENSE - -This library is licensed under BSD-3. +
+
+ +
+ +

Introduction + { .card } +

+

Tutorials + { .card } +

+ +

How-to guides + { .card } +

+ +

Reference + { .card } +

+

Explanation + { .card } +

+ +

Something here + { .card } +

+ +
diff --git a/mkdocs.yml b/mkdocs.yml index 83b9052a..b9241093 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -27,7 +27,8 @@ markdown_extensions: toc_depth: 2 - pymdownx.arithmatex: # To display math content with KaTex generic: true - - attr_list # To be able to link to a header on another page + - attr_list # To be able to link to a header on another page, use grids + - md_in_html # Used for grids extra_javascript: - javascripts/katex.js From dd5af78e5110ed7a71facac1e39a15658823f0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Fri, 26 Jul 2024 20:22:25 +0200 Subject: [PATCH 02/11] wip --- docs/assets/images/undraw_education_f8ru.png | Bin 0 -> 32380 bytes docs/changelog.md | 330 +++++++++---------- docs/css/mkdocstrings.css | 10 +- docs/index.md | 25 +- docs/introduction.md | 97 ++++++ mkdocs.yml | 4 +- 6 files changed, 284 insertions(+), 182 deletions(-) create mode 100644 docs/assets/images/undraw_education_f8ru.png create mode 100644 docs/introduction.md diff --git a/docs/assets/images/undraw_education_f8ru.png b/docs/assets/images/undraw_education_f8ru.png new file mode 100644 index 0000000000000000000000000000000000000000..871a87566e1267bd34866a44cd49d2749e64f8e9 GIT binary patch literal 32380 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 S0XoDHh#S{5uNEqqKl&d+ngN&q literal 0 HcmV?d00001 diff --git a/docs/changelog.md b/docs/changelog.md index 4563c367..8f9f4997 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -5,58 +5,58 @@ Changelog 0.15.1 / 2024-01-10 ------------------- -* Fix regression where with XArray by supporting all API functions via the Array API standard. (:pr:`622` thanks :ghuser:`hameerabbasi`) +* Fix regression where with XArray by supporting all API functions via the Array API standard. (PR [#622](https://github.com/pydata/sparse/pull/622) thanks [@hameerabbasi](https://github.com/hameerabbasi)) 0.15.0 / 2024-01-09 ------------------- -* Fix regression where :obj:`DeprecationWarning`s were being fired unexpectedly. (:pr:`581` thanks :ghuser:`hameerabbasi`) -* Extended :obj:`sparse.einsum` support (:pr:`579` thanks :ghuser:`HadrienNU`) -* General code clean-up (:pr:`586` thanks :ghuser:`MHRasmy`, :pr:`598` thanks :ghuser:`jamestwebber`) -* Bug fixes with respect to NumPy compatibility (:pr:`598` thanks :ghuser:`hameerabbasi`, :pr:`609` thanks :ghuser:`Illviljan`, :pr:`620` thanks :ghuser:`mtsokol`) -* Bug fixes with respect to GCXS (:pr:`611` thanks :ghuser:`EuGig`, :pr:`601` thanks :ghuser:`jamestwebber`) -* `Array API standard `_ support (:pr:`612`, :pr:`613`, :pr:`614`, :pr:`615`, :pr:`619`, :pr:`620` thanks :ghuser:`mtsokol`) -* ``matrepr`` support for display of sparse data (:pr:`605`, :pr:`606` thanks :ghuser:`alugowski`). -* Larger code clean-up with Ruff formatter and linter (:pr:`617`, :pr:`621` thanks :ghuser:`hameerabbasi`) -* Packaging and maintenance (:pr:`616`, :commit:`b5954e68d3d6e35a62f7401d1d4fb84ea04414dd`, :commit:`dda93d3ea9521881c721c3ba875c769c9c5a79d4` thanks :ghuser:`hameerabbasi`) +* Fix regression where :obj:`DeprecationWarning`s were being fired unexpectedly. (PR [#581](https://github.com/pydata/sparse/pull/581) thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Extended :obj:`sparse.einsum` support (PR [#579](https://github.com/pydata/sparse/pull/579) thanks [@HadrienNU](https://github.com/HadrienNU)) +* General code clean-up (PR [#586](https://github.com/pydata/sparse/pull/586) thanks [@MHRasmy](https://github.com/MHRasmy), PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@jamestwebber](https://github.com/jamestwebber)) +* Bug fixes with respect to NumPy compatibility (PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@hameerabbasi](https://github.com/hameerabbasi), PR [#609](https://github.com/pydata/sparse/pull/609) thanks [@Illviljan](https://github.com/Illviljan), PR [#620](https://github.com/pydata/sparse/pull/620) thanks [@mtsokol](https://github.com/mtsokol)) +* Bug fixes with respect to GCXS (PR [#611](https://github.com/pydata/sparse/pull/611) thanks [@EuGig](https://github.com/EuGig), PR [#601](https://github.com/pydata/sparse/pull/601) thanks [@jamestwebber](https://github.com/jamestwebber)) +* `Array API standard `_ support (PR [#612](https://github.com/pydata/sparse/pull/612), PR [#613](https://github.com/pydata/sparse/pull/613), PR [#614](https://github.com/pydata/sparse/pull/614), PR [#615](https://github.com/pydata/sparse/pull/615), PR [#619](https://github.com/pydata/sparse/pull/619), PR [#620](https://github.com/pydata/sparse/pull/620) thanks [@mtsokol](https://github.com/mtsokol)) +* ``matrepr`` support for display of sparse data (PR [#605](https://github.com/pydata/sparse/pull/605), PR [#606](https://github.com/pydata/sparse/pull/606) thanks [@alugowski](https://github.com/alugowski)). +* Larger code clean-up with Ruff formatter and linter (PR [#617](https://github.com/pydata/sparse/pull/617), PR [#621](https://github.com/pydata/sparse/pull/621) thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Packaging and maintenance (PR [#616](https://github.com/pydata/sparse/pull/616), :commit:`b5954e68d3d6e35a62f7401d1d4fb84ea04414dd`, :commit:`dda93d3ea9521881c721c3ba875c769c9c5a79d4` thanks [@hameerabbasi](https://github.com/hameerabbasi)) 0.14.0 / 2023-02-24 ------------------- -* :obj:`sparse.einsum` support (:pr:`564` thanks - :ghuser:`jcmgray`) -* Some bug-fixes (:pr:`524`, :pr:`527`, :pr:`555` thanks :ghuser:`hameerabbasi`, :pr:`569`, thanks :ghuser:`jamestwebber`, :pr:`534`, thanks :ghuser:`sarveshbhatnagar`) -* Some performance improvements (:pr:`570`, thanks :ghuser:`jamestwebber`, :pr:`540`, thanks :ghuser:`smldub`). +* :obj:`sparse.einsum` support (PR [#564](https://github.com/pydata/sparse/pull/564) thanks + [@jcmgray](https://github.com/jcmgray)) +* Some bug-fixes (PR [#524](https://github.com/pydata/sparse/pull/524), PR [#527](https://github.com/pydata/sparse/pull/527), PR [#555](https://github.com/pydata/sparse/pull/555) thanks [@hameerabbasi](https://github.com/hameerabbasi), PR [#569](https://github.com/pydata/sparse/pull/569), thanks [@jamestwebber](https://github.com/jamestwebber), PR [#534](https://github.com/pydata/sparse/pull/534), thanks [@sarveshbhatnagar](https://github.com/sarveshbhatnagar)) +* Some performance improvements (PR [#570](https://github.com/pydata/sparse/pull/570), thanks [@jamestwebber](https://github.com/jamestwebber), PR [#540](https://github.com/pydata/sparse/pull/540), thanks [@smldub](https://github.com/smldub)). * Miscellaneous maintenance fixes. 0.13.0 / 2021-08-28 ------------------- -* GCXS improvements and changes. (:pr:`448`, :pr:`450`, :pr:`455`, thanks - :ghuser:`sayandip18`). -* Maintainence fixes (:pr:`462`, :pr:`466`, :commit:`1ccb85da581be65a0345b399e00fd3c325700d95`, +* GCXS improvements and changes. (PR [#448](https://github.com/pydata/sparse/pull/448), PR [#450](https://github.com/pydata/sparse/pull/450), PR [#455](https://github.com/pydata/sparse/pull/455), thanks + [@sayandip18](https://github.com/sayandip18)). +* Maintainence fixes (PR [#462](https://github.com/pydata/sparse/pull/462), PR [#466](https://github.com/pydata/sparse/pull/466), :commit:`1ccb85da581be65a0345b399e00fd3c325700d95`, :commit:`5547b4e92dc8d61492e9dc10ba00175c1a6637fa` :commit:`00c0e5514de2aab8b9a0be16b5da470b091d9eb9`, :commit:`fcd3020dd08c7022a44f709173fe23969d3e8f7c`, - thanks :ghuser:`hameerabbasi`) -* :obj:`sparse.DOK.from_scipy_sparse` method (:pr:`464`, :issue:`463`, thanks - :ghuser:`hameerabbasi`). -* Black re-formatting (:pr:`471`, :pr:`484`, thanks :ghuser:`GenevieveBuckley`, :ghuser:`sayandip18`) -* Add :obj:`sparse.pad` (:pr:`474`, :issue:`438`, thanks :ghuser:`H4R5H1T-007`) + thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* :obj:`sparse.DOK.from_scipy_sparse` method (PR [#464](https://github.com/pydata/sparse/pull/464), Issue [#463](https://github.com/pydata/sparse/issues/463), thanks + [@hameerabbasi](https://github.com/hameerabbasi)). +* Black re-formatting (PR [#471](https://github.com/pydata/sparse/pull/471), PR [#484](https://github.com/pydata/sparse/pull/484), thanks [@GenevieveBuckley](https://github.com/GenevieveBuckley), [@sayandip18](https://github.com/sayandip18)) +* Add :obj:`sparse.pad` (PR [#474](https://github.com/pydata/sparse/pull/474), Issue [#438](https://github.com/pydata/sparse/issues/438), thanks [@H4R5H1T-007](https://github.com/H4R5H1T-007)) * Switch to GitHub Actions (:compare:`5547b4e92dc8d61492e9dc10ba00175c1a6637fa..a332f22c96a96e5ab9b4384342df67e8f3966f85`) -* Fix a number of bugs in format conversion. (:pr:`504`, :issue:`503`, thanks - :ghuser:`hameerabbasi`) -* Fix bug in :obj:`sparse.matmul` for higher-dimensional arrays. (:pr:`508`, - :issue:`506`, thanks :ghuser:`sayandip18`). -* Fix scalar conversion to COO (:issue:`510`, :pr:`511`, thanks :ghuser:`hameerabbasi`) -* Fix OOB memory accesses (:issue:`515`, :commit:`1e24a7e29786e888dee4c02153309986ae4b5dde` - thanks :ghuser:`hameerabbasi`) -* Fixes element-wise ops with scalar COO array. (:issue:`505`, :commit:`5211441ec685233657ab7156f99eb67e660cee86`, - thanks :ghuser:`hameerabbasi`) -* Fix scalar broadcast_to with ``nnz==0``. (:issue:`513`, :commit:`bfabaa0805e811884e79c4bdbfd14316986d65e4`, - thanks :ghuser:`hameerabbasi`) -* Add order parameter to ``{zero, ones, full}[_like]``. (:issue:`514`, :commit:`37de1d0141c4375962ecdf18337c2dd0f667b60c`, - thanks :ghuser:`hameerabbasi`) -* Fix tensordot typing bugs. (:issue:`493`, :issue:`499`, :commit:`37de1d0141c4375962ecdf18337c2dd0f667b60c`, - thanks :ghuser:`hameerabbasi`). +* Fix a number of bugs in format conversion. (PR [#504](https://github.com/pydata/sparse/pull/504), Issue [#503](https://github.com/pydata/sparse/issues/503), thanks + [@hameerabbasi](https://github.com/hameerabbasi)) +* Fix bug in :obj:`sparse.matmul` for higher-dimensional arrays. (PR [#508](https://github.com/pydata/sparse/pull/508), + Issue [#506](https://github.com/pydata/sparse/issues/506), thanks [@sayandip18](https://github.com/sayandip18)). +* Fix scalar conversion to COO (Issue [#510](https://github.com/pydata/sparse/issues/510), PR [#511](https://github.com/pydata/sparse/pull/511), thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Fix OOB memory accesses (Issue [#515](https://github.com/pydata/sparse/issues/515), :commit:`1e24a7e29786e888dee4c02153309986ae4b5dde` + thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Fixes element-wise ops with scalar COO array. (Issue [#505](https://github.com/pydata/sparse/issues/505), :commit:`5211441ec685233657ab7156f99eb67e660cee86`, + thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Fix scalar broadcast_to with ``nnz==0``. (Issue [#513](https://github.com/pydata/sparse/issues/513), :commit:`bfabaa0805e811884e79c4bdbfd14316986d65e4`, + thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Add order parameter to ``{zero, ones, full}[_like]``. (Issue [#514](https://github.com/pydata/sparse/issues/514), :commit:`37de1d0141c4375962ecdf18337c2dd0f667b60c`, + thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Fix tensordot typing bugs. (Issue [#493](https://github.com/pydata/sparse/issues/493), Issue [#499](https://github.com/pydata/sparse/issues/499), :commit:`37de1d0141c4375962ecdf18337c2dd0f667b60c`, + thanks [@hameerabbasi](https://github.com/hameerabbasi)). 0.12.0 / 2021-03-19 ------------------- @@ -65,75 +65,75 @@ There are a number of large changes in this release. For example, we have implem :obj:`GCXS` type, and its specializations :obj:`CSR` and :obj:`CSC`. We plan on gradually improving the performance of these. -* A number of :obj:`GCXS` fixes and additions (:pr:`409`, :pr:`407`, :pr:`414`, - :pr:`417`, :pr:`419` thanks :ghuser:`daletovar`) -* Ability to change the index dtype for better storage characteristics. (:pr:`441`, - thanks :ghuser:`daletovar`) -* Some work on :obj:`DOK` arrays to bring them closer to the other formats (:pr:`435`, - :pr:`437`, :pr:`439`, :pr:`440`, thanks :ghuser:`DragaDoncila`) -* :obj:`CSR` and :obj:`CSC` specializations of :obj:`GCXS` (:pr:`442`, thanks :ghuser:`ivirshup`) +* A number of :obj:`GCXS` fixes and additions (PR [#409](https://github.com/pydata/sparse/pull/409), PR [#407](https://github.com/pydata/sparse/pull/407), PR [#414](https://github.com/pydata/sparse/pull/414), + PR [#417](https://github.com/pydata/sparse/pull/417), PR [#419](https://github.com/pydata/sparse/pull/419) thanks [@daletovar](https://github.com/daletovar)) +* Ability to change the index dtype for better storage characteristics. (PR [#441](https://github.com/pydata/sparse/pull/441), + thanks [@daletovar](https://github.com/daletovar)) +* Some work on :obj:`DOK` arrays to bring them closer to the other formats (PR [#435](https://github.com/pydata/sparse/pull/435), + PR [#437](https://github.com/pydata/sparse/pull/437), PR [#439](https://github.com/pydata/sparse/pull/439), PR [#440](https://github.com/pydata/sparse/pull/440), thanks [@DragaDoncila](https://github.com/DragaDoncila)) +* :obj:`CSR` and :obj:`CSC` specializations of :obj:`GCXS` (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) For now, this is experimental undocumented API, and subject to change. -* Fix a number of bugs (:pr:`407`, :issue:`406`) -* Add ``nnz`` parameter to :obj:`sparse.random` (:pr:`410`, thanks :ghuser:`emilmelnikov`) +* Fix a number of bugs (PR [#407](https://github.com/pydata/sparse/pull/407), Issue [#406](https://github.com/pydata/sparse/issues/406)) +* Add ``nnz`` parameter to :obj:`sparse.random` (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) 0.11.2 / 2020-09-04 ------------------- -* Fix :obj:`TypingError` on :obj:`sparse.dot` with complex dtypes. (:issue:`403`, :pr:`404`) +* Fix :obj:`TypingError` on :obj:`sparse.dot` with complex dtypes. (Issue [#403](https://github.com/pydata/sparse/issues/403), PR [#404](https://github.com/pydata/sparse/pull/404)) 0.11.1 / 2020-08-31 ------------------- -* Fix :obj:`ValueError` on :obj:`sparse.dot` with extremely small values. (:issue:`398`, :pr:`399`) +* Fix :obj:`ValueError` on :obj:`sparse.dot` with extremely small values. (Issue [#398](https://github.com/pydata/sparse/issues/398), PR [#399](https://github.com/pydata/sparse/pull/399)) 0.11.0 / 2020-08-18 ------------------- -* Improve the performance of :obj:`sparse.dot`. (:issue:`331`, :pr:`389`, thanks :ghuser:`daletovar`) -* Added the :obj:`COO.swapaxes` method. (:pr:`344`, thanks :ghuser:`lueckem`) -* Added multi-axis 1-D indexing support. (:pr:`343`, thanks :ghuser:`mikeymezher`) -* Fix :obj:`outer` for arrays that weren't one-dimensional. (:issue:`346`, :pr:`347`) -* Add ``casting`` kwarg to :obj:`COO.astype`. (:issue:`391`, :pr:`392`) -* Fix for :obj:`COO` constructor accepting invalid inputs. (:issue:`385`, :pr:`386`) +* Improve the performance of :obj:`sparse.dot`. (Issue [#331](https://github.com/pydata/sparse/issues/331), PR [#389](https://github.com/pydata/sparse/pull/389), thanks [@daletovar](https://github.com/daletovar)) +* Added the :obj:`COO.swapaxes` method. (PR [#344](https://github.com/pydata/sparse/pull/344), thanks [@lueckem](https://github.com/lueckem)) +* Added multi-axis 1-D indexing support. (PR [#343](https://github.com/pydata/sparse/pull/343), thanks [@mikeymezher](https://github.com/mikeymezher)) +* Fix :obj:`outer` for arrays that weren't one-dimensional. (Issue [#346](https://github.com/pydata/sparse/issues/346), PR [#347](https://github.com/pydata/sparse/pull/347)) +* Add ``casting`` kwarg to :obj:`COO.astype`. (Issue [#391](https://github.com/pydata/sparse/issues/391), PR [#392](https://github.com/pydata/sparse/pull/392)) +* Fix for :obj:`COO` constructor accepting invalid inputs. (Issue [#385](https://github.com/pydata/sparse/issues/385), PR [#386](https://github.com/pydata/sparse/pull/386)) 0.10.0 / 2020-05-13 ------------------- * Fixed a bug where converting an empty DOK array to COO leads - to an incorrect dtype. (:issue:`314`, :pr:`315`) -* Change code formatter to black. (:pr:`284`) -* Add :obj:`COO.flatten` and :obj:`sparse.outer`. (:issue:`316`, :pr:`317`). + to an incorrect dtype. (Issue [#314](https://github.com/pydata/sparse/issues/314), PR [#315](https://github.com/pydata/sparse/pull/315)) +* Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) +* Add :obj:`COO.flatten` and :obj:`sparse.outer`. (Issue [#316](https://github.com/pydata/sparse/issues/316), PR [#317](https://github.com/pydata/sparse/pull/317)). * Remove broadcasting restriction between sparse arrays and dense arrays. - (:issue:`306`, :pr:`318`) -* Implement deterministic dask tokenization. (:issue:`300`, :pr:`320`, thanks - :ghuser:`danielballan`) -* Improve testing around densification (:pr:`321`, thanks - :ghuser:`danielballan`) -* Simplify Numba extension. (:pr:`324`, thanks :ghuser:`eric-wieser`). -* Respect ``copy=False`` in ``astype`` (:pr:`328`, thanks :ghuser:`eric-wieser`). -* Replace linear_loc with ravel_multi_index, which is 3x faster. (:pr:`330`, - thanks :ghuser:`eric-wieser`). -* Add error msg to tensordot operation when ``ndim==0`` (:issue:`332`, - :pr:`333`, thanks :ghuser:`guilhermeleobas`). + (Issue [#306](https://github.com/pydata/sparse/issues/306), PR [#318](https://github.com/pydata/sparse/pull/318)) +* Implement deterministic dask tokenization. (Issue [#300](https://github.com/pydata/sparse/issues/300), PR [#320](https://github.com/pydata/sparse/pull/320), thanks + [@danielballan](https://github.com/danielballan)) +* Improve testing around densification (PR [#321](https://github.com/pydata/sparse/pull/321), thanks + [@danielballan](https://github.com/danielballan)) +* Simplify Numba extension. (PR [#324](https://github.com/pydata/sparse/pull/324), thanks [@eric-wieser](https://github.com/eric-wieser)). +* Respect ``copy=False`` in ``astype`` (PR [#328](https://github.com/pydata/sparse/pull/328), thanks [@eric-wieser](https://github.com/eric-wieser)). +* Replace linear_loc with ravel_multi_index, which is 3x faster. (PR [#330](https://github.com/pydata/sparse/pull/330), + thanks [@eric-wieser](https://github.com/eric-wieser)). +* Add error msg to tensordot operation when ``ndim==0`` (Issue [#332](https://github.com/pydata/sparse/issues/332), + PR [#333](https://github.com/pydata/sparse/pull/333), thanks [@guilhermeleobas](https://github.com/guilhermeleobas)). * Maintainence fixes for Sphinx 3.0 and Numba 0.49, and dropping support for - Python 3.5. (:pr:`337`). + Python 3.5. (PR [#337](https://github.com/pydata/sparse/pull/337)). * Fixed signature for :obj:`numpy.clip`. 0.9.1 / 2020-01-23 ------------------ * Fixed a bug where indexing with an empty list could lead - to issues. (:issue:`281`, :pr:`282`) -* Change code formatter to black. (:pr:`284`) + to issues. (Issue [#281](https://github.com/pydata/sparse/issues/281), PR [#282](https://github.com/pydata/sparse/pull/282)) +* Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) * Add the :obj:`diagonal` and :obj:`diagonalize` functions. - (:issue:`288`, :pr:`289`, thanks :ghuser:`pettni`) -* Add HTML repr for notebooks. (:pr:`283`, thanks :ghuser:`daletovar`) + (Issue [#288](https://github.com/pydata/sparse/issues/288), PR [#289](https://github.com/pydata/sparse/pull/289), thanks [@pettni](https://github.com/pettni)) +* Add HTML repr for notebooks. (PR [#283](https://github.com/pydata/sparse/pull/283), thanks [@daletovar](https://github.com/daletovar)) * Avoid making copy of ``coords`` when making a new :obj:`COO` array. -* Add stack and concatenate for GCXS. (:issue:`301`, :pr:`303`, thanks - :ghuser:`daletovar`). +* Add stack and concatenate for GCXS. (Issue [#301](https://github.com/pydata/sparse/issues/301), PR [#303](https://github.com/pydata/sparse/pull/303), thanks + [@daletovar](https://github.com/daletovar)). * Fix issue where functions dispatching to an attribute access wouldn't - work with ``__array_function__``. (:issue:`308`, :pr:`309`). + work with ``__array_function__``. (Issue [#308](https://github.com/pydata/sparse/issues/308), PR [#309](https://github.com/pydata/sparse/pull/309)). * Add partial support for constructing and mirroring :obj:`COO` objects to Numba. @@ -146,29 +146,29 @@ and Windows are officially tested. It also includes bug fixes. It also adds in-progress, not yet public support for the GCXS format, which is a generalisation of CSR/CSC. (huge thanks to -:ghuser:`daletovar`) +[@daletovar](https://github.com/daletovar)) * Fixed a bug where an array with size == 1 and nnz == 0 - could not be broadcast. (:issue:`242`, :pr:`243`) -* Add ``std`` and ``var``. (:pr:`244`) + could not be broadcast. (Issue [#242](https://github.com/pydata/sparse/issues/242), PR [#243](https://github.com/pydata/sparse/pull/243)) +* Add ``std`` and ``var``. (PR [#244](https://github.com/pydata/sparse/pull/244)) * Move to Azure Pipelines with CI for Windows, macOS and - Linux. (:pr:`245`, :pr:`246`, :pr:`247`, :pr:`248`) + Linux. (PR [#245](https://github.com/pydata/sparse/pull/245), PR [#246](https://github.com/pydata/sparse/pull/246), PR [#247](https://github.com/pydata/sparse/pull/247), PR [#248](https://github.com/pydata/sparse/pull/248)) * Add ``resize``, and change ``reshape`` so it raises a ``ValueError`` on shapes that don't correspond to the - same size. (:issue:`241`, :issue:`250`, :pr:`256` - thanks, :ghuser:`daletovar`) -* Add ``isposinf`` and ``isneginf``. (:issue:`252`, :pr:`253`) -* Fix ``tensordot`` when nnz = 0. (:issue:`255`, :pr:`256`) + same size. (Issue [#241](https://github.com/pydata/sparse/issues/241), Issue [#250](https://github.com/pydata/sparse/issues/250), PR [#256](https://github.com/pydata/sparse/pull/256) + thanks, [@daletovar](https://github.com/daletovar)) +* Add ``isposinf`` and ``isneginf``. (Issue [#252](https://github.com/pydata/sparse/issues/252), PR [#253](https://github.com/pydata/sparse/pull/253)) +* Fix ``tensordot`` when nnz = 0. (Issue [#255](https://github.com/pydata/sparse/issues/255), PR [#256](https://github.com/pydata/sparse/pull/256)) * Modifications to ``__array_function__`` to allow for sparse - XArrays. (:pr:`261`, thanks :ghuser:`nvictus`) -* Add not-yet-public support for GCXS. (:pr:`258`, thanks :ghuser:`daletovar`) -* Improvements to ``__array_function__``. (:pr:`267`, :pr:`272`, thanks - :ghuser:`crusaderky`) -* Convert all Numba lists to typed lists. (:pr:`264`) -* Why write code when it exists elsewhere? (:pr:`277`) -* Fix some element-wise operations with scalars. (:pr:`278`) + XArrays. (PR [#261](https://github.com/pydata/sparse/pull/261), thanks [@nvictus](https://github.com/nvictus)) +* Add not-yet-public support for GCXS. (PR [#258](https://github.com/pydata/sparse/pull/258), thanks [@daletovar](https://github.com/daletovar)) +* Improvements to ``__array_function__``. (PR [#267](https://github.com/pydata/sparse/pull/267), PR [#272](https://github.com/pydata/sparse/pull/272), thanks + [@crusaderky](https://github.com/crusaderky)) +* Convert all Numba lists to typed lists. (PR [#264](https://github.com/pydata/sparse/pull/264)) +* Why write code when it exists elsewhere? (PR [#277](https://github.com/pydata/sparse/pull/277)) +* Fix some element-wise operations with scalars. (PR [#278](https://github.com/pydata/sparse/pull/278)) * Private modules should be private, and tests should be in the package. - (:pr:`280`) + (PR [#280](https://github.com/pydata/sparse/pull/280)) 0.7.0 / 2019-03-14 @@ -189,18 +189,18 @@ The full list of changes can be found below: * Fixed a bug where going between :obj:`sparse.DOK` and :obj:`sparse.COO` caused fill-values to be lost. - (:issue:`225`, :pr:`226`). + (Issue [#225](https://github.com/pydata/sparse/issues/225), PR [#226](https://github.com/pydata/sparse/pull/226)). * Fixed warning for a matrix that was incorrectly considered - too dense. (:issue:`228`, :pr:`229`) + too dense. (Issue [#228](https://github.com/pydata/sparse/issues/228), PR [#229](https://github.com/pydata/sparse/pull/229)) * Fixed some warnings in Python 3.7, the fix was needed. - in preparation for Python 3.8. (:pr:`233`, thanks :ghuser:`nils-werner`) -* Drop support for Python 2.7 (:issue:`234`, :pr:`235`, thanks - :ghuser:`hugovk`) -* Clearer error messages (:issue:`230`, :issue:`231`, :pr:`232`) -* Restructure requirements.txt files. (:pr:`236`) -* Support fill-value in reductions in specific cases. (:issue:`237`, :pr:`238`) -* Add ``__array_function__`` support. (:pr:`239`, thanks, :ghuser:`pentschev`) -* Cleaner code! (:pr:`240`) + in preparation for Python 3.8. (PR [#233](https://github.com/pydata/sparse/pull/233), thanks [@nils-werner](https://github.com/nils-werner)) +* Drop support for Python 2.7 (Issue [#234](https://github.com/pydata/sparse/issues/234), PR [#235](https://github.com/pydata/sparse/pull/235), thanks + [@hugovk](https://github.com/hugovk)) +* Clearer error messages (Issue [#230](https://github.com/pydata/sparse/issues/230), Issue [#231](https://github.com/pydata/sparse/issues/231), PR [#232](https://github.com/pydata/sparse/pull/232)) +* Restructure requirements.txt files. (PR [#236](https://github.com/pydata/sparse/pull/236)) +* Support fill-value in reductions in specific cases. (Issue [#237](https://github.com/pydata/sparse/issues/237), PR [#238](https://github.com/pydata/sparse/pull/238)) +* Add ``__array_function__`` support. (PR [#239](https://github.com/pydata/sparse/pull/239), thanks, [@pentschev](https://github.com/pentschev)) +* Cleaner code! (PR [#240](https://github.com/pydata/sparse/pull/240)) 0.6.0 / 2018-12-19 ------------------ @@ -215,102 +215,102 @@ an attempt is made to automatically densify an array. To densify, use the explic ``.todense()`` method. * Fixed a bug where ``np.matrix`` could sometimes fail to - convert to a ``COO``. (:issue:`199`, :pr:`200`). -* Make sure that ``sparse @ sparse`` returns a sparse array. (:issue:`201`, :pr:`203`) + convert to a ``COO``. (Issue [#199](https://github.com/pydata/sparse/issues/199), PR [#200](https://github.com/pydata/sparse/pull/200)). +* Make sure that ``sparse @ sparse`` returns a sparse array. (Issue [#201](https://github.com/pydata/sparse/issues/201), PR [#203](https://github.com/pydata/sparse/pull/203)) * Bring ``operator.matmul`` behaviour in line with NumPy for ``ndim > 2``. - (:issue:`202`, :pr:`204`, :pr:`217`) -* Make sure ``dtype`` is preserved with the ``out`` kwarg. (:issue:`205`, :pr:`206`) -* Fix integer overflow in ``reduce`` on Windows. (:issue:`207`, :pr:`208`) -* Disallow auto-densification. (:issue:`218`, :pr:`220`) + (Issue [#202](https://github.com/pydata/sparse/issues/202), PR [#204](https://github.com/pydata/sparse/pull/204), PR [#217](https://github.com/pydata/sparse/pull/217)) +* Make sure ``dtype`` is preserved with the ``out`` kwarg. (Issue [#205](https://github.com/pydata/sparse/issues/205), PR [#206](https://github.com/pydata/sparse/pull/206)) +* Fix integer overflow in ``reduce`` on Windows. (Issue [#207](https://github.com/pydata/sparse/issues/207), PR [#208](https://github.com/pydata/sparse/pull/208)) +* Disallow auto-densification. (Issue [#218](https://github.com/pydata/sparse/issues/218), PR [#220](https://github.com/pydata/sparse/pull/220)) * Add auto-densification configuration, and a configurable warning for checking - if the array is too dense. (:pr:`210`, :pr:`213`) -* Add pruning of fill-values to COO constructor. (:pr:`221`) + if the array is too dense. (PR [#210](https://github.com/pydata/sparse/pull/210), PR [#213](https://github.com/pydata/sparse/pull/213)) +* Add pruning of fill-values to COO constructor. (PR [#221](https://github.com/pydata/sparse/pull/221)) 0.5.0 / 2018-10-12 ------------------ -* Added :code:`COO.real`, :code:`COO.imag`, and :code:`COO.conj` (:pr:`196`). -* Added :code:`sparse.kron` function (:pr:`194`, :pr:`195`). +* Added :code:`COO.real`, :code:`COO.imag`, and :code:`COO.conj` (PR [#196](https://github.com/pydata/sparse/pull/196)). +* Added :code:`sparse.kron` function (PR [#194](https://github.com/pydata/sparse/pull/194), PR [#195](https://github.com/pydata/sparse/pull/195)). * Added :code:`order` parameter to :code:`COO.reshape` to make it work with - :code:`np.reshape` (:pr:`193`). -* Added :code:`COO.mean` and :code:`sparse.nanmean` (:pr:`190`). -* Added :code:`sparse.full` and :code:`sparse.full_like` (:pr:`189`). -* Added :code:`COO.clip` method (:pr:`185`). + :code:`np.reshape` (PR [#193](https://github.com/pydata/sparse/pull/193)). +* Added :code:`COO.mean` and :code:`sparse.nanmean` (PR [#190](https://github.com/pydata/sparse/pull/190)). +* Added :code:`sparse.full` and :code:`sparse.full_like` (PR [#189](https://github.com/pydata/sparse/pull/189)). +* Added :code:`COO.clip` method (PR [#185](https://github.com/pydata/sparse/pull/185)). * Added :code:`COO.copy` method, and changed pickle of :code:`COO` to not - include its cache (:pr:`184`). + include its cache (PR [#184](https://github.com/pydata/sparse/pull/184)). * Added :code:`sparse.eye`, :code:`sparse.zeros`, :code:`sparse.zeros_like`, - :code:`sparse.ones`, and :code:`sparse.ones_like` (:pr:`183`). + :code:`sparse.ones`, and :code:`sparse.ones_like` (PR [#183](https://github.com/pydata/sparse/pull/183)). 0.4.1 / 2018-09-12 ------------------ * Allow mixed :code:`ndarray`-:code:`COO` operations if the result is sparse - (:issue:`124`, via :pr:`182`). + (Issue [#124](https://github.com/pydata/sparse/issues/124), via PR [#182](https://github.com/pydata/sparse/pull/182)). * Allow specifying a fill-value when converting from NumPy arrays - (:issue:`179`, via :pr:`180`). -* Added :code:`COO.any` and :code:`COO.all` methods (:pr:`175`). + (Issue [#179](https://github.com/pydata/sparse/issues/179), via PR [#180](https://github.com/pydata/sparse/pull/180)). +* Added :code:`COO.any` and :code:`COO.all` methods (PR [#175](https://github.com/pydata/sparse/pull/175)). * Indexing for :code:`COO` now accepts a single one-dimensional array index - (:pr:`172`). + (PR [#172](https://github.com/pydata/sparse/pull/172)). * The fill-value can now be something other than zero or :code:`False` - (:pr:`165`). -* Added a :code:`sparse.roll` function (:pr:`160`). + (PR [#165](https://github.com/pydata/sparse/pull/165)). +* Added a :code:`sparse.roll` function (PR [#160](https://github.com/pydata/sparse/pull/160)). * Numba code now releases the GIL. This leads to better multi-threaded - performance in Dask (:pr:`159`). + performance in Dask (PR [#159](https://github.com/pydata/sparse/pull/159)). * A number of bugs occurred, so to resolve them, :code:`COO.coords.dtype` is always :code:`np.int64`. :code:`COO`, therefore, uses more memory than - before (:pr:`158`). -* Add support for saving and loading :code:`COO` files from disk (:issue:`153`, - via :pr:`154`). -* Support :code:`COO.nonzero` and :code:`np.argwhere` (:issue:`145`, via - :pr:`148`). -* Allow faux in-place operations (:issue:`80`, via :pr:`146`). -* :code:`COO` is now always canonical (:pr:`141`). -* Improve indexing performance (:pr:`128`). -* Improve element-wise performance (:pr:`127`). -* Reductions now support a negative axis (:issue:`117`, via :pr:`118`). -* Match behaviour of :code:`ufunc.reduce` from NumPy (:issue:`107`, via - :pr:`108`). + before (PR [#158](https://github.com/pydata/sparse/pull/158)). +* Add support for saving and loading :code:`COO` files from disk (Issue [#153](https://github.com/pydata/sparse/issues/153), + via PR [#154](https://github.com/pydata/sparse/pull/154)). +* Support :code:`COO.nonzero` and :code:`np.argwhere` (Issue [#145](https://github.com/pydata/sparse/issues/145), via + PR [#148](https://github.com/pydata/sparse/pull/148)). +* Allow faux in-place operations (Issue [#80](https://github.com/pydata/sparse/issues/80), via PR [#146](https://github.com/pydata/sparse/pull/146)). +* :code:`COO` is now always canonical (PR [#141](https://github.com/pydata/sparse/pull/141)). +* Improve indexing performance (PR [#128](https://github.com/pydata/sparse/pull/128)). +* Improve element-wise performance (PR [#127](https://github.com/pydata/sparse/pull/127)). +* Reductions now support a negative axis (Issue [#117](https://github.com/pydata/sparse/issues/117), via PR [#118](https://github.com/pydata/sparse/pull/118)). +* Match behaviour of :code:`ufunc.reduce` from NumPy (Issue [#107](https://github.com/pydata/sparse/issues/107), via + PR [#108](https://github.com/pydata/sparse/pull/108)). 0.3.1 / 2018-04-12 ------------------ -* Fix packaging error (:pr:`138`). +* Fix packaging error (PR [#138](https://github.com/pydata/sparse/pull/138)). 0.3.0 / 2018-02-22 ------------------ -* Add NaN-skipping aggregations (:pr:`102`). -* Add equivalent to :code:`np.where` (:pr:`102`). -* N-input universal functions now work (:pr:`98`). -* Make :code:`dot` more consistent with NumPy (:pr:`96`). -* Create a base class :code:`SparseArray` (:pr:`92`). -* Minimum NumPy version is now 1.13 (:pr:`90`). +* Add NaN-skipping aggregations (PR [#102](https://github.com/pydata/sparse/pull/102)). +* Add equivalent to :code:`np.where` (PR [#102](https://github.com/pydata/sparse/pull/102)). +* N-input universal functions now work (PR [#98](https://github.com/pydata/sparse/pull/98)). +* Make :code:`dot` more consistent with NumPy (PR [#96](https://github.com/pydata/sparse/pull/96)). +* Create a base class :code:`SparseArray` (PR [#92](https://github.com/pydata/sparse/pull/92)). +* Minimum NumPy version is now 1.13 (PR [#90](https://github.com/pydata/sparse/pull/90)). * Fix a bug where setting a :code:`DOK` element to zero did nothing - (:issue:`93`, via :pr:`94`). + (Issue [#93](https://github.com/pydata/sparse/issues/93), via PR [#94](https://github.com/pydata/sparse/pull/94)). 0.2.0 / 2018-01-25 ------------------ -* Support faster :code:`np.array(COO)` (:pr:`87`). -* Add :code:`DOK` type (:pr:`85`). -* Fix sum for large arrays (:issue:`82`, via :pr:`83`). -* Support :code:`.size` and :code:`.density` (:pr:`69`). -* Documentation added for the package (:pr:`43`). -* Minimum required SciPy version is now 0.19 (:pr:`70`). -* :code:`len(COO)` now works (:pr:`68`). -* :code:`scalar op COO` now works for all operators (:pr:`67`). -* Validate axes for :code:`.transpose()` (:pr:`61`). -* Extend indexing support (:pr:`57`). -* Add :code:`random` function for generating random sparse arrays (:pr:`41`). -* :code:`COO(COO)` now copies the original object (:pr:`55`). +* Support faster :code:`np.array(COO)` (PR [#87](https://github.com/pydata/sparse/pull/87)). +* Add :code:`DOK` type (PR [#85](https://github.com/pydata/sparse/pull/85)). +* Fix sum for large arrays (Issue [#82](https://github.com/pydata/sparse/issues/82), via PR [#83](https://github.com/pydata/sparse/pull/83)). +* Support :code:`.size` and :code:`.density` (PR [#69](https://github.com/pydata/sparse/pull/69)). +* Documentation added for the package (PR [#43](https://github.com/pydata/sparse/pull/43)). +* Minimum required SciPy version is now 0.19 (PR [#70](https://github.com/pydata/sparse/pull/70)). +* :code:`len(COO)` now works (PR [#68](https://github.com/pydata/sparse/pull/68)). +* :code:`scalar op COO` now works for all operators (PR [#67](https://github.com/pydata/sparse/pull/67)). +* Validate axes for :code:`.transpose()` (PR [#61](https://github.com/pydata/sparse/pull/61)). +* Extend indexing support (PR [#57](https://github.com/pydata/sparse/pull/57)). +* Add :code:`random` function for generating random sparse arrays (PR [#41](https://github.com/pydata/sparse/pull/41)). +* :code:`COO(COO)` now copies the original object (PR [#55](https://github.com/pydata/sparse/pull/55)). * NumPy universal functions and reductions now work on :code:`COO` arrays - (:pr:`49`). -* Fix concatenate and stack for large arrays (:issue:`32`, via :pr:`51`). -* Fix :code:`nnz` for scalars (:issue:`47`, via :pr:`48`). -* Support more operators and remove all special cases (:pr:`46`). -* Add support for :code:`triu` and :code:`tril` (:pr:`40`). + (PR [#49](https://github.com/pydata/sparse/pull/49)). +* Fix concatenate and stack for large arrays (Issue [#32](https://github.com/pydata/sparse/issues/32), via PR [#51](https://github.com/pydata/sparse/pull/51)). +* Fix :code:`nnz` for scalars (Issue [#47](https://github.com/pydata/sparse/issues/47), via PR [#48](https://github.com/pydata/sparse/pull/48)). +* Support more operators and remove all special cases (PR [#46](https://github.com/pydata/sparse/pull/46)). +* Add support for :code:`triu` and :code:`tril` (PR [#40](https://github.com/pydata/sparse/pull/40)). * Add support for Ellipsis (:code:`...`) and :code:`None` when indexing - (:pr:`37`). + (PR [#37](https://github.com/pydata/sparse/pull/37)). * Add support for bitwise bindary operations like :code:`&` and :code:`|` - (:pr:`38`). -* Support broadcasting in element-wise operations (:pr:`35`). + (PR [#38](https://github.com/pydata/sparse/pull/38)). +* Support broadcasting in element-wise operations (PR [#35](https://github.com/pydata/sparse/pull/35)). diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 7a100aa1..33cea16e 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -1,3 +1,9 @@ -.md-tabs__link { - font-weight: bold; + :root { + --md-primary-fg-color: #c96c08; + --md-primary-fg-color--light: #94f2f7; + --md-primary-fg-color--dark: #335365; } + + .grid { + font-weight: bolder; + } \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index c43e3a85..c773354f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,27 +16,24 @@ dimensions.
- -

Introduction + ![Sparse](./assets/images/logo.png){width=20%, align=left} + Introduction { .card } -

-

Tutorials + + ![Sparse](./assets/images/undraw_education_f8ru.png){width=20%, align=left} + Tutorials { .card } -

-

How-to guides + How-to guides { .card } -

-

Reference - { .card } -

-

Explanation + API { .card } -

-

Something here + Explanation + { .card } + + Something here { .card } -

diff --git a/docs/introduction.md b/docs/introduction.md new file mode 100644 index 00000000..fcead3ce --- /dev/null +++ b/docs/introduction.md @@ -0,0 +1,97 @@ +# Sparse + +This implements sparse arrays of arbitrary dimension on top of +[numpy][] and +[`scipy.sparse`][]. It generalizes the +[`scipy.sparse.coo_matrix`][] and +[`scipy.sparse.dok_matrix`][] layouts, but +extends beyond just rows and columns to an arbitrary number of +dimensions. + +Additionally, this project maintains compatibility with the +[`numpy.ndarray`][] interface rather than the +[`numpy.matrix`][] interface used in +[`scipy.sparse`][] + +These differences make this project useful in certain situations where +scipy.sparse matrices are not well suited, but it should not be +considered a full replacement. The data structures in pydata/sparse +complement and can be used in conjunction with the fast linear algebra +routines inside [`scipy.sparse`][]. A format conversion or copy may be +required. + +## Motivation + +Sparse arrays, or arrays that are mostly empty or filled with zeros, are +common in many scientific applications. To save space we often avoid +storing these arrays in traditional dense formats, and instead choose +different data structures. Our choice of data structure can +significantly affect our storage and computational costs when working +with these arrays. + +## Design + +The main data structure in this library follows the [Coordinate List +(COO)](https://en.wikipedia.org/wiki/Sparse_matrix#Coordinate_list_(COO)) +layout for sparse matrices, but extends it to multiple dimensions. + +The COO layout, which stores the row index, column index, and value of +every element: + + +| row | col | data | +|-----|-----|------| +| 0 | 0 | 10 | +| 0 | 2 | 13 | +| 1 | 3 | 9 | +| 3 | 8 | 21 | + +It is straightforward to extend the COO layout to an arbitrary number of +dimensions: + + +| dim1 | dim2 | dim3 | \... | data | +|------|------|------|------|------| +| 0 | 0 | 0 | . | 10 | +| 0 | 0 | 3 | . | 13 | +| 0 | 2 | 2 | . | 9 | +| 3 | 1 | 4 | . | 21 | + +This makes it easy to *store* a multidimensional sparse array, but we +still need to reimplement all of the array operations like transpose, +reshape, slicing, tensordot, reductions, etc., which can be challenging +in general. + +This library also includes several other data structures. Similar to +COO, the [Dictionary of Keys +(DOK)](https://en.wikipedia.org/wiki/Sparse_matrix#Dictionary_of_keys_(DOK)) +format for sparse matrices generalizes well to an arbitrary number of +dimensions. DOK is well-suited for writing and mutating. Most other +operations are not supported for DOK. A common workflow may involve +writing an array with DOK and then converting to another format for +other operations. + +The [Compressed Sparse Row/Column +(CSR/CSC)](https://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_column_(CSC_or_CCS)) +formats are widely used in scientific computing are now supported by +pydata/sparse. The CSR/CSC formats excel at compression and mathematical +operations. While these formats are restricted to two dimensions, +pydata/sparse supports the GCXS sparse array format, based on [GCRS/GCCS +from](https://ieeexplore.ieee.org/abstract/document/7237032/similar#similar) +which generalizes CSR/CSC to n-dimensional arrays. Like their +two-dimensional CSR/CSC counterparts, GCXS arrays compress well. Whereas +the storage cost of COO depends heavily on the number of dimensions of +the array, the number of dimensions only minimally affects the storage +cost of GCXS arrays, which results in favorable compression ratios +across many use cases. + +Together these formats cover a wide array of applications of sparsity. +Additionally, with each format complying with the +[`numpy.ndarray`][] interface and following +the appropriate dispatching protocols, pydata/sparse arrays can interact +with other array libraries and seamlessly take part in +pydata-ecosystem-based workflows. + +## LICENSE + +This library is licensed under BSD-3. diff --git a/mkdocs.yml b/mkdocs.yml index b9241093..ccc48452 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -4,7 +4,8 @@ edit_uri: edit/main/docs/ theme: name: material palette: - primary: black + primary: custom + accent: cyan font: false #avoid Google Fonts to adhere to data privacy regulations logo: assets/images/logo.png favicon: assets/images/logo.svg @@ -65,6 +66,7 @@ plugins: nav: - index.md +- introduction.md - install.md - quickstart.md - construct.md From 0e4d148d6e45bf0fdb4ff3e7ca3f3f93e4eee0ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Sat, 27 Jul 2024 12:19:12 +0200 Subject: [PATCH 03/11] wip --- docs/assets/images/check-list-icon.png | Bin 0 -> 3882 bytes docs/assets/images/conference-room-icon.png | Bin 0 -> 5069 bytes docs/assets/images/group-discussion-icon.png | Bin 0 -> 4540 bytes .../images/install-software-download-icon.png | Bin 0 -> 4382 bytes docs/assets/images/open-book-icon.png | Bin 0 -> 4700 bytes .../images/repair-fix-repairing-icon.png | Bin 0 -> 5509 bytes docs/assets/images/undraw_education_f8ru.png | Bin 32380 -> 0 bytes docs/css/mkdocstrings.css | 1 + docs/index.md | 22 +++++++++++------- 9 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 docs/assets/images/check-list-icon.png create mode 100644 docs/assets/images/conference-room-icon.png create mode 100644 docs/assets/images/group-discussion-icon.png create mode 100644 docs/assets/images/install-software-download-icon.png create mode 100644 docs/assets/images/open-book-icon.png create mode 100644 docs/assets/images/repair-fix-repairing-icon.png delete mode 100644 docs/assets/images/undraw_education_f8ru.png diff --git a/docs/assets/images/check-list-icon.png b/docs/assets/images/check-list-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5c8477cb717412ee591ec9a77282215432ef30 GIT binary patch literal 3882 zcmd6qdsI?+yT=_nqcv$YTADg`!OFX)W|pSbgeiikkdPXhAr@pL??my{E=f%==ce2Fvo2TeHHjMA4U;&ikIV&dfUN{CD<0&)UEB{XNfb@3lYs z`#i}$Xm`!;^uJS4QPD(rz%eQ+-#{uVsw%5jDOX~yJU_1tw|r1X-IVeF`E~RAosP;Q z+DBo~*jkluR;jPuuyM1&)}7{d4hIf-pnUuSPnRTXD_l=4nk#|-DWF0-@I-HS?&)*9}r1rpm!-m8@sxS9*#V; z?Pm+UqTeuiVW>xJe{v*bt3EPe(NTcO+b`W~Vp_wulIHIv`^ObHx{}QHdd<~fCso5v z`entkgst!yN;8Up(z`|=zjuSwCqjlF+ygaBLjqq#Kv}mVUX_kwp~$ch$pV%_-ER{i zHKwr;Pw)zBTIQiAL)vS0ytIAvy$5U!x9f+DLj={PFpWnq0#x8w-7Sg>801sg;;u{G1L{n%Z>bd@+RZdf9Dk>BerlAZ zN~hR+$o_N({K|poqNj>i^(jl6G6zhZ@|;niD?=OTwk3Sr+`hG`MM!9OQG<%jwSj`b zZdy=z;0CeFQ>a*&3<`t@9BXBf^(NK@tm2L!h^qjOD?>lk!_=2g@}1vvTA9iN4!nw0kVgB}UpNghsP1*8sTsW6n@n8lgp^j;%B+EnD4mm<@?B*j< zy?b^tcZ`k^K;k+TY#NKS!Y$`kC+CASi617XyWDzUeSgjqge61bH6Q5mmRmg4Er1@L zG^K@)W?x?F8r=; z*=-&Ef6VP~0PPgl{St#N@!5fj>uZ0y$ckCnxpX67gwGBreJh&OB&lIK(p%1mW7WO5 z8K>kKTo3cL!1Lhy^^O3FdntZR1XhfK-XNnhedrjZJ(lkaH#rQ92M{KVqik7@MUGp$ zV9Y8I(;mf4Gjt5+(OvE1-FCzRx7`W4=Ul)O6rl1$)fxw*>nKY@2Jzw%7!r`w#CTO~ zw7n5<-+&R)HDsZD!H_niPB<#$O@TQTlC+5qa*vr$l2`f{X8#vzzOwx%ZJ$~EJG}I{ zm)ITIv#T+WI!_dlQj_+I{GXu>8}sC$w9dsaO}>?eERmf23l2MJEEnexeA7!auF4h}Kc(|PMwNi25Wss-^- z)`ngjbfk1$CS3X97nUQ7udy-3j|YJ5i{jRWVpEq9u-Aj5lRb00XT}>Z$5!nUq<=EO zegvybV@*b?Kk$*l#8*fOP9Q3rvAByGQ16Ij0uMZnL-~$gb9MEf(2Voi`ba~Ew>stR zW!PNJlw`-9Zo~cuF!3J_BY_8lnBvgpU+%JsKXb+zSCzH1O27qmMu>0r(EV82nU2{2 zh*cT3i*{fTpW{$fGf-tLazcRC{cWDm<(68Lwzay@-jvV_1X*WdHh7QLd2ku11j(0R zqEsze=MxX8w%RH09$FX5Wq(}kmwNZYp*rfF0}CJH|1dq%=2AW2>ZJ`l6C$>)w9D=- zBinowkwh3R;#qbZPxx)g45@Uv$u3(SR8@o`7W*(cb_gT^K;;xITUo6bkq6HMS z7fnFLvD!ccSmJ*j=r1>0)USw-*@bZ!*sjOu-cAlyM3P}LGW~^7U#XlQ25ZoWI<>xJ z=B)+xxrLDdkZLaJt=v}p{$@*)jsd{CEkbxoP3>imp~s%k=}J-CrFLUY&>DYoXG1P7 z$ywjozs&n#HV6C(*gDkR&iBK}9xXivn@L8Bvhx#Qx})2&DEBEf@@Gy9z%2NQ;w-11>f#1DIl0=l$l zLLQR`_8rX&fg3BiL4GQ{u*v{w$xo){)R7YaaMn1yUM(BNqp#Q+>ieS@LQtSK!wIvM z$s+@Z^bngH0Rc6E-ox9v!ztt)^6pi^^%{J3|Ffej(c$mnpTa4ExZ6&vWAaEZ?*KMm z{P3$q{e``Kb;>W{tFI72Rj{di`uN`2R8gr}XW1_6Q`|3)( zS|~;eTq+$7Iozsk$!3owo}r0Y&aKW0dL{{TZ?Mmv=}|-|duEcOC`5ly!D(XdZR`?^ z;4lQBe+fPxY1^OBru{kF?o4gF|VqwhaCx!B@kcGq7A zyXAph^a(X+Fxz<(K4zaG##J{I?`uKY2G8k_UZVxO|auzEZNbo$2aZT=DRg+@mTnPg>=ARaoCKeWR z%pSAicMQtd^5eo4-WD7O?A8|+_#bj1cJbvZfT5Z&mAeDBR5Nd<^r~lZ?-zH+#Q0QP z17od5^P~vf7@xx}_+s0O>xPeeAn-&IIk-f%D>TlP@lNv2s5^0UidOfSBy99 z`k+#`>q6RW!xh(w@#&4TvS*f*Kh$S^x}#D_zAZ+ks{=>FulX8uUa0n`vL zy!E76!(!?EwDe=B(hUCHCz5E&M<=S<-7`I>DL^xo@#sGV!yra~y528Iw?_|cIogVy z8Dlro)3|geg+v&R^A`3r!&|Gp9Z3#|USWBm)^{}t5#PV~QeA4MxDc!3eL2cUX%t5AX_jV_wVcN%Z#I#M&}q3qnn zDYt#rz1)P|r&h5q%Z9j5jksp)hRqKNXOuI*=Fc-gvev|jU@gS9KH`RX8C*5nEa6U# zJeZQdd(HGNsj+PT?K`ternG$|okp(*e6a7t=0^Lm2#TJqX2(^jHO+>!h0bf$1$eCo zXDIC*VAIdZ$2N@x@z@94M~`^TNgW$D=Al||k$gu=*|vGk8lK|1q5yGRb*Dd@gr%5v zUQf5I&k09c8W(!nkfLGLpcc(eE!1r={dZ0PSKgKu9$lFd?q%s)V03;}4t+-#*e%8X zK7aftR-XOk@C}0BY+8v-oW)De=4w#y{FRB4aL}|p?DD?xGjB%D2~mjI%N7K5QZwE1 b?d*apYXqWI)0Xajo_G;%Xn6IHCw}=S6F*Be literal 0 HcmV?d00001 diff --git a/docs/assets/images/conference-room-icon.png b/docs/assets/images/conference-room-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ccb4fb6039d5ae1e71b59f0c37697546031cabd GIT binary patch literal 5069 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 Zb3k4|y^D-DuL`&jT`dF6YIRJ+e*p9s6S)8Y literal 0 HcmV?d00001 diff --git a/docs/assets/images/group-discussion-icon.png b/docs/assets/images/group-discussion-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76cf41bda253a0479a36286a9541390696f173db GIT binary patch literal 4540 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 EAMsPM@Bjb+ literal 0 HcmV?d00001 diff --git a/docs/assets/images/open-book-icon.png b/docs/assets/images/open-book-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53a689d59ffce1c0264ab68406470ba7d742d8a0 GIT binary patch literal 4700 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/repair-fix-repairing-icon.png b/docs/assets/images/repair-fix-repairing-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e180e0f16e896cec9676ce0171f7c2bfc1ced38e GIT binary patch literal 5509 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/undraw_education_f8ru.png b/docs/assets/images/undraw_education_f8ru.png deleted file mode 100644 index 871a87566e1267bd34866a44cd49d2749e64f8e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32380 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 S0XoDHh#S{5uNEqqKl&d+ngN&q diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 33cea16e..9743f709 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -6,4 +6,5 @@ .grid { font-weight: bolder; + font-size: 160%; } \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index c773354f..d08204a8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -14,26 +14,32 @@ extends beyond just rows and columns to an arbitrary number of dimensions.

- +![Sparse](./assets/images/logo.png){width=20%, align=left}
From a4063db216005adcc7ef7d6861010bb373119cc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 09:51:57 +0200 Subject: [PATCH 04/11] wip divio + jupyter --- docs/completed-tasks.md | 1 + docs/css/mkdocstrings.css | 1 + docs/examples/sparse_finch.ipynb | 364 ++++++++++++++++++ docs/generated/sparse.COO.T.rst | 6 - docs/generated/sparse.COO.all.rst | 6 - docs/generated/sparse.COO.any.rst | 6 - docs/generated/sparse.COO.asformat.rst | 6 - docs/generated/sparse.COO.astype.rst | 6 - docs/generated/sparse.COO.broadcast_to.rst | 6 - docs/generated/sparse.COO.clip.rst | 6 - docs/generated/sparse.COO.conj.rst | 6 - docs/generated/sparse.COO.copy.rst | 6 - docs/generated/sparse.COO.density.rst | 6 - docs/generated/sparse.COO.dot.rst | 6 - docs/generated/sparse.COO.dtype.rst | 6 - docs/generated/sparse.COO.enable_caching.rst | 6 - docs/generated/sparse.COO.flatten.rst | 6 - docs/generated/sparse.COO.from_iter.rst | 6 - docs/generated/sparse.COO.from_numpy.rst | 6 - .../sparse.COO.from_scipy_sparse.rst | 6 - docs/generated/sparse.COO.imag.rst | 6 - docs/generated/sparse.COO.linear_loc.rst | 6 - docs/generated/sparse.COO.max.rst | 6 - docs/generated/sparse.COO.maybe_densify.rst | 6 - docs/generated/sparse.COO.mean.rst | 6 - docs/generated/sparse.COO.min.rst | 6 - docs/generated/sparse.COO.nbytes.rst | 6 - docs/generated/sparse.COO.ndim.rst | 6 - docs/generated/sparse.COO.nnz.rst | 6 - docs/generated/sparse.COO.nonzero.rst | 6 - docs/generated/sparse.COO.prod.rst | 6 - docs/generated/sparse.COO.real.rst | 6 - docs/generated/sparse.COO.reduce.rst | 6 - docs/generated/sparse.COO.reshape.rst | 6 - docs/generated/sparse.COO.resize.rst | 6 - docs/generated/sparse.COO.round.rst | 6 - docs/generated/sparse.COO.rst | 88 ----- docs/generated/sparse.COO.size.rst | 6 - docs/generated/sparse.COO.std.rst | 6 - docs/generated/sparse.COO.sum.rst | 6 - docs/generated/sparse.COO.swapaxes.rst | 6 - docs/generated/sparse.COO.to_scipy_sparse.rst | 6 - docs/generated/sparse.COO.tocsc.rst | 6 - docs/generated/sparse.COO.tocsr.rst | 6 - docs/generated/sparse.COO.todense.rst | 6 - docs/generated/sparse.COO.transpose.rst | 6 - docs/generated/sparse.COO.var.rst | 6 - docs/generated/sparse.DOK.asformat.rst | 6 - docs/generated/sparse.DOK.density.rst | 6 - docs/generated/sparse.DOK.from_coo.rst | 6 - docs/generated/sparse.DOK.from_numpy.rst | 6 - .../sparse.DOK.from_scipy_sparse.rst | 6 - docs/generated/sparse.DOK.ndim.rst | 6 - docs/generated/sparse.DOK.nnz.rst | 6 - docs/generated/sparse.DOK.rst | 44 --- docs/generated/sparse.DOK.size.rst | 6 - docs/generated/sparse.DOK.to_coo.rst | 6 - docs/generated/sparse.DOK.todense.rst | 6 - docs/generated/sparse.GCXS.T.rst | 6 - docs/generated/sparse.GCXS.__init__.rst | 6 - docs/generated/sparse.GCXS.all.rst | 6 - docs/generated/sparse.GCXS.amax.rst | 6 - docs/generated/sparse.GCXS.amin.rst | 6 - docs/generated/sparse.GCXS.any.rst | 6 - docs/generated/sparse.GCXS.asformat.rst | 6 - docs/generated/sparse.GCXS.astype.rst | 6 - .../sparse.GCXS.change_compressed_axes.rst | 6 - docs/generated/sparse.GCXS.clip.rst | 6 - .../generated/sparse.GCXS.compressed_axes.rst | 6 - docs/generated/sparse.GCXS.conj.rst | 6 - docs/generated/sparse.GCXS.copy.rst | 6 - docs/generated/sparse.GCXS.density.rst | 6 - docs/generated/sparse.GCXS.dot.rst | 6 - docs/generated/sparse.GCXS.dtype.rst | 6 - docs/generated/sparse.GCXS.flatten.rst | 6 - docs/generated/sparse.GCXS.from_coo.rst | 6 - docs/generated/sparse.GCXS.from_iter.rst | 6 - docs/generated/sparse.GCXS.from_numpy.rst | 6 - .../sparse.GCXS.from_scipy_sparse.rst | 6 - docs/generated/sparse.GCXS.imag.rst | 6 - docs/generated/sparse.GCXS.max.rst | 6 - docs/generated/sparse.GCXS.maybe_densify.rst | 6 - docs/generated/sparse.GCXS.mean.rst | 6 - docs/generated/sparse.GCXS.min.rst | 6 - docs/generated/sparse.GCXS.nbytes.rst | 6 - docs/generated/sparse.GCXS.ndim.rst | 6 - docs/generated/sparse.GCXS.nnz.rst | 6 - docs/generated/sparse.GCXS.prod.rst | 6 - docs/generated/sparse.GCXS.real.rst | 6 - docs/generated/sparse.GCXS.reduce.rst | 6 - docs/generated/sparse.GCXS.reshape.rst | 6 - docs/generated/sparse.GCXS.round.rst | 6 - docs/generated/sparse.GCXS.round_.rst | 6 - docs/generated/sparse.GCXS.rst | 109 ------ docs/generated/sparse.GCXS.size.rst | 6 - docs/generated/sparse.GCXS.std.rst | 6 - docs/generated/sparse.GCXS.sum.rst | 6 - .../generated/sparse.GCXS.to_scipy_sparse.rst | 6 - docs/generated/sparse.GCXS.tocoo.rst | 6 - docs/generated/sparse.GCXS.todense.rst | 6 - docs/generated/sparse.GCXS.todok.rst | 6 - docs/generated/sparse.GCXS.transpose.rst | 6 - docs/generated/sparse.GCXS.var.rst | 6 - .../generated/sparse.SparseArray.asformat.rst | 6 - docs/generated/sparse.SparseArray.density.rst | 6 - docs/generated/sparse.SparseArray.ndim.rst | 6 - docs/generated/sparse.SparseArray.nnz.rst | 6 - docs/generated/sparse.SparseArray.rst | 22 -- docs/generated/sparse.SparseArray.size.rst | 6 - docs/generated/sparse.SparseArray.todense.rst | 6 - docs/generated/sparse.abs.rst | 6 - docs/generated/sparse.all.rst | 6 - docs/generated/sparse.any.rst | 6 - docs/generated/sparse.argmax.rst | 6 - docs/generated/sparse.argmin.rst | 6 - docs/generated/sparse.argwhere.rst | 6 - docs/generated/sparse.asCOO.rst | 6 - docs/generated/sparse.as_coo.rst | 6 - docs/generated/sparse.asarray.rst | 6 - docs/generated/sparse.asnumpy.rst | 6 - docs/generated/sparse.astype.rst | 6 - docs/generated/sparse.broadcast_arrays.rst | 6 - docs/generated/sparse.broadcast_to.rst | 6 - docs/generated/sparse.clip.rst | 6 - docs/generated/sparse.concat.rst | 6 - docs/generated/sparse.concatenate.rst | 6 - docs/generated/sparse.diagonal.rst | 6 - docs/generated/sparse.diagonalize.rst | 6 - docs/generated/sparse.dot.rst | 6 - docs/generated/sparse.einsum.rst | 6 - docs/generated/sparse.elemwise.rst | 6 - docs/generated/sparse.empty.rst | 6 - docs/generated/sparse.empty_like.rst | 6 - docs/generated/sparse.equal.rst | 6 - docs/generated/sparse.expand_dims.rst | 6 - docs/generated/sparse.eye.rst | 6 - docs/generated/sparse.flip.rst | 6 - docs/generated/sparse.full.rst | 6 - docs/generated/sparse.full_like.rst | 6 - docs/generated/sparse.isinf.rst | 6 - docs/generated/sparse.isnan.rst | 6 - docs/generated/sparse.isneginf.rst | 6 - docs/generated/sparse.isposinf.rst | 6 - docs/generated/sparse.kron.rst | 6 - docs/generated/sparse.load_npz.rst | 6 - docs/generated/sparse.matmul.rst | 6 - docs/generated/sparse.matrix_transpose.rst | 6 - docs/generated/sparse.max.rst | 6 - docs/generated/sparse.mean.rst | 6 - docs/generated/sparse.min.rst | 6 - docs/generated/sparse.moveaxis.rst | 6 - docs/generated/sparse.nanmax.rst | 6 - docs/generated/sparse.nanmean.rst | 6 - docs/generated/sparse.nanmin.rst | 6 - docs/generated/sparse.nanprod.rst | 6 - docs/generated/sparse.nanreduce.rst | 6 - docs/generated/sparse.nansum.rst | 6 - docs/generated/sparse.nonzero.rst | 6 - docs/generated/sparse.ones.rst | 6 - docs/generated/sparse.ones_like.rst | 6 - docs/generated/sparse.outer.rst | 6 - docs/generated/sparse.pad.rst | 6 - docs/generated/sparse.permute_dims.rst | 6 - docs/generated/sparse.prod.rst | 6 - docs/generated/sparse.random.rst | 6 - docs/generated/sparse.reshape.rst | 6 - docs/generated/sparse.result_type.rst | 6 - docs/generated/sparse.roll.rst | 6 - docs/generated/sparse.round.rst | 6 - docs/generated/sparse.rst | 177 --------- docs/generated/sparse.save_npz.rst | 6 - docs/generated/sparse.sort.rst | 6 - docs/generated/sparse.squeeze.rst | 6 - docs/generated/sparse.stack.rst | 6 - docs/generated/sparse.std.rst | 6 - docs/generated/sparse.sum.rst | 6 - docs/generated/sparse.take.rst | 6 - docs/generated/sparse.tensordot.rst | 6 - docs/generated/sparse.tril.rst | 6 - docs/generated/sparse.triu.rst | 6 - docs/generated/sparse.unique_counts.rst | 6 - docs/generated/sparse.unique_values.rst | 6 - docs/generated/sparse.var.rst | 6 - docs/generated/sparse.vecdot.rst | 6 - docs/generated/sparse.where.rst | 6 - docs/generated/sparse.zeros.rst | 6 - docs/generated/sparse.zeros_like.rst | 6 - docs/how-to-guides.md | 5 + docs/index.md | 8 +- mkdocs.yml | 102 +++-- pyproject.toml | 1 + 191 files changed, 442 insertions(+), 1554 deletions(-) create mode 100644 docs/completed-tasks.md create mode 100644 docs/examples/sparse_finch.ipynb delete mode 100644 docs/generated/sparse.COO.T.rst delete mode 100644 docs/generated/sparse.COO.all.rst delete mode 100644 docs/generated/sparse.COO.any.rst delete mode 100644 docs/generated/sparse.COO.asformat.rst delete mode 100644 docs/generated/sparse.COO.astype.rst delete mode 100644 docs/generated/sparse.COO.broadcast_to.rst delete mode 100644 docs/generated/sparse.COO.clip.rst delete mode 100644 docs/generated/sparse.COO.conj.rst delete mode 100644 docs/generated/sparse.COO.copy.rst delete mode 100644 docs/generated/sparse.COO.density.rst delete mode 100644 docs/generated/sparse.COO.dot.rst delete mode 100644 docs/generated/sparse.COO.dtype.rst delete mode 100644 docs/generated/sparse.COO.enable_caching.rst delete mode 100644 docs/generated/sparse.COO.flatten.rst delete mode 100644 docs/generated/sparse.COO.from_iter.rst delete mode 100644 docs/generated/sparse.COO.from_numpy.rst delete mode 100644 docs/generated/sparse.COO.from_scipy_sparse.rst delete mode 100644 docs/generated/sparse.COO.imag.rst delete mode 100644 docs/generated/sparse.COO.linear_loc.rst delete mode 100644 docs/generated/sparse.COO.max.rst delete mode 100644 docs/generated/sparse.COO.maybe_densify.rst delete mode 100644 docs/generated/sparse.COO.mean.rst delete mode 100644 docs/generated/sparse.COO.min.rst delete mode 100644 docs/generated/sparse.COO.nbytes.rst delete mode 100644 docs/generated/sparse.COO.ndim.rst delete mode 100644 docs/generated/sparse.COO.nnz.rst delete mode 100644 docs/generated/sparse.COO.nonzero.rst delete mode 100644 docs/generated/sparse.COO.prod.rst delete mode 100644 docs/generated/sparse.COO.real.rst delete mode 100644 docs/generated/sparse.COO.reduce.rst delete mode 100644 docs/generated/sparse.COO.reshape.rst delete mode 100644 docs/generated/sparse.COO.resize.rst delete mode 100644 docs/generated/sparse.COO.round.rst delete mode 100644 docs/generated/sparse.COO.rst delete mode 100644 docs/generated/sparse.COO.size.rst delete mode 100644 docs/generated/sparse.COO.std.rst delete mode 100644 docs/generated/sparse.COO.sum.rst delete mode 100644 docs/generated/sparse.COO.swapaxes.rst delete mode 100644 docs/generated/sparse.COO.to_scipy_sparse.rst delete mode 100644 docs/generated/sparse.COO.tocsc.rst delete mode 100644 docs/generated/sparse.COO.tocsr.rst delete mode 100644 docs/generated/sparse.COO.todense.rst delete mode 100644 docs/generated/sparse.COO.transpose.rst delete mode 100644 docs/generated/sparse.COO.var.rst delete mode 100644 docs/generated/sparse.DOK.asformat.rst delete mode 100644 docs/generated/sparse.DOK.density.rst delete mode 100644 docs/generated/sparse.DOK.from_coo.rst delete mode 100644 docs/generated/sparse.DOK.from_numpy.rst delete mode 100644 docs/generated/sparse.DOK.from_scipy_sparse.rst delete mode 100644 docs/generated/sparse.DOK.ndim.rst delete mode 100644 docs/generated/sparse.DOK.nnz.rst delete mode 100644 docs/generated/sparse.DOK.rst delete mode 100644 docs/generated/sparse.DOK.size.rst delete mode 100644 docs/generated/sparse.DOK.to_coo.rst delete mode 100644 docs/generated/sparse.DOK.todense.rst delete mode 100644 docs/generated/sparse.GCXS.T.rst delete mode 100644 docs/generated/sparse.GCXS.__init__.rst delete mode 100644 docs/generated/sparse.GCXS.all.rst delete mode 100644 docs/generated/sparse.GCXS.amax.rst delete mode 100644 docs/generated/sparse.GCXS.amin.rst delete mode 100644 docs/generated/sparse.GCXS.any.rst delete mode 100644 docs/generated/sparse.GCXS.asformat.rst delete mode 100644 docs/generated/sparse.GCXS.astype.rst delete mode 100644 docs/generated/sparse.GCXS.change_compressed_axes.rst delete mode 100644 docs/generated/sparse.GCXS.clip.rst delete mode 100644 docs/generated/sparse.GCXS.compressed_axes.rst delete mode 100644 docs/generated/sparse.GCXS.conj.rst delete mode 100644 docs/generated/sparse.GCXS.copy.rst delete mode 100644 docs/generated/sparse.GCXS.density.rst delete mode 100644 docs/generated/sparse.GCXS.dot.rst delete mode 100644 docs/generated/sparse.GCXS.dtype.rst delete mode 100644 docs/generated/sparse.GCXS.flatten.rst delete mode 100644 docs/generated/sparse.GCXS.from_coo.rst delete mode 100644 docs/generated/sparse.GCXS.from_iter.rst delete mode 100644 docs/generated/sparse.GCXS.from_numpy.rst delete mode 100644 docs/generated/sparse.GCXS.from_scipy_sparse.rst delete mode 100644 docs/generated/sparse.GCXS.imag.rst delete mode 100644 docs/generated/sparse.GCXS.max.rst delete mode 100644 docs/generated/sparse.GCXS.maybe_densify.rst delete mode 100644 docs/generated/sparse.GCXS.mean.rst delete mode 100644 docs/generated/sparse.GCXS.min.rst delete mode 100644 docs/generated/sparse.GCXS.nbytes.rst delete mode 100644 docs/generated/sparse.GCXS.ndim.rst delete mode 100644 docs/generated/sparse.GCXS.nnz.rst delete mode 100644 docs/generated/sparse.GCXS.prod.rst delete mode 100644 docs/generated/sparse.GCXS.real.rst delete mode 100644 docs/generated/sparse.GCXS.reduce.rst delete mode 100644 docs/generated/sparse.GCXS.reshape.rst delete mode 100644 docs/generated/sparse.GCXS.round.rst delete mode 100644 docs/generated/sparse.GCXS.round_.rst delete mode 100644 docs/generated/sparse.GCXS.rst delete mode 100644 docs/generated/sparse.GCXS.size.rst delete mode 100644 docs/generated/sparse.GCXS.std.rst delete mode 100644 docs/generated/sparse.GCXS.sum.rst delete mode 100644 docs/generated/sparse.GCXS.to_scipy_sparse.rst delete mode 100644 docs/generated/sparse.GCXS.tocoo.rst delete mode 100644 docs/generated/sparse.GCXS.todense.rst delete mode 100644 docs/generated/sparse.GCXS.todok.rst delete mode 100644 docs/generated/sparse.GCXS.transpose.rst delete mode 100644 docs/generated/sparse.GCXS.var.rst delete mode 100644 docs/generated/sparse.SparseArray.asformat.rst delete mode 100644 docs/generated/sparse.SparseArray.density.rst delete mode 100644 docs/generated/sparse.SparseArray.ndim.rst delete mode 100644 docs/generated/sparse.SparseArray.nnz.rst delete mode 100644 docs/generated/sparse.SparseArray.rst delete mode 100644 docs/generated/sparse.SparseArray.size.rst delete mode 100644 docs/generated/sparse.SparseArray.todense.rst delete mode 100644 docs/generated/sparse.abs.rst delete mode 100644 docs/generated/sparse.all.rst delete mode 100644 docs/generated/sparse.any.rst delete mode 100644 docs/generated/sparse.argmax.rst delete mode 100644 docs/generated/sparse.argmin.rst delete mode 100644 docs/generated/sparse.argwhere.rst delete mode 100644 docs/generated/sparse.asCOO.rst delete mode 100644 docs/generated/sparse.as_coo.rst delete mode 100644 docs/generated/sparse.asarray.rst delete mode 100644 docs/generated/sparse.asnumpy.rst delete mode 100644 docs/generated/sparse.astype.rst delete mode 100644 docs/generated/sparse.broadcast_arrays.rst delete mode 100644 docs/generated/sparse.broadcast_to.rst delete mode 100644 docs/generated/sparse.clip.rst delete mode 100644 docs/generated/sparse.concat.rst delete mode 100644 docs/generated/sparse.concatenate.rst delete mode 100644 docs/generated/sparse.diagonal.rst delete mode 100644 docs/generated/sparse.diagonalize.rst delete mode 100644 docs/generated/sparse.dot.rst delete mode 100644 docs/generated/sparse.einsum.rst delete mode 100644 docs/generated/sparse.elemwise.rst delete mode 100644 docs/generated/sparse.empty.rst delete mode 100644 docs/generated/sparse.empty_like.rst delete mode 100644 docs/generated/sparse.equal.rst delete mode 100644 docs/generated/sparse.expand_dims.rst delete mode 100644 docs/generated/sparse.eye.rst delete mode 100644 docs/generated/sparse.flip.rst delete mode 100644 docs/generated/sparse.full.rst delete mode 100644 docs/generated/sparse.full_like.rst delete mode 100644 docs/generated/sparse.isinf.rst delete mode 100644 docs/generated/sparse.isnan.rst delete mode 100644 docs/generated/sparse.isneginf.rst delete mode 100644 docs/generated/sparse.isposinf.rst delete mode 100644 docs/generated/sparse.kron.rst delete mode 100644 docs/generated/sparse.load_npz.rst delete mode 100644 docs/generated/sparse.matmul.rst delete mode 100644 docs/generated/sparse.matrix_transpose.rst delete mode 100644 docs/generated/sparse.max.rst delete mode 100644 docs/generated/sparse.mean.rst delete mode 100644 docs/generated/sparse.min.rst delete mode 100644 docs/generated/sparse.moveaxis.rst delete mode 100644 docs/generated/sparse.nanmax.rst delete mode 100644 docs/generated/sparse.nanmean.rst delete mode 100644 docs/generated/sparse.nanmin.rst delete mode 100644 docs/generated/sparse.nanprod.rst delete mode 100644 docs/generated/sparse.nanreduce.rst delete mode 100644 docs/generated/sparse.nansum.rst delete mode 100644 docs/generated/sparse.nonzero.rst delete mode 100644 docs/generated/sparse.ones.rst delete mode 100644 docs/generated/sparse.ones_like.rst delete mode 100644 docs/generated/sparse.outer.rst delete mode 100644 docs/generated/sparse.pad.rst delete mode 100644 docs/generated/sparse.permute_dims.rst delete mode 100644 docs/generated/sparse.prod.rst delete mode 100644 docs/generated/sparse.random.rst delete mode 100644 docs/generated/sparse.reshape.rst delete mode 100644 docs/generated/sparse.result_type.rst delete mode 100644 docs/generated/sparse.roll.rst delete mode 100644 docs/generated/sparse.round.rst delete mode 100644 docs/generated/sparse.rst delete mode 100644 docs/generated/sparse.save_npz.rst delete mode 100644 docs/generated/sparse.sort.rst delete mode 100644 docs/generated/sparse.squeeze.rst delete mode 100644 docs/generated/sparse.stack.rst delete mode 100644 docs/generated/sparse.std.rst delete mode 100644 docs/generated/sparse.sum.rst delete mode 100644 docs/generated/sparse.take.rst delete mode 100644 docs/generated/sparse.tensordot.rst delete mode 100644 docs/generated/sparse.tril.rst delete mode 100644 docs/generated/sparse.triu.rst delete mode 100644 docs/generated/sparse.unique_counts.rst delete mode 100644 docs/generated/sparse.unique_values.rst delete mode 100644 docs/generated/sparse.var.rst delete mode 100644 docs/generated/sparse.vecdot.rst delete mode 100644 docs/generated/sparse.where.rst delete mode 100644 docs/generated/sparse.zeros.rst delete mode 100644 docs/generated/sparse.zeros_like.rst create mode 100644 docs/how-to-guides.md diff --git a/docs/completed-tasks.md b/docs/completed-tasks.md new file mode 100644 index 00000000..52330ac0 --- /dev/null +++ b/docs/completed-tasks.md @@ -0,0 +1 @@ +[Completed tasks](roadmap.md#completed-tasks) \ No newline at end of file diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 9743f709..fb545568 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -7,4 +7,5 @@ .grid { font-weight: bolder; font-size: 160%; + font-family: Georgia, serif; } \ No newline at end of file diff --git a/docs/examples/sparse_finch.ipynb b/docs/examples/sparse_finch.ipynb new file mode 100644 index 00000000..7a43a869 --- /dev/null +++ b/docs/examples/sparse_finch.ipynb @@ -0,0 +1,364 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finch backend for `sparse`\n", + "\n", + "[![Open in\n", + "Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pydata/sparse/blob/main/examples/sparse_finch.ipynb) to download and run." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pip install 'sparse[finch]==0.16.0a9' scipy\n", + "# export SPARSE_BACKEND=Finch\n", + "\n", + "# let's make sure we're using Finch backend\n", + "import os\n", + "\n", + "os.environ[\"SPARSE_BACKEND\"] = \"Finch\"\n", + "CI_MODE = os.getenv(\"CI_MODE\", default=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import importlib\n", + "import time\n", + "\n", + "import sparse\n", + "\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import numpy as np\n", + "import scipy.sparse as sps\n", + "import scipy.sparse.linalg as splin\n", + "\n", + "assert sparse.BackendType.Finch == sparse.BACKEND" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tns = sparse.asarray(np.zeros((10, 10))) # offers a no-copy constructor for NumPy as scipy.sparse inputs\n", + "\n", + "s1 = sparse.random((100, 10), density=0.01) # creates random COO tensor\n", + "s2 = sparse.random((100, 100, 10), density=0.01)\n", + "s2 = sparse.asarray(s2, format=\"csf\") # can be used to rewrite tensor to a new format\n", + "\n", + "result = sparse.tensordot(s1, s2, axes=([0, 1], [0, 2]))\n", + "\n", + "total = sparse.sum(result * result)\n", + "print(total)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example: least squares - closed form" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "y = sparse.random((100, 1), density=0.08)\n", + "X = sparse.random((100, 5), density=0.08)\n", + "X = sparse.asarray(X, format=\"csc\")\n", + "X_lazy = sparse.lazy(X)\n", + "\n", + "X_X = sparse.compute(sparse.permute_dims(X_lazy, (1, 0)) @ X_lazy, verbose=True)\n", + "\n", + "X_X = sparse.asarray(X_X, format=\"csc\") # move back from dense to CSC format\n", + "\n", + "inverted = splin.inv(X_X) # dispatching to scipy.sparse.sparray\n", + "\n", + "b_hat = (inverted @ sparse.permute_dims(X, (1, 0))) @ y\n", + "\n", + "print(b_hat.todense())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Benchmark plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ITERS = 3\n", + "rng = np.random.default_rng(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.style.use(\"seaborn-v0_8\")\n", + "plt.rcParams[\"figure.dpi\"] = 400\n", + "plt.rcParams[\"figure.figsize\"] = [8, 4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark(func, info, args) -> float:\n", + " start = time.time()\n", + " for _ in range(ITERS):\n", + " func(*args)\n", + " elapsed = time.time() - start\n", + " return elapsed / ITERS" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"MTTKRP Example:\\n\")\n", + "\n", + "os.environ[sparse._ENV_VAR_NAME] = \"Numba\"\n", + "importlib.reload(sparse)\n", + "\n", + "configs = [\n", + " {\"I_\": 100, \"J_\": 25, \"K_\": 10, \"L_\": 10, \"DENSITY\": 0.001},\n", + " {\"I_\": 100, \"J_\": 25, \"K_\": 100, \"L_\": 10, \"DENSITY\": 0.001},\n", + " {\"I_\": 100, \"J_\": 25, \"K_\": 100, \"L_\": 100, \"DENSITY\": 0.001},\n", + " {\"I_\": 1000, \"J_\": 25, \"K_\": 100, \"L_\": 100, \"DENSITY\": 0.001},\n", + " {\"I_\": 1000, \"J_\": 25, \"K_\": 1000, \"L_\": 100, \"DENSITY\": 0.001},\n", + " {\"I_\": 1000, \"J_\": 25, \"K_\": 1000, \"L_\": 1000, \"DENSITY\": 0.001},\n", + "]\n", + "nonzeros = [10000, 100_000, 1_000_000, 10_000_000, 100_000_000, 1_000_000_000]\n", + "\n", + "if CI_MODE:\n", + " configs = configs[:1]\n", + " nonzeros = nonzeros[:1]\n", + "\n", + "finch_times = []\n", + "numba_times = []\n", + "\n", + "for config in configs:\n", + " B_sps = sparse.random((config[\"I_\"], config[\"K_\"], config[\"L_\"]), density=config[\"DENSITY\"], random_state=rng) * 10\n", + " D_sps = rng.random((config[\"L_\"], config[\"J_\"])) * 10\n", + " C_sps = rng.random((config[\"K_\"], config[\"J_\"])) * 10\n", + "\n", + " # ======= Finch =======\n", + " os.environ[sparse._ENV_VAR_NAME] = \"Finch\"\n", + " importlib.reload(sparse)\n", + "\n", + " B = sparse.asarray(B_sps.todense(), format=\"csf\")\n", + " D = sparse.asarray(np.array(D_sps, order=\"F\"))\n", + " C = sparse.asarray(np.array(C_sps, order=\"F\"))\n", + "\n", + " @sparse.compiled\n", + " def mttkrp_finch(B, D, C):\n", + " return sparse.sum(B[:, :, :, None] * D[None, None, :, :] * C[None, :, None, :], axis=(1, 2))\n", + "\n", + " # Compile\n", + " result_finch = mttkrp_finch(B, D, C)\n", + " # Benchmark\n", + " time_finch = benchmark(mttkrp_finch, info=\"Finch\", args=[B, D, C])\n", + "\n", + " # ======= Numba =======\n", + " os.environ[sparse._ENV_VAR_NAME] = \"Numba\"\n", + " importlib.reload(sparse)\n", + "\n", + " B = sparse.asarray(B_sps, format=\"gcxs\")\n", + " D = D_sps\n", + " C = C_sps\n", + "\n", + " def mttkrp_numba(B, D, C):\n", + " return sparse.sum(B[:, :, :, None] * D[None, None, :, :] * C[None, :, None, :], axis=(1, 2))\n", + "\n", + " # Compile\n", + " result_numba = mttkrp_numba(B, D, C)\n", + " # Benchmark\n", + " time_numba = benchmark(mttkrp_numba, info=\"Numba\", args=[B, D, C])\n", + "\n", + " np.testing.assert_allclose(result_finch.todense(), result_numba.todense())\n", + " finch_times.append(time_finch)\n", + " numba_times.append(time_numba)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(nrows=1, ncols=1)\n", + "\n", + "ax.plot(nonzeros, finch_times, \"o-\", label=\"Finch\")\n", + "ax.plot(nonzeros, numba_times, \"o-\", label=\"Numba\")\n", + "ax.grid(True)\n", + "ax.set_xlabel(\"no. of elements\")\n", + "ax.set_ylabel(\"time (sec)\")\n", + "ax.set_title(\"MTTKRP\")\n", + "ax.set_xscale(\"log\")\n", + "ax.set_yscale(\"log\")\n", + "ax.legend(loc=\"best\", numpoints=1)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"SDDMM Example:\\n\")\n", + "\n", + "configs = [\n", + " {\"LEN\": 10, \"DENSITY\": 0.1},\n", + " {\"LEN\": 50, \"DENSITY\": 0.05},\n", + " {\"LEN\": 100, \"DENSITY\": 0.01},\n", + " {\"LEN\": 500, \"DENSITY\": 0.005},\n", + " {\"LEN\": 1000, \"DENSITY\": 0.001},\n", + " {\"LEN\": 5000, \"DENSITY\": 0.00005},\n", + " {\"LEN\": 10000, \"DENSITY\": 0.00001},\n", + "]\n", + "size_n = [10, 50, 100, 500, 1000, 5000, 10000]\n", + "\n", + "if CI_MODE:\n", + " configs = configs[:1]\n", + " size_n = size_n[:1]\n", + "\n", + "finch_times = []\n", + "numba_times = []\n", + "scipy_times = []\n", + "\n", + "for config in configs:\n", + " LEN = config[\"LEN\"]\n", + " DENSITY = config[\"DENSITY\"]\n", + "\n", + " a_sps = rng.random((LEN, LEN)) * 10\n", + " b_sps = rng.random((LEN, LEN)) * 10\n", + " s_sps = sps.random(LEN, LEN, format=\"coo\", density=DENSITY, random_state=rng) * 10\n", + " s_sps.sum_duplicates()\n", + "\n", + " # ======= Finch =======\n", + " os.environ[sparse._ENV_VAR_NAME] = \"Finch\"\n", + " importlib.reload(sparse)\n", + "\n", + " s = sparse.asarray(s_sps)\n", + " a = sparse.asarray(np.array(a_sps, order=\"F\"))\n", + " b = sparse.asarray(np.array(b_sps, order=\"C\"))\n", + "\n", + " @sparse.compiled\n", + " def sddmm_finch(s, a, b):\n", + " return sparse.sum(\n", + " s[:, :, None] * (a[:, None, :] * sparse.permute_dims(b, (1, 0))[None, :, :]),\n", + " axis=-1,\n", + " )\n", + "\n", + " # Compile\n", + " result_finch = sddmm_finch(s, a, b)\n", + " # Benchmark\n", + " time_finch = benchmark(sddmm_finch, info=\"Finch\", args=[s, a, b])\n", + "\n", + " # ======= Numba =======\n", + " os.environ[sparse._ENV_VAR_NAME] = \"Numba\"\n", + " importlib.reload(sparse)\n", + "\n", + " s = sparse.asarray(s_sps)\n", + " a = a_sps\n", + " b = b_sps\n", + "\n", + " def sddmm_numba(s, a, b):\n", + " return s * (a @ b)\n", + "\n", + " # Compile\n", + " result_numba = sddmm_numba(s, a, b)\n", + " # Benchmark\n", + " time_numba = benchmark(sddmm_numba, info=\"Numba\", args=[s, a, b])\n", + "\n", + " # ======= SciPy =======\n", + " def sddmm_scipy(s, a, b):\n", + " return s.multiply(a @ b)\n", + "\n", + " s = s_sps.asformat(\"csr\")\n", + " a = a_sps\n", + " b = b_sps\n", + "\n", + " result_scipy = sddmm_scipy(s, a, b)\n", + " # Benchmark\n", + " time_scipy = benchmark(sddmm_scipy, info=\"SciPy\", args=[s, a, b])\n", + "\n", + " finch_times.append(time_finch)\n", + " numba_times.append(time_numba)\n", + " scipy_times.append(time_scipy)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(nrows=1, ncols=1)\n", + "\n", + "ax.plot(size_n, finch_times, \"o-\", label=\"Finch\")\n", + "ax.plot(size_n, numba_times, \"o-\", label=\"Numba\")\n", + "ax.plot(size_n, scipy_times, \"o-\", label=\"SciPy\")\n", + "\n", + "ax.grid(True)\n", + "ax.set_xlabel(\"size N\")\n", + "ax.set_ylabel(\"time (sec)\")\n", + "ax.set_title(\"SDDMM\")\n", + "ax.set_xscale(\"log\")\n", + "# ax.set_yscale('log')\n", + "ax.legend(loc=\"best\", numpoints=1)\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "sparse-dev", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/generated/sparse.COO.T.rst b/docs/generated/sparse.COO.T.rst deleted file mode 100644 index 142d0e04..00000000 --- a/docs/generated/sparse.COO.T.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.T -====== - -.. currentmodule:: sparse - -.. autoattribute:: COO.T diff --git a/docs/generated/sparse.COO.all.rst b/docs/generated/sparse.COO.all.rst deleted file mode 100644 index 8945c25b..00000000 --- a/docs/generated/sparse.COO.all.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.all -======= - -.. currentmodule:: sparse - -.. automethod:: COO.all diff --git a/docs/generated/sparse.COO.any.rst b/docs/generated/sparse.COO.any.rst deleted file mode 100644 index 164f6ca5..00000000 --- a/docs/generated/sparse.COO.any.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.any -======= - -.. currentmodule:: sparse - -.. automethod:: COO.any diff --git a/docs/generated/sparse.COO.asformat.rst b/docs/generated/sparse.COO.asformat.rst deleted file mode 100644 index 6bdf3cb1..00000000 --- a/docs/generated/sparse.COO.asformat.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.asformat -============ - -.. currentmodule:: sparse - -.. automethod:: COO.asformat diff --git a/docs/generated/sparse.COO.astype.rst b/docs/generated/sparse.COO.astype.rst deleted file mode 100644 index 1fd4ba26..00000000 --- a/docs/generated/sparse.COO.astype.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.astype -=========== - -.. currentmodule:: sparse - -.. automethod:: COO.astype diff --git a/docs/generated/sparse.COO.broadcast_to.rst b/docs/generated/sparse.COO.broadcast_to.rst deleted file mode 100644 index ae902f68..00000000 --- a/docs/generated/sparse.COO.broadcast_to.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.broadcast\_to -================== - -.. currentmodule:: sparse - -.. automethod:: COO.broadcast_to diff --git a/docs/generated/sparse.COO.clip.rst b/docs/generated/sparse.COO.clip.rst deleted file mode 100644 index a04b58fd..00000000 --- a/docs/generated/sparse.COO.clip.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.clip -========= - -.. currentmodule:: sparse - -.. automethod:: COO.clip diff --git a/docs/generated/sparse.COO.conj.rst b/docs/generated/sparse.COO.conj.rst deleted file mode 100644 index 4e611469..00000000 --- a/docs/generated/sparse.COO.conj.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.conj -========= - -.. currentmodule:: sparse - -.. automethod:: COO.conj diff --git a/docs/generated/sparse.COO.copy.rst b/docs/generated/sparse.COO.copy.rst deleted file mode 100644 index 0e69661b..00000000 --- a/docs/generated/sparse.COO.copy.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.copy -========= - -.. currentmodule:: sparse - -.. automethod:: COO.copy diff --git a/docs/generated/sparse.COO.density.rst b/docs/generated/sparse.COO.density.rst deleted file mode 100644 index ddf932e5..00000000 --- a/docs/generated/sparse.COO.density.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.density -============ - -.. currentmodule:: sparse - -.. autoattribute:: COO.density diff --git a/docs/generated/sparse.COO.dot.rst b/docs/generated/sparse.COO.dot.rst deleted file mode 100644 index 32390902..00000000 --- a/docs/generated/sparse.COO.dot.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.dot -======== - -.. currentmodule:: sparse - -.. automethod:: COO.dot diff --git a/docs/generated/sparse.COO.dtype.rst b/docs/generated/sparse.COO.dtype.rst deleted file mode 100644 index 08357850..00000000 --- a/docs/generated/sparse.COO.dtype.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.dtype -========== - -.. currentmodule:: sparse - -.. autoattribute:: COO.dtype diff --git a/docs/generated/sparse.COO.enable_caching.rst b/docs/generated/sparse.COO.enable_caching.rst deleted file mode 100644 index 16fea202..00000000 --- a/docs/generated/sparse.COO.enable_caching.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.enable\_caching -==================== - -.. currentmodule:: sparse - -.. automethod:: COO.enable_caching diff --git a/docs/generated/sparse.COO.flatten.rst b/docs/generated/sparse.COO.flatten.rst deleted file mode 100644 index 71489312..00000000 --- a/docs/generated/sparse.COO.flatten.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.flatten -=========== - -.. currentmodule:: sparse - -.. automethod:: COO.flatten diff --git a/docs/generated/sparse.COO.from_iter.rst b/docs/generated/sparse.COO.from_iter.rst deleted file mode 100644 index d7719fa6..00000000 --- a/docs/generated/sparse.COO.from_iter.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.from\_iter -============== - -.. currentmodule:: sparse - -.. automethod:: COO.from_iter diff --git a/docs/generated/sparse.COO.from_numpy.rst b/docs/generated/sparse.COO.from_numpy.rst deleted file mode 100644 index 1154f27b..00000000 --- a/docs/generated/sparse.COO.from_numpy.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.from\_numpy -================ - -.. currentmodule:: sparse - -.. automethod:: COO.from_numpy diff --git a/docs/generated/sparse.COO.from_scipy_sparse.rst b/docs/generated/sparse.COO.from_scipy_sparse.rst deleted file mode 100644 index 6e6c9529..00000000 --- a/docs/generated/sparse.COO.from_scipy_sparse.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.from\_scipy\_sparse -======================== - -.. currentmodule:: sparse - -.. automethod:: COO.from_scipy_sparse diff --git a/docs/generated/sparse.COO.imag.rst b/docs/generated/sparse.COO.imag.rst deleted file mode 100644 index 0eb05458..00000000 --- a/docs/generated/sparse.COO.imag.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.imag -========= - -.. currentmodule:: sparse - -.. autoattribute:: COO.imag diff --git a/docs/generated/sparse.COO.linear_loc.rst b/docs/generated/sparse.COO.linear_loc.rst deleted file mode 100644 index c3d47f91..00000000 --- a/docs/generated/sparse.COO.linear_loc.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.linear\_loc -================ - -.. currentmodule:: sparse - -.. automethod:: COO.linear_loc diff --git a/docs/generated/sparse.COO.max.rst b/docs/generated/sparse.COO.max.rst deleted file mode 100644 index 68b7efc8..00000000 --- a/docs/generated/sparse.COO.max.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.max -======== - -.. currentmodule:: sparse - -.. automethod:: COO.max diff --git a/docs/generated/sparse.COO.maybe_densify.rst b/docs/generated/sparse.COO.maybe_densify.rst deleted file mode 100644 index 750a9ce2..00000000 --- a/docs/generated/sparse.COO.maybe_densify.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.maybe\_densify -=================== - -.. currentmodule:: sparse - -.. automethod:: COO.maybe_densify diff --git a/docs/generated/sparse.COO.mean.rst b/docs/generated/sparse.COO.mean.rst deleted file mode 100644 index a699eeb3..00000000 --- a/docs/generated/sparse.COO.mean.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.mean -========= - -.. currentmodule:: sparse - -.. automethod:: COO.mean diff --git a/docs/generated/sparse.COO.min.rst b/docs/generated/sparse.COO.min.rst deleted file mode 100644 index 347c89c2..00000000 --- a/docs/generated/sparse.COO.min.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.min -======== - -.. currentmodule:: sparse - -.. automethod:: COO.min diff --git a/docs/generated/sparse.COO.nbytes.rst b/docs/generated/sparse.COO.nbytes.rst deleted file mode 100644 index eeab47b9..00000000 --- a/docs/generated/sparse.COO.nbytes.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.nbytes -=========== - -.. currentmodule:: sparse - -.. autoattribute:: COO.nbytes diff --git a/docs/generated/sparse.COO.ndim.rst b/docs/generated/sparse.COO.ndim.rst deleted file mode 100644 index bee60d52..00000000 --- a/docs/generated/sparse.COO.ndim.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.ndim -========= - -.. currentmodule:: sparse - -.. autoattribute:: COO.ndim diff --git a/docs/generated/sparse.COO.nnz.rst b/docs/generated/sparse.COO.nnz.rst deleted file mode 100644 index b0b0ce39..00000000 --- a/docs/generated/sparse.COO.nnz.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.nnz -======== - -.. currentmodule:: sparse - -.. autoattribute:: COO.nnz diff --git a/docs/generated/sparse.COO.nonzero.rst b/docs/generated/sparse.COO.nonzero.rst deleted file mode 100644 index 384319b5..00000000 --- a/docs/generated/sparse.COO.nonzero.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.nonzero -=========== - -.. currentmodule:: sparse - -.. automethod:: COO.nonzero diff --git a/docs/generated/sparse.COO.prod.rst b/docs/generated/sparse.COO.prod.rst deleted file mode 100644 index d97531ff..00000000 --- a/docs/generated/sparse.COO.prod.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.prod -========= - -.. currentmodule:: sparse - -.. automethod:: COO.prod diff --git a/docs/generated/sparse.COO.real.rst b/docs/generated/sparse.COO.real.rst deleted file mode 100644 index 1fc52917..00000000 --- a/docs/generated/sparse.COO.real.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.real -========= - -.. currentmodule:: sparse - -.. autoattribute:: COO.real diff --git a/docs/generated/sparse.COO.reduce.rst b/docs/generated/sparse.COO.reduce.rst deleted file mode 100644 index 24eacf7f..00000000 --- a/docs/generated/sparse.COO.reduce.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.reduce -=========== - -.. currentmodule:: sparse - -.. automethod:: COO.reduce diff --git a/docs/generated/sparse.COO.reshape.rst b/docs/generated/sparse.COO.reshape.rst deleted file mode 100644 index b973c09b..00000000 --- a/docs/generated/sparse.COO.reshape.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.reshape -============ - -.. currentmodule:: sparse - -.. automethod:: COO.reshape diff --git a/docs/generated/sparse.COO.resize.rst b/docs/generated/sparse.COO.resize.rst deleted file mode 100644 index 9893b6b1..00000000 --- a/docs/generated/sparse.COO.resize.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.resize -========== - -.. currentmodule:: sparse - -.. automethod:: COO.resize diff --git a/docs/generated/sparse.COO.round.rst b/docs/generated/sparse.COO.round.rst deleted file mode 100644 index 3ad2ccbc..00000000 --- a/docs/generated/sparse.COO.round.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.round -========== - -.. currentmodule:: sparse - -.. automethod:: COO.round diff --git a/docs/generated/sparse.COO.rst b/docs/generated/sparse.COO.rst deleted file mode 100644 index 605df66b..00000000 --- a/docs/generated/sparse.COO.rst +++ /dev/null @@ -1,88 +0,0 @@ -COO -=== - -.. currentmodule:: sparse - -.. autoclass:: COO - - .. note:: :obj:`COO` objects also support :ref:`operators ` - and :ref:`indexing ` - - .. rubric:: Attributes - .. autosummary:: - :toctree: - - COO.T - COO.dtype - COO.nbytes - COO.ndim - COO.nnz - COO.size - COO.density - COO.imag - COO.real - - .. rubric:: :doc:`Constructing COO objects <../construct>` - .. autosummary:: - :toctree: - - COO.from_iter - COO.from_numpy - COO.from_scipy_sparse - - .. rubric:: :ref:`Element-wise operations ` - .. autosummary:: - :toctree: - - COO.astype - COO.conj - COO.clip - COO.round - - .. rubric:: :ref:`Reductions ` - .. autosummary:: - :toctree: - - COO.reduce - - COO.sum - COO.prod - COO.min - COO.max - COO.any - COO.all - COO.mean - COO.std - COO.var - - .. rubric:: :ref:`Converting to other formats ` - .. autosummary:: - :toctree: - - COO.asformat - COO.todense - COO.maybe_densify - COO.to_scipy_sparse - COO.tocsc - COO.tocsr - - .. rubric:: :ref:`Other operations ` - .. autosummary:: - :toctree: - - COO.copy - COO.dot - COO.flatten - COO.reshape - COO.resize - COO.transpose - COO.swapaxes - COO.nonzero - - .. rubric:: Utility functions - .. autosummary:: - :toctree: - - COO.broadcast_to - COO.enable_caching - COO.linear_loc diff --git a/docs/generated/sparse.COO.size.rst b/docs/generated/sparse.COO.size.rst deleted file mode 100644 index d5e34b4a..00000000 --- a/docs/generated/sparse.COO.size.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.size -========= - -.. currentmodule:: sparse - -.. autoattribute:: COO.size diff --git a/docs/generated/sparse.COO.std.rst b/docs/generated/sparse.COO.std.rst deleted file mode 100644 index b46007ba..00000000 --- a/docs/generated/sparse.COO.std.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.std -======= - -.. currentmodule:: sparse - -.. automethod:: COO.std diff --git a/docs/generated/sparse.COO.sum.rst b/docs/generated/sparse.COO.sum.rst deleted file mode 100644 index 9d6c8961..00000000 --- a/docs/generated/sparse.COO.sum.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.sum -======== - -.. currentmodule:: sparse - -.. automethod:: COO.sum diff --git a/docs/generated/sparse.COO.swapaxes.rst b/docs/generated/sparse.COO.swapaxes.rst deleted file mode 100644 index 9ab9adae..00000000 --- a/docs/generated/sparse.COO.swapaxes.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.swapaxes -============ - -.. currentmodule:: sparse - -.. automethod:: COO.swapaxes diff --git a/docs/generated/sparse.COO.to_scipy_sparse.rst b/docs/generated/sparse.COO.to_scipy_sparse.rst deleted file mode 100644 index 184feaa6..00000000 --- a/docs/generated/sparse.COO.to_scipy_sparse.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.to\_scipy\_sparse -====================== - -.. currentmodule:: sparse - -.. automethod:: COO.to_scipy_sparse diff --git a/docs/generated/sparse.COO.tocsc.rst b/docs/generated/sparse.COO.tocsc.rst deleted file mode 100644 index fb9f2c81..00000000 --- a/docs/generated/sparse.COO.tocsc.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.tocsc -========== - -.. currentmodule:: sparse - -.. automethod:: COO.tocsc diff --git a/docs/generated/sparse.COO.tocsr.rst b/docs/generated/sparse.COO.tocsr.rst deleted file mode 100644 index a9d16ad0..00000000 --- a/docs/generated/sparse.COO.tocsr.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.tocsr -========== - -.. currentmodule:: sparse - -.. automethod:: COO.tocsr diff --git a/docs/generated/sparse.COO.todense.rst b/docs/generated/sparse.COO.todense.rst deleted file mode 100644 index 18e2e521..00000000 --- a/docs/generated/sparse.COO.todense.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.todense -============ - -.. currentmodule:: sparse - -.. automethod:: COO.todense diff --git a/docs/generated/sparse.COO.transpose.rst b/docs/generated/sparse.COO.transpose.rst deleted file mode 100644 index 4f5ace98..00000000 --- a/docs/generated/sparse.COO.transpose.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO\.transpose -============== - -.. currentmodule:: sparse - -.. automethod:: COO.transpose diff --git a/docs/generated/sparse.COO.var.rst b/docs/generated/sparse.COO.var.rst deleted file mode 100644 index 91312536..00000000 --- a/docs/generated/sparse.COO.var.rst +++ /dev/null @@ -1,6 +0,0 @@ -COO.var -======= - -.. currentmodule:: sparse - -.. automethod:: COO.var diff --git a/docs/generated/sparse.DOK.asformat.rst b/docs/generated/sparse.DOK.asformat.rst deleted file mode 100644 index e995d020..00000000 --- a/docs/generated/sparse.DOK.asformat.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK.asformat -============ - -.. currentmodule:: sparse - -.. automethod:: DOK.asformat diff --git a/docs/generated/sparse.DOK.density.rst b/docs/generated/sparse.DOK.density.rst deleted file mode 100644 index 47693f1d..00000000 --- a/docs/generated/sparse.DOK.density.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.density -============ - -.. currentmodule:: sparse - -.. autoattribute:: DOK.density diff --git a/docs/generated/sparse.DOK.from_coo.rst b/docs/generated/sparse.DOK.from_coo.rst deleted file mode 100644 index 184fb629..00000000 --- a/docs/generated/sparse.DOK.from_coo.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.from\_coo -============== - -.. currentmodule:: sparse - -.. automethod:: DOK.from_coo diff --git a/docs/generated/sparse.DOK.from_numpy.rst b/docs/generated/sparse.DOK.from_numpy.rst deleted file mode 100644 index eaea4553..00000000 --- a/docs/generated/sparse.DOK.from_numpy.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.from\_numpy -================ - -.. currentmodule:: sparse - -.. automethod:: DOK.from_numpy diff --git a/docs/generated/sparse.DOK.from_scipy_sparse.rst b/docs/generated/sparse.DOK.from_scipy_sparse.rst deleted file mode 100644 index 7b2289f0..00000000 --- a/docs/generated/sparse.DOK.from_scipy_sparse.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK.from\_scipy\_sparse -======================= - -.. currentmodule:: sparse - -.. automethod:: DOK.from_scipy_sparse diff --git a/docs/generated/sparse.DOK.ndim.rst b/docs/generated/sparse.DOK.ndim.rst deleted file mode 100644 index 8b15612b..00000000 --- a/docs/generated/sparse.DOK.ndim.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.ndim -========= - -.. currentmodule:: sparse - -.. autoattribute:: DOK.ndim diff --git a/docs/generated/sparse.DOK.nnz.rst b/docs/generated/sparse.DOK.nnz.rst deleted file mode 100644 index 9aa77d3e..00000000 --- a/docs/generated/sparse.DOK.nnz.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.nnz -======== - -.. currentmodule:: sparse - -.. autoattribute:: DOK.nnz diff --git a/docs/generated/sparse.DOK.rst b/docs/generated/sparse.DOK.rst deleted file mode 100644 index e4f7ee9b..00000000 --- a/docs/generated/sparse.DOK.rst +++ /dev/null @@ -1,44 +0,0 @@ -DOK -=== - -.. currentmodule:: sparse - -.. autoclass:: DOK - - - - .. rubric:: Attributes - .. autosummary:: - :toctree: - - DOK.density - - DOK.ndim - - DOK.nnz - - DOK.size - - - - - - - - - - .. rubric:: Methods - .. autosummary:: - :toctree: - - DOK.asformat - - DOK.from_coo - - DOK.from_numpy - - DOK.from_scipy_sparse - - DOK.to_coo - - DOK.todense diff --git a/docs/generated/sparse.DOK.size.rst b/docs/generated/sparse.DOK.size.rst deleted file mode 100644 index 3ba87ef2..00000000 --- a/docs/generated/sparse.DOK.size.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.size -========= - -.. currentmodule:: sparse - -.. autoattribute:: DOK.size diff --git a/docs/generated/sparse.DOK.to_coo.rst b/docs/generated/sparse.DOK.to_coo.rst deleted file mode 100644 index 1982ae53..00000000 --- a/docs/generated/sparse.DOK.to_coo.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.to\_coo -============ - -.. currentmodule:: sparse - -.. automethod:: DOK.to_coo diff --git a/docs/generated/sparse.DOK.todense.rst b/docs/generated/sparse.DOK.todense.rst deleted file mode 100644 index c4b4fe62..00000000 --- a/docs/generated/sparse.DOK.todense.rst +++ /dev/null @@ -1,6 +0,0 @@ -DOK\.todense -============ - -.. currentmodule:: sparse - -.. automethod:: DOK.todense diff --git a/docs/generated/sparse.GCXS.T.rst b/docs/generated/sparse.GCXS.T.rst deleted file mode 100644 index 3d384a4d..00000000 --- a/docs/generated/sparse.GCXS.T.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.T -====== - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.T diff --git a/docs/generated/sparse.GCXS.__init__.rst b/docs/generated/sparse.GCXS.__init__.rst deleted file mode 100644 index eebcebbb..00000000 --- a/docs/generated/sparse.GCXS.__init__.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.\_\_init\_\_ -================= - -.. currentmodule:: sparse - -.. automethod:: GCXS.__init__ diff --git a/docs/generated/sparse.GCXS.all.rst b/docs/generated/sparse.GCXS.all.rst deleted file mode 100644 index 95ea5152..00000000 --- a/docs/generated/sparse.GCXS.all.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.all -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.all diff --git a/docs/generated/sparse.GCXS.amax.rst b/docs/generated/sparse.GCXS.amax.rst deleted file mode 100644 index 8834211d..00000000 --- a/docs/generated/sparse.GCXS.amax.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.amax -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.amax diff --git a/docs/generated/sparse.GCXS.amin.rst b/docs/generated/sparse.GCXS.amin.rst deleted file mode 100644 index 21272af8..00000000 --- a/docs/generated/sparse.GCXS.amin.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.amin -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.amin diff --git a/docs/generated/sparse.GCXS.any.rst b/docs/generated/sparse.GCXS.any.rst deleted file mode 100644 index cb063e9c..00000000 --- a/docs/generated/sparse.GCXS.any.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.any -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.any diff --git a/docs/generated/sparse.GCXS.asformat.rst b/docs/generated/sparse.GCXS.asformat.rst deleted file mode 100644 index 9759e21b..00000000 --- a/docs/generated/sparse.GCXS.asformat.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.asformat -============= - -.. currentmodule:: sparse - -.. automethod:: GCXS.asformat diff --git a/docs/generated/sparse.GCXS.astype.rst b/docs/generated/sparse.GCXS.astype.rst deleted file mode 100644 index 5fb75299..00000000 --- a/docs/generated/sparse.GCXS.astype.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.astype -=========== - -.. currentmodule:: sparse - -.. automethod:: GCXS.astype diff --git a/docs/generated/sparse.GCXS.change_compressed_axes.rst b/docs/generated/sparse.GCXS.change_compressed_axes.rst deleted file mode 100644 index 3dc8c140..00000000 --- a/docs/generated/sparse.GCXS.change_compressed_axes.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.change\_compressed\_axes -============================= - -.. currentmodule:: sparse - -.. automethod:: GCXS.change_compressed_axes diff --git a/docs/generated/sparse.GCXS.clip.rst b/docs/generated/sparse.GCXS.clip.rst deleted file mode 100644 index c5cd2331..00000000 --- a/docs/generated/sparse.GCXS.clip.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.clip -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.clip diff --git a/docs/generated/sparse.GCXS.compressed_axes.rst b/docs/generated/sparse.GCXS.compressed_axes.rst deleted file mode 100644 index e0fa6830..00000000 --- a/docs/generated/sparse.GCXS.compressed_axes.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.compressed\_axes -===================== - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.compressed_axes diff --git a/docs/generated/sparse.GCXS.conj.rst b/docs/generated/sparse.GCXS.conj.rst deleted file mode 100644 index de50f6b6..00000000 --- a/docs/generated/sparse.GCXS.conj.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.conj -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.conj diff --git a/docs/generated/sparse.GCXS.copy.rst b/docs/generated/sparse.GCXS.copy.rst deleted file mode 100644 index 0b7452cd..00000000 --- a/docs/generated/sparse.GCXS.copy.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.copy -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.copy diff --git a/docs/generated/sparse.GCXS.density.rst b/docs/generated/sparse.GCXS.density.rst deleted file mode 100644 index 343e040a..00000000 --- a/docs/generated/sparse.GCXS.density.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.density -============ - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.density diff --git a/docs/generated/sparse.GCXS.dot.rst b/docs/generated/sparse.GCXS.dot.rst deleted file mode 100644 index 510c86b7..00000000 --- a/docs/generated/sparse.GCXS.dot.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.dot -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.dot diff --git a/docs/generated/sparse.GCXS.dtype.rst b/docs/generated/sparse.GCXS.dtype.rst deleted file mode 100644 index 8924b457..00000000 --- a/docs/generated/sparse.GCXS.dtype.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.dtype -========== - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.dtype diff --git a/docs/generated/sparse.GCXS.flatten.rst b/docs/generated/sparse.GCXS.flatten.rst deleted file mode 100644 index c2e78550..00000000 --- a/docs/generated/sparse.GCXS.flatten.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.flatten -============ - -.. currentmodule:: sparse - -.. automethod:: GCXS.flatten diff --git a/docs/generated/sparse.GCXS.from_coo.rst b/docs/generated/sparse.GCXS.from_coo.rst deleted file mode 100644 index 7c3c51ed..00000000 --- a/docs/generated/sparse.GCXS.from_coo.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.from\_coo -============== - -.. currentmodule:: sparse - -.. automethod:: GCXS.from_coo diff --git a/docs/generated/sparse.GCXS.from_iter.rst b/docs/generated/sparse.GCXS.from_iter.rst deleted file mode 100644 index 961b5d24..00000000 --- a/docs/generated/sparse.GCXS.from_iter.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.from\_iter -=============== - -.. currentmodule:: sparse - -.. automethod:: GCXS.from_iter diff --git a/docs/generated/sparse.GCXS.from_numpy.rst b/docs/generated/sparse.GCXS.from_numpy.rst deleted file mode 100644 index 917f22de..00000000 --- a/docs/generated/sparse.GCXS.from_numpy.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.from\_numpy -================ - -.. currentmodule:: sparse - -.. automethod:: GCXS.from_numpy diff --git a/docs/generated/sparse.GCXS.from_scipy_sparse.rst b/docs/generated/sparse.GCXS.from_scipy_sparse.rst deleted file mode 100644 index 5ac8c796..00000000 --- a/docs/generated/sparse.GCXS.from_scipy_sparse.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.from\_scipy\_sparse -======================== - -.. currentmodule:: sparse - -.. automethod:: GCXS.from_scipy_sparse diff --git a/docs/generated/sparse.GCXS.imag.rst b/docs/generated/sparse.GCXS.imag.rst deleted file mode 100644 index 33389447..00000000 --- a/docs/generated/sparse.GCXS.imag.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.imag -========= - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.imag diff --git a/docs/generated/sparse.GCXS.max.rst b/docs/generated/sparse.GCXS.max.rst deleted file mode 100644 index fb7c2331..00000000 --- a/docs/generated/sparse.GCXS.max.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.max -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.max diff --git a/docs/generated/sparse.GCXS.maybe_densify.rst b/docs/generated/sparse.GCXS.maybe_densify.rst deleted file mode 100644 index a9b054cd..00000000 --- a/docs/generated/sparse.GCXS.maybe_densify.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.maybe\_densify -=================== - -.. currentmodule:: sparse - -.. automethod:: GCXS.maybe_densify diff --git a/docs/generated/sparse.GCXS.mean.rst b/docs/generated/sparse.GCXS.mean.rst deleted file mode 100644 index a437f91d..00000000 --- a/docs/generated/sparse.GCXS.mean.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.mean -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.mean diff --git a/docs/generated/sparse.GCXS.min.rst b/docs/generated/sparse.GCXS.min.rst deleted file mode 100644 index d4bcc19d..00000000 --- a/docs/generated/sparse.GCXS.min.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.min -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.min diff --git a/docs/generated/sparse.GCXS.nbytes.rst b/docs/generated/sparse.GCXS.nbytes.rst deleted file mode 100644 index d1ce097a..00000000 --- a/docs/generated/sparse.GCXS.nbytes.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.nbytes -=========== - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.nbytes diff --git a/docs/generated/sparse.GCXS.ndim.rst b/docs/generated/sparse.GCXS.ndim.rst deleted file mode 100644 index 74fd47ff..00000000 --- a/docs/generated/sparse.GCXS.ndim.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.ndim -========= - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.ndim diff --git a/docs/generated/sparse.GCXS.nnz.rst b/docs/generated/sparse.GCXS.nnz.rst deleted file mode 100644 index 43a30ca9..00000000 --- a/docs/generated/sparse.GCXS.nnz.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.nnz -======== - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.nnz diff --git a/docs/generated/sparse.GCXS.prod.rst b/docs/generated/sparse.GCXS.prod.rst deleted file mode 100644 index 6fec63e8..00000000 --- a/docs/generated/sparse.GCXS.prod.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.prod -========= - -.. currentmodule:: sparse - -.. automethod:: GCXS.prod diff --git a/docs/generated/sparse.GCXS.real.rst b/docs/generated/sparse.GCXS.real.rst deleted file mode 100644 index b17ad9de..00000000 --- a/docs/generated/sparse.GCXS.real.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.real -========= - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.real diff --git a/docs/generated/sparse.GCXS.reduce.rst b/docs/generated/sparse.GCXS.reduce.rst deleted file mode 100644 index 834f3726..00000000 --- a/docs/generated/sparse.GCXS.reduce.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.reduce -=========== - -.. currentmodule:: sparse - -.. automethod:: GCXS.reduce diff --git a/docs/generated/sparse.GCXS.reshape.rst b/docs/generated/sparse.GCXS.reshape.rst deleted file mode 100644 index fcf390f6..00000000 --- a/docs/generated/sparse.GCXS.reshape.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.reshape -============ - -.. currentmodule:: sparse - -.. automethod:: GCXS.reshape diff --git a/docs/generated/sparse.GCXS.round.rst b/docs/generated/sparse.GCXS.round.rst deleted file mode 100644 index 98553081..00000000 --- a/docs/generated/sparse.GCXS.round.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.round -========== - -.. currentmodule:: sparse - -.. automethod:: GCXS.round diff --git a/docs/generated/sparse.GCXS.round_.rst b/docs/generated/sparse.GCXS.round_.rst deleted file mode 100644 index 329d12d1..00000000 --- a/docs/generated/sparse.GCXS.round_.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.round\_ -============ - -.. currentmodule:: sparse - -.. automethod:: GCXS.round_ diff --git a/docs/generated/sparse.GCXS.rst b/docs/generated/sparse.GCXS.rst deleted file mode 100644 index 65bddb30..00000000 --- a/docs/generated/sparse.GCXS.rst +++ /dev/null @@ -1,109 +0,0 @@ -GCXS -==== - -.. currentmodule:: sparse - -.. autoclass:: GCXS - - - - .. rubric:: Attributes - .. autosummary:: - :toctree: - - GCXS.T - - GCXS.compressed_axes - - GCXS.density - - GCXS.dtype - - GCXS.imag - - GCXS.nbytes - - GCXS.ndim - - GCXS.nnz - - GCXS.real - - GCXS.size - - - - - - - .. rubric:: Methods - .. autosummary:: - :toctree: - - GCXS.__init__ - - GCXS.all - - GCXS.amax - - GCXS.amin - - GCXS.any - - GCXS.asformat - - GCXS.astype - - GCXS.change_compressed_axes - - GCXS.clip - - GCXS.conj - - GCXS.copy - - GCXS.dot - - GCXS.flatten - - GCXS.from_coo - - GCXS.from_iter - - GCXS.from_numpy - - GCXS.from_scipy_sparse - - GCXS.max - - GCXS.maybe_densify - - GCXS.mean - - GCXS.min - - GCXS.prod - - GCXS.reduce - - GCXS.reshape - - GCXS.round - - GCXS.round_ - - GCXS.std - - GCXS.sum - - GCXS.to_scipy_sparse - - GCXS.tocoo - - GCXS.todense - - GCXS.todok - - GCXS.transpose - - GCXS.var diff --git a/docs/generated/sparse.GCXS.size.rst b/docs/generated/sparse.GCXS.size.rst deleted file mode 100644 index 9860a44c..00000000 --- a/docs/generated/sparse.GCXS.size.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.size -========= - -.. currentmodule:: sparse - -.. autoproperty:: GCXS.size diff --git a/docs/generated/sparse.GCXS.std.rst b/docs/generated/sparse.GCXS.std.rst deleted file mode 100644 index 3a9151ce..00000000 --- a/docs/generated/sparse.GCXS.std.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.std -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.std diff --git a/docs/generated/sparse.GCXS.sum.rst b/docs/generated/sparse.GCXS.sum.rst deleted file mode 100644 index baa52fee..00000000 --- a/docs/generated/sparse.GCXS.sum.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.sum -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.sum diff --git a/docs/generated/sparse.GCXS.to_scipy_sparse.rst b/docs/generated/sparse.GCXS.to_scipy_sparse.rst deleted file mode 100644 index 71c31b97..00000000 --- a/docs/generated/sparse.GCXS.to_scipy_sparse.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.to\_scipy\_sparse -====================== - -.. currentmodule:: sparse - -.. automethod:: GCXS.to_scipy_sparse diff --git a/docs/generated/sparse.GCXS.tocoo.rst b/docs/generated/sparse.GCXS.tocoo.rst deleted file mode 100644 index 17a89fb5..00000000 --- a/docs/generated/sparse.GCXS.tocoo.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.tocoo -========== - -.. currentmodule:: sparse - -.. automethod:: GCXS.tocoo diff --git a/docs/generated/sparse.GCXS.todense.rst b/docs/generated/sparse.GCXS.todense.rst deleted file mode 100644 index f18cba79..00000000 --- a/docs/generated/sparse.GCXS.todense.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.todense -============ - -.. currentmodule:: sparse - -.. automethod:: GCXS.todense diff --git a/docs/generated/sparse.GCXS.todok.rst b/docs/generated/sparse.GCXS.todok.rst deleted file mode 100644 index a3e9265c..00000000 --- a/docs/generated/sparse.GCXS.todok.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.todok -========== - -.. currentmodule:: sparse - -.. automethod:: GCXS.todok diff --git a/docs/generated/sparse.GCXS.transpose.rst b/docs/generated/sparse.GCXS.transpose.rst deleted file mode 100644 index 11580e0a..00000000 --- a/docs/generated/sparse.GCXS.transpose.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.transpose -============== - -.. currentmodule:: sparse - -.. automethod:: GCXS.transpose diff --git a/docs/generated/sparse.GCXS.var.rst b/docs/generated/sparse.GCXS.var.rst deleted file mode 100644 index 51846349..00000000 --- a/docs/generated/sparse.GCXS.var.rst +++ /dev/null @@ -1,6 +0,0 @@ -GCXS.var -======== - -.. currentmodule:: sparse - -.. automethod:: GCXS.var diff --git a/docs/generated/sparse.SparseArray.asformat.rst b/docs/generated/sparse.SparseArray.asformat.rst deleted file mode 100644 index 7c88fdc6..00000000 --- a/docs/generated/sparse.SparseArray.asformat.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray.asformat -==================== - -.. currentmodule:: sparse - -.. automethod:: SparseArray.asformat diff --git a/docs/generated/sparse.SparseArray.density.rst b/docs/generated/sparse.SparseArray.density.rst deleted file mode 100644 index d83f4c57..00000000 --- a/docs/generated/sparse.SparseArray.density.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray\.density -==================== - -.. currentmodule:: sparse - -.. autoattribute:: SparseArray.density diff --git a/docs/generated/sparse.SparseArray.ndim.rst b/docs/generated/sparse.SparseArray.ndim.rst deleted file mode 100644 index 4bddbc11..00000000 --- a/docs/generated/sparse.SparseArray.ndim.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray\.ndim -================= - -.. currentmodule:: sparse - -.. autoattribute:: SparseArray.ndim diff --git a/docs/generated/sparse.SparseArray.nnz.rst b/docs/generated/sparse.SparseArray.nnz.rst deleted file mode 100644 index 370fdafd..00000000 --- a/docs/generated/sparse.SparseArray.nnz.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray\.nnz -================ - -.. currentmodule:: sparse - -.. autoattribute:: SparseArray.nnz diff --git a/docs/generated/sparse.SparseArray.rst b/docs/generated/sparse.SparseArray.rst deleted file mode 100644 index c2b44242..00000000 --- a/docs/generated/sparse.SparseArray.rst +++ /dev/null @@ -1,22 +0,0 @@ -SparseArray -=========== - -.. currentmodule:: sparse - -.. autoclass:: SparseArray - - .. rubric:: Attributes - .. autosummary:: - :toctree: - - SparseArray.density - SparseArray.ndim - SparseArray.nnz - SparseArray.size - - .. rubric:: Methods - .. autosummary:: - :toctree: - - SparseArray.asformat - SparseArray.todense diff --git a/docs/generated/sparse.SparseArray.size.rst b/docs/generated/sparse.SparseArray.size.rst deleted file mode 100644 index dab6f298..00000000 --- a/docs/generated/sparse.SparseArray.size.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray\.size -================= - -.. currentmodule:: sparse - -.. autoattribute:: SparseArray.size diff --git a/docs/generated/sparse.SparseArray.todense.rst b/docs/generated/sparse.SparseArray.todense.rst deleted file mode 100644 index fb910571..00000000 --- a/docs/generated/sparse.SparseArray.todense.rst +++ /dev/null @@ -1,6 +0,0 @@ -SparseArray.todense -=================== - -.. currentmodule:: sparse - -.. automethod:: SparseArray.todense diff --git a/docs/generated/sparse.abs.rst b/docs/generated/sparse.abs.rst deleted file mode 100644 index aac8866d..00000000 --- a/docs/generated/sparse.abs.rst +++ /dev/null @@ -1,6 +0,0 @@ -abs -=== - -.. currentmodule:: sparse - -.. autofunction:: abs diff --git a/docs/generated/sparse.all.rst b/docs/generated/sparse.all.rst deleted file mode 100644 index 7f64e912..00000000 --- a/docs/generated/sparse.all.rst +++ /dev/null @@ -1,6 +0,0 @@ -all -=== - -.. currentmodule:: sparse - -.. autofunction:: all diff --git a/docs/generated/sparse.any.rst b/docs/generated/sparse.any.rst deleted file mode 100644 index ae978188..00000000 --- a/docs/generated/sparse.any.rst +++ /dev/null @@ -1,6 +0,0 @@ -any -=== - -.. currentmodule:: sparse - -.. autofunction:: any diff --git a/docs/generated/sparse.argmax.rst b/docs/generated/sparse.argmax.rst deleted file mode 100644 index 49cd8381..00000000 --- a/docs/generated/sparse.argmax.rst +++ /dev/null @@ -1,6 +0,0 @@ -argmax -====== - -.. currentmodule:: sparse - -.. autofunction:: argmax diff --git a/docs/generated/sparse.argmin.rst b/docs/generated/sparse.argmin.rst deleted file mode 100644 index 55ab0c88..00000000 --- a/docs/generated/sparse.argmin.rst +++ /dev/null @@ -1,6 +0,0 @@ -argmin -====== - -.. currentmodule:: sparse - -.. autofunction:: argmin diff --git a/docs/generated/sparse.argwhere.rst b/docs/generated/sparse.argwhere.rst deleted file mode 100644 index d6e32484..00000000 --- a/docs/generated/sparse.argwhere.rst +++ /dev/null @@ -1,6 +0,0 @@ -argwhere -======== - -.. currentmodule:: sparse - -.. autofunction:: argwhere diff --git a/docs/generated/sparse.asCOO.rst b/docs/generated/sparse.asCOO.rst deleted file mode 100644 index 087103d2..00000000 --- a/docs/generated/sparse.asCOO.rst +++ /dev/null @@ -1,6 +0,0 @@ -asCOO -===== - -.. currentmodule:: sparse - -.. autofunction:: asCOO diff --git a/docs/generated/sparse.as_coo.rst b/docs/generated/sparse.as_coo.rst deleted file mode 100644 index 9772d91b..00000000 --- a/docs/generated/sparse.as_coo.rst +++ /dev/null @@ -1,6 +0,0 @@ -as\_coo -======= - -.. currentmodule:: sparse - -.. autofunction:: as_coo diff --git a/docs/generated/sparse.asarray.rst b/docs/generated/sparse.asarray.rst deleted file mode 100644 index 21da9354..00000000 --- a/docs/generated/sparse.asarray.rst +++ /dev/null @@ -1,6 +0,0 @@ -asarray -======= - -.. currentmodule:: sparse - -.. autofunction:: asarray diff --git a/docs/generated/sparse.asnumpy.rst b/docs/generated/sparse.asnumpy.rst deleted file mode 100644 index 8a9f3042..00000000 --- a/docs/generated/sparse.asnumpy.rst +++ /dev/null @@ -1,6 +0,0 @@ -asnumpy -======= - -.. currentmodule:: sparse - -.. autofunction:: asnumpy diff --git a/docs/generated/sparse.astype.rst b/docs/generated/sparse.astype.rst deleted file mode 100644 index 3e272244..00000000 --- a/docs/generated/sparse.astype.rst +++ /dev/null @@ -1,6 +0,0 @@ -astype -====== - -.. currentmodule:: sparse - -.. autofunction:: astype diff --git a/docs/generated/sparse.broadcast_arrays.rst b/docs/generated/sparse.broadcast_arrays.rst deleted file mode 100644 index 0bc6ffe6..00000000 --- a/docs/generated/sparse.broadcast_arrays.rst +++ /dev/null @@ -1,6 +0,0 @@ -broadcast\_arrays -================= - -.. currentmodule:: sparse - -.. autofunction:: broadcast_arrays diff --git a/docs/generated/sparse.broadcast_to.rst b/docs/generated/sparse.broadcast_to.rst deleted file mode 100644 index 1dd3b94c..00000000 --- a/docs/generated/sparse.broadcast_to.rst +++ /dev/null @@ -1,6 +0,0 @@ -broadcast\_to -============= - -.. currentmodule:: sparse - -.. autofunction:: broadcast_to diff --git a/docs/generated/sparse.clip.rst b/docs/generated/sparse.clip.rst deleted file mode 100644 index b47d0759..00000000 --- a/docs/generated/sparse.clip.rst +++ /dev/null @@ -1,6 +0,0 @@ -clip -==== - -.. currentmodule:: sparse - -.. autofunction:: clip diff --git a/docs/generated/sparse.concat.rst b/docs/generated/sparse.concat.rst deleted file mode 100644 index 54d2a6dc..00000000 --- a/docs/generated/sparse.concat.rst +++ /dev/null @@ -1,6 +0,0 @@ -concat -====== - -.. currentmodule:: sparse - -.. autofunction:: concat diff --git a/docs/generated/sparse.concatenate.rst b/docs/generated/sparse.concatenate.rst deleted file mode 100644 index ac525ef5..00000000 --- a/docs/generated/sparse.concatenate.rst +++ /dev/null @@ -1,6 +0,0 @@ -concatenate -=========== - -.. currentmodule:: sparse - -.. autofunction:: concatenate diff --git a/docs/generated/sparse.diagonal.rst b/docs/generated/sparse.diagonal.rst deleted file mode 100644 index ca154195..00000000 --- a/docs/generated/sparse.diagonal.rst +++ /dev/null @@ -1,6 +0,0 @@ -diagonal -============= - -.. currentmodule:: sparse - -.. autofunction:: diagonal diff --git a/docs/generated/sparse.diagonalize.rst b/docs/generated/sparse.diagonalize.rst deleted file mode 100644 index fcfc9cf1..00000000 --- a/docs/generated/sparse.diagonalize.rst +++ /dev/null @@ -1,6 +0,0 @@ -diagonalize -=========== - -.. currentmodule:: sparse - -.. autofunction:: diagonalize diff --git a/docs/generated/sparse.dot.rst b/docs/generated/sparse.dot.rst deleted file mode 100644 index ba058914..00000000 --- a/docs/generated/sparse.dot.rst +++ /dev/null @@ -1,6 +0,0 @@ -dot -=== - -.. currentmodule:: sparse - -.. autofunction:: dot diff --git a/docs/generated/sparse.einsum.rst b/docs/generated/sparse.einsum.rst deleted file mode 100644 index e8006649..00000000 --- a/docs/generated/sparse.einsum.rst +++ /dev/null @@ -1,6 +0,0 @@ -einsum -====== - -.. currentmodule:: sparse - -.. autofunction:: einsum diff --git a/docs/generated/sparse.elemwise.rst b/docs/generated/sparse.elemwise.rst deleted file mode 100644 index 970ae49e..00000000 --- a/docs/generated/sparse.elemwise.rst +++ /dev/null @@ -1,6 +0,0 @@ -elemwise -======== - -.. currentmodule:: sparse - -.. autofunction:: elemwise diff --git a/docs/generated/sparse.empty.rst b/docs/generated/sparse.empty.rst deleted file mode 100644 index 390fadf4..00000000 --- a/docs/generated/sparse.empty.rst +++ /dev/null @@ -1,6 +0,0 @@ -empty -===== - -.. currentmodule:: sparse - -.. autofunction:: empty diff --git a/docs/generated/sparse.empty_like.rst b/docs/generated/sparse.empty_like.rst deleted file mode 100644 index 8c768058..00000000 --- a/docs/generated/sparse.empty_like.rst +++ /dev/null @@ -1,6 +0,0 @@ -empty\_like -=========== - -.. currentmodule:: sparse - -.. autofunction:: empty_like diff --git a/docs/generated/sparse.equal.rst b/docs/generated/sparse.equal.rst deleted file mode 100644 index 8609cfb5..00000000 --- a/docs/generated/sparse.equal.rst +++ /dev/null @@ -1,6 +0,0 @@ -equal -===== - -.. currentmodule:: sparse - -.. autofunction:: equal diff --git a/docs/generated/sparse.expand_dims.rst b/docs/generated/sparse.expand_dims.rst deleted file mode 100644 index 7f918642..00000000 --- a/docs/generated/sparse.expand_dims.rst +++ /dev/null @@ -1,6 +0,0 @@ -expand\_dims -============ - -.. currentmodule:: sparse - -.. autofunction:: expand_dims diff --git a/docs/generated/sparse.eye.rst b/docs/generated/sparse.eye.rst deleted file mode 100644 index 46db6c99..00000000 --- a/docs/generated/sparse.eye.rst +++ /dev/null @@ -1,6 +0,0 @@ -eye -=== - -.. currentmodule:: sparse - -.. autofunction:: eye diff --git a/docs/generated/sparse.flip.rst b/docs/generated/sparse.flip.rst deleted file mode 100644 index 9c83383e..00000000 --- a/docs/generated/sparse.flip.rst +++ /dev/null @@ -1,6 +0,0 @@ -flip -==== - -.. currentmodule:: sparse - -.. autofunction:: flip diff --git a/docs/generated/sparse.full.rst b/docs/generated/sparse.full.rst deleted file mode 100644 index ae55bcff..00000000 --- a/docs/generated/sparse.full.rst +++ /dev/null @@ -1,6 +0,0 @@ -full -==== - -.. currentmodule:: sparse - -.. autofunction:: full diff --git a/docs/generated/sparse.full_like.rst b/docs/generated/sparse.full_like.rst deleted file mode 100644 index 788e4ec4..00000000 --- a/docs/generated/sparse.full_like.rst +++ /dev/null @@ -1,6 +0,0 @@ -full_like -========= - -.. currentmodule:: sparse - -.. autofunction:: full_like diff --git a/docs/generated/sparse.isinf.rst b/docs/generated/sparse.isinf.rst deleted file mode 100644 index a7b6f512..00000000 --- a/docs/generated/sparse.isinf.rst +++ /dev/null @@ -1,6 +0,0 @@ -isinf -===== - -.. currentmodule:: sparse - -.. autofunction:: isinf diff --git a/docs/generated/sparse.isnan.rst b/docs/generated/sparse.isnan.rst deleted file mode 100644 index 256286aa..00000000 --- a/docs/generated/sparse.isnan.rst +++ /dev/null @@ -1,6 +0,0 @@ -isnan -===== - -.. currentmodule:: sparse - -.. autofunction:: isnan diff --git a/docs/generated/sparse.isneginf.rst b/docs/generated/sparse.isneginf.rst deleted file mode 100644 index 5961e87d..00000000 --- a/docs/generated/sparse.isneginf.rst +++ /dev/null @@ -1,6 +0,0 @@ -isneginf -======== - -.. currentmodule:: sparse - -.. autofunction:: isneginf diff --git a/docs/generated/sparse.isposinf.rst b/docs/generated/sparse.isposinf.rst deleted file mode 100644 index 2497ec5b..00000000 --- a/docs/generated/sparse.isposinf.rst +++ /dev/null @@ -1,6 +0,0 @@ -isposinf -======== - -.. currentmodule:: sparse - -.. autofunction:: isposinf diff --git a/docs/generated/sparse.kron.rst b/docs/generated/sparse.kron.rst deleted file mode 100644 index 85771083..00000000 --- a/docs/generated/sparse.kron.rst +++ /dev/null @@ -1,6 +0,0 @@ -kron -==== - -.. currentmodule:: sparse - -.. autofunction:: kron diff --git a/docs/generated/sparse.load_npz.rst b/docs/generated/sparse.load_npz.rst deleted file mode 100644 index 0b829750..00000000 --- a/docs/generated/sparse.load_npz.rst +++ /dev/null @@ -1,6 +0,0 @@ -load\_npz -========= - -.. currentmodule:: sparse - -.. autofunction:: load_npz diff --git a/docs/generated/sparse.matmul.rst b/docs/generated/sparse.matmul.rst deleted file mode 100644 index 2985296a..00000000 --- a/docs/generated/sparse.matmul.rst +++ /dev/null @@ -1,6 +0,0 @@ -matmul -====== - -.. currentmodule:: sparse - -.. autofunction:: matmul diff --git a/docs/generated/sparse.matrix_transpose.rst b/docs/generated/sparse.matrix_transpose.rst deleted file mode 100644 index 755521dd..00000000 --- a/docs/generated/sparse.matrix_transpose.rst +++ /dev/null @@ -1,6 +0,0 @@ -matrix\_transpose -================= - -.. currentmodule:: sparse - -.. autofunction:: matrix_transpose diff --git a/docs/generated/sparse.max.rst b/docs/generated/sparse.max.rst deleted file mode 100644 index 6007fb8e..00000000 --- a/docs/generated/sparse.max.rst +++ /dev/null @@ -1,6 +0,0 @@ -max -=== - -.. currentmodule:: sparse - -.. autofunction:: max diff --git a/docs/generated/sparse.mean.rst b/docs/generated/sparse.mean.rst deleted file mode 100644 index 41405ca8..00000000 --- a/docs/generated/sparse.mean.rst +++ /dev/null @@ -1,6 +0,0 @@ -mean -==== - -.. currentmodule:: sparse - -.. autofunction:: mean diff --git a/docs/generated/sparse.min.rst b/docs/generated/sparse.min.rst deleted file mode 100644 index 98cc8dd5..00000000 --- a/docs/generated/sparse.min.rst +++ /dev/null @@ -1,6 +0,0 @@ -min -=== - -.. currentmodule:: sparse - -.. autofunction:: min diff --git a/docs/generated/sparse.moveaxis.rst b/docs/generated/sparse.moveaxis.rst deleted file mode 100644 index 8d8f85a1..00000000 --- a/docs/generated/sparse.moveaxis.rst +++ /dev/null @@ -1,6 +0,0 @@ -moveaxis -======== - -.. currentmodule:: sparse - -.. autofunction:: moveaxis diff --git a/docs/generated/sparse.nanmax.rst b/docs/generated/sparse.nanmax.rst deleted file mode 100644 index 7209a3ab..00000000 --- a/docs/generated/sparse.nanmax.rst +++ /dev/null @@ -1,6 +0,0 @@ -nanmax -====== - -.. currentmodule:: sparse - -.. autofunction:: nanmax diff --git a/docs/generated/sparse.nanmean.rst b/docs/generated/sparse.nanmean.rst deleted file mode 100644 index 22aa3da8..00000000 --- a/docs/generated/sparse.nanmean.rst +++ /dev/null @@ -1,6 +0,0 @@ -nanmean -======= - -.. currentmodule:: sparse - -.. autofunction:: nanmean diff --git a/docs/generated/sparse.nanmin.rst b/docs/generated/sparse.nanmin.rst deleted file mode 100644 index 741705c3..00000000 --- a/docs/generated/sparse.nanmin.rst +++ /dev/null @@ -1,6 +0,0 @@ -nanmin -====== - -.. currentmodule:: sparse - -.. autofunction:: nanmin diff --git a/docs/generated/sparse.nanprod.rst b/docs/generated/sparse.nanprod.rst deleted file mode 100644 index 96142b07..00000000 --- a/docs/generated/sparse.nanprod.rst +++ /dev/null @@ -1,6 +0,0 @@ -nanprod -======= - -.. currentmodule:: sparse - -.. autofunction:: nanprod diff --git a/docs/generated/sparse.nanreduce.rst b/docs/generated/sparse.nanreduce.rst deleted file mode 100644 index fd710e9a..00000000 --- a/docs/generated/sparse.nanreduce.rst +++ /dev/null @@ -1,6 +0,0 @@ -nanreduce -========= - -.. currentmodule:: sparse - -.. autofunction:: nanreduce diff --git a/docs/generated/sparse.nansum.rst b/docs/generated/sparse.nansum.rst deleted file mode 100644 index 064faa9c..00000000 --- a/docs/generated/sparse.nansum.rst +++ /dev/null @@ -1,6 +0,0 @@ -nansum -====== - -.. currentmodule:: sparse - -.. autofunction:: nansum diff --git a/docs/generated/sparse.nonzero.rst b/docs/generated/sparse.nonzero.rst deleted file mode 100644 index a9717e3d..00000000 --- a/docs/generated/sparse.nonzero.rst +++ /dev/null @@ -1,6 +0,0 @@ -nonzero -======= - -.. currentmodule:: sparse - -.. autofunction:: nonzero diff --git a/docs/generated/sparse.ones.rst b/docs/generated/sparse.ones.rst deleted file mode 100644 index b57e7845..00000000 --- a/docs/generated/sparse.ones.rst +++ /dev/null @@ -1,6 +0,0 @@ -ones -==== - -.. currentmodule:: sparse - -.. autofunction:: ones diff --git a/docs/generated/sparse.ones_like.rst b/docs/generated/sparse.ones_like.rst deleted file mode 100644 index 7e1cb0bd..00000000 --- a/docs/generated/sparse.ones_like.rst +++ /dev/null @@ -1,6 +0,0 @@ -ones_like -========= - -.. currentmodule:: sparse - -.. autofunction:: ones_like diff --git a/docs/generated/sparse.outer.rst b/docs/generated/sparse.outer.rst deleted file mode 100644 index 216d706a..00000000 --- a/docs/generated/sparse.outer.rst +++ /dev/null @@ -1,6 +0,0 @@ -outer -===== - -.. currentmodule:: sparse - -.. autofunction:: outer diff --git a/docs/generated/sparse.pad.rst b/docs/generated/sparse.pad.rst deleted file mode 100644 index bc898704..00000000 --- a/docs/generated/sparse.pad.rst +++ /dev/null @@ -1,6 +0,0 @@ -pad -=== - -.. currentmodule:: sparse - -.. autofunction:: pad diff --git a/docs/generated/sparse.permute_dims.rst b/docs/generated/sparse.permute_dims.rst deleted file mode 100644 index cb1eefb4..00000000 --- a/docs/generated/sparse.permute_dims.rst +++ /dev/null @@ -1,6 +0,0 @@ -permute\_dims -============= - -.. currentmodule:: sparse - -.. autofunction:: permute_dims diff --git a/docs/generated/sparse.prod.rst b/docs/generated/sparse.prod.rst deleted file mode 100644 index d562dc69..00000000 --- a/docs/generated/sparse.prod.rst +++ /dev/null @@ -1,6 +0,0 @@ -prod -==== - -.. currentmodule:: sparse - -.. autofunction:: prod diff --git a/docs/generated/sparse.random.rst b/docs/generated/sparse.random.rst deleted file mode 100644 index 7b53d1f6..00000000 --- a/docs/generated/sparse.random.rst +++ /dev/null @@ -1,6 +0,0 @@ -random -====== - -.. currentmodule:: sparse - -.. autofunction:: random diff --git a/docs/generated/sparse.reshape.rst b/docs/generated/sparse.reshape.rst deleted file mode 100644 index 8426bda1..00000000 --- a/docs/generated/sparse.reshape.rst +++ /dev/null @@ -1,6 +0,0 @@ -reshape -======= - -.. currentmodule:: sparse - -.. autofunction:: reshape diff --git a/docs/generated/sparse.result_type.rst b/docs/generated/sparse.result_type.rst deleted file mode 100644 index b7dcbf4f..00000000 --- a/docs/generated/sparse.result_type.rst +++ /dev/null @@ -1,6 +0,0 @@ -result_type -=========== - -.. currentmodule:: sparse - -.. autofunction:: result_type diff --git a/docs/generated/sparse.roll.rst b/docs/generated/sparse.roll.rst deleted file mode 100644 index 86374c17..00000000 --- a/docs/generated/sparse.roll.rst +++ /dev/null @@ -1,6 +0,0 @@ -roll -==== - -.. currentmodule:: sparse - -.. autofunction:: roll diff --git a/docs/generated/sparse.round.rst b/docs/generated/sparse.round.rst deleted file mode 100644 index 17f4e39b..00000000 --- a/docs/generated/sparse.round.rst +++ /dev/null @@ -1,6 +0,0 @@ -round -===== - -.. currentmodule:: sparse - -.. autofunction:: round diff --git a/docs/generated/sparse.rst b/docs/generated/sparse.rst deleted file mode 100644 index 9592cc24..00000000 --- a/docs/generated/sparse.rst +++ /dev/null @@ -1,177 +0,0 @@ -API -=== - -.. rubric:: Description -.. automodule:: sparse -.. currentmodule:: sparse - - -.. rubric:: Classes -.. autosummary:: - :toctree: - - COO - - DOK - - GCXS - - SparseArray - -.. rubric:: Functions -.. autosummary:: - :toctree: - - abs - - all - - any - - argmax - - argmin - - argwhere - - asCOO - - as_coo - - asarray - - asnumpy - - astype - - broadcast_arrays - - broadcast_to - - clip - - concat - - concatenate - - diagonal - - diagonalize - - dot - - einsum - - elemwise - - empty - - empty_like - - equal - - expand_dims - - eye - - flip - - full - - full_like - - isinf - - isnan - - isneginf - - isposinf - - kron - - load_npz - - matmul - - matrix_transpose - - max - - mean - - min - - moveaxis - - moveaxis - - nanmax - - nanmean - - nanmin - - nanprod - - nanreduce - - nansum - - nonzero - - ones - - ones_like - - outer - - pad - - permute_dims - - prod - - random - - reshape - - result_type - - roll - - round - - save_npz - - sort - - squeeze - - stack - - std - - sum - - take - - tensordot - - tril - - triu - - unique_counts - - unique_values - - var - - vecdot - - where - - zeros - - zeros_like diff --git a/docs/generated/sparse.save_npz.rst b/docs/generated/sparse.save_npz.rst deleted file mode 100644 index 9117386b..00000000 --- a/docs/generated/sparse.save_npz.rst +++ /dev/null @@ -1,6 +0,0 @@ -save\_npz -========= - -.. currentmodule:: sparse - -.. autofunction:: save_npz diff --git a/docs/generated/sparse.sort.rst b/docs/generated/sparse.sort.rst deleted file mode 100644 index cf1e71a0..00000000 --- a/docs/generated/sparse.sort.rst +++ /dev/null @@ -1,6 +0,0 @@ -sort -==== - -.. currentmodule:: sparse - -.. autofunction:: sort diff --git a/docs/generated/sparse.squeeze.rst b/docs/generated/sparse.squeeze.rst deleted file mode 100644 index 92ebf2e5..00000000 --- a/docs/generated/sparse.squeeze.rst +++ /dev/null @@ -1,6 +0,0 @@ -squeeze -======= - -.. currentmodule:: sparse - -.. autofunction:: squeeze diff --git a/docs/generated/sparse.stack.rst b/docs/generated/sparse.stack.rst deleted file mode 100644 index b924785c..00000000 --- a/docs/generated/sparse.stack.rst +++ /dev/null @@ -1,6 +0,0 @@ -stack -===== - -.. currentmodule:: sparse - -.. autofunction:: stack diff --git a/docs/generated/sparse.std.rst b/docs/generated/sparse.std.rst deleted file mode 100644 index edeb4124..00000000 --- a/docs/generated/sparse.std.rst +++ /dev/null @@ -1,6 +0,0 @@ -std -=== - -.. currentmodule:: sparse - -.. autofunction:: std diff --git a/docs/generated/sparse.sum.rst b/docs/generated/sparse.sum.rst deleted file mode 100644 index 71b5154c..00000000 --- a/docs/generated/sparse.sum.rst +++ /dev/null @@ -1,6 +0,0 @@ -sum -=== - -.. currentmodule:: sparse - -.. autofunction:: sum diff --git a/docs/generated/sparse.take.rst b/docs/generated/sparse.take.rst deleted file mode 100644 index 42f5ac85..00000000 --- a/docs/generated/sparse.take.rst +++ /dev/null @@ -1,6 +0,0 @@ -take -==== - -.. currentmodule:: sparse - -.. autofunction:: take diff --git a/docs/generated/sparse.tensordot.rst b/docs/generated/sparse.tensordot.rst deleted file mode 100644 index 252d1868..00000000 --- a/docs/generated/sparse.tensordot.rst +++ /dev/null @@ -1,6 +0,0 @@ -tensordot -========= - -.. currentmodule:: sparse - -.. autofunction:: tensordot diff --git a/docs/generated/sparse.tril.rst b/docs/generated/sparse.tril.rst deleted file mode 100644 index 4fef3b9d..00000000 --- a/docs/generated/sparse.tril.rst +++ /dev/null @@ -1,6 +0,0 @@ -tril -==== - -.. currentmodule:: sparse - -.. autofunction:: tril diff --git a/docs/generated/sparse.triu.rst b/docs/generated/sparse.triu.rst deleted file mode 100644 index 283e633f..00000000 --- a/docs/generated/sparse.triu.rst +++ /dev/null @@ -1,6 +0,0 @@ -triu -==== - -.. currentmodule:: sparse - -.. autofunction:: triu diff --git a/docs/generated/sparse.unique_counts.rst b/docs/generated/sparse.unique_counts.rst deleted file mode 100644 index 621cbfe9..00000000 --- a/docs/generated/sparse.unique_counts.rst +++ /dev/null @@ -1,6 +0,0 @@ -unique\_counts -============== - -.. currentmodule:: sparse - -.. autofunction:: unique_counts diff --git a/docs/generated/sparse.unique_values.rst b/docs/generated/sparse.unique_values.rst deleted file mode 100644 index 415c55bf..00000000 --- a/docs/generated/sparse.unique_values.rst +++ /dev/null @@ -1,6 +0,0 @@ -unique\_values -============== - -.. currentmodule:: sparse - -.. autofunction:: unique_values diff --git a/docs/generated/sparse.var.rst b/docs/generated/sparse.var.rst deleted file mode 100644 index f8badb51..00000000 --- a/docs/generated/sparse.var.rst +++ /dev/null @@ -1,6 +0,0 @@ -var -=== - -.. currentmodule:: sparse - -.. autofunction:: var diff --git a/docs/generated/sparse.vecdot.rst b/docs/generated/sparse.vecdot.rst deleted file mode 100644 index 995d8108..00000000 --- a/docs/generated/sparse.vecdot.rst +++ /dev/null @@ -1,6 +0,0 @@ -vecdot -====== - -.. currentmodule:: sparse - -.. autofunction:: vecdot diff --git a/docs/generated/sparse.where.rst b/docs/generated/sparse.where.rst deleted file mode 100644 index 2d3f2595..00000000 --- a/docs/generated/sparse.where.rst +++ /dev/null @@ -1,6 +0,0 @@ -where -===== - -.. currentmodule:: sparse - -.. autofunction:: where diff --git a/docs/generated/sparse.zeros.rst b/docs/generated/sparse.zeros.rst deleted file mode 100644 index c5e6a622..00000000 --- a/docs/generated/sparse.zeros.rst +++ /dev/null @@ -1,6 +0,0 @@ -zeros -===== - -.. currentmodule:: sparse - -.. autofunction:: zeros diff --git a/docs/generated/sparse.zeros_like.rst b/docs/generated/sparse.zeros_like.rst deleted file mode 100644 index 57ef9c2d..00000000 --- a/docs/generated/sparse.zeros_like.rst +++ /dev/null @@ -1,6 +0,0 @@ -zeros_like -========== - -.. currentmodule:: sparse - -.. autofunction:: zeros_like diff --git a/docs/how-to-guides.md b/docs/how-to-guides.md new file mode 100644 index 00000000..8cc94feb --- /dev/null +++ b/docs/how-to-guides.md @@ -0,0 +1,5 @@ +# How to guides + +* [Getting started](quickstart.md) +* [Construct](construct.md) +* [Operations](operations.md) \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index d08204a8..7cec4551 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,11 +18,11 @@ dimensions.
![Sparse](./assets/images/conference-room-icon.png){width=10%, align=left} - Introduction + Introduction { .card } - + ![Sparse](./assets/images/install-software-download-icon.png){width=10%, align=left} - Install + Install { .card } ![Sparse](./assets/images/open-book-icon.png){width=10%, align=left} @@ -39,7 +39,7 @@ dimensions. ![Sparse](./assets/images/group-discussion-icon.png){width=10%, align=left} - Contributing + Contributing { .card }
diff --git a/mkdocs.yml b/mkdocs.yml index ccc48452..61ebe152 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,6 +1,7 @@ site_name: sparse repo_url: https://github.com/pydata/sparse.git edit_uri: edit/main/docs/ +#use_directory_urls: false theme: name: material palette: @@ -10,12 +11,16 @@ theme: logo: assets/images/logo.png favicon: assets/images/logo.svg features: + - navigation.tabs + - navigation.tabs.sticky - navigation.tracking - navigation.instant - navigation.instant.progress - navigation.prune - navigation.footer - navigation.indexes + - navigation.expand + - navigation.top # adds a back-to-top button when user scrolls up - content.code.copy markdown_extensions: @@ -41,40 +46,65 @@ extra_css: - css/mkdocstrings.css plugins: -- search -- section-index -- autorefs -- gen-files: - scripts: - - scripts/gen_ref_pages.py -- literate-nav -- mkdocstrings: - handlers: - python: - import: - - https://numpy.org/doc/stable/objects.inv - - https://docs.python.org/3/objects.inv - - https://docs.scipy.org/doc/scipy/objects.inv - options: - inherited_members: yes - show_root_members_full_path: false - show_if_no_docstring: true - members_order: source - docstring_style: numpy - show_source: true - filters: ["!^_"] - + - search + - section-index + - autorefs + - gen-files: + scripts: + - scripts/gen_ref_pages.py + - literate-nav + - mkdocstrings: + handlers: + python: + import: + - https://numpy.org/doc/stable/objects.inv + - https://docs.python.org/3/objects.inv + - https://docs.scipy.org/doc/scipy/objects.inv + options: + inherited_members: yes + show_root_members_full_path: false + show_if_no_docstring: true + members_order: source + docstring_style: numpy + show_source: true + filters: ["!^_"] + group_by_category: true + show_category_heading: true + + - mkdocs-jupyter: + include_source: True + nav: -- index.md -- introduction.md -- install.md -- quickstart.md -- construct.md -- operations.md -- API: - - api/* -- roadmap.md -# - completed-tasks.md -- contributing.md -- changelog.md -- conduct.md + - Home: index.md + - Introduction: introduction.md + - Install: install.md + - Tutorials: examples/sparse_finch.ipynb + - How to guides: + - how-to-guides.md + - quickstart.md + - construct.md + - operations.md + - API: + - api/* + - Contributing: + - contributing.md + - roadmap.md + - completed-tasks.md + - changelog.md + - conduct.md + +#- index.md +#- introduction.md +#- install.md +#- quickstart.md +#- construct.md +#- operations.md +#- API: +# - api/* +#- roadmap.md +## - completed-tasks.md +#- contributing.md +#- changelog.md +#- conduct.md +#- Notebook page: examples/sparse_finch.ipynb +#- examples-test.md diff --git a/pyproject.toml b/pyproject.toml index 5630509a..1767a534 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,6 +34,7 @@ docs = [ "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-section-index", + "mkdocs-jupiter", "scipy", ] tests = [ From af1767d4ddd7d9aeca95f39bc189fbd905b5f102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 10:17:54 +0200 Subject: [PATCH 05/11] working on changelog --- docs/changelog.md | 132 +++++++++++++++++++++++----------------------- 1 file changed, 65 insertions(+), 67 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 8f9f4997..56d19ce2 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,7 +1,5 @@ -Changelog -========= +# Changelog -.. currentmodule:: sparse 0.15.1 / 2024-01-10 ------------------- @@ -9,8 +7,8 @@ Changelog 0.15.0 / 2024-01-09 ------------------- -* Fix regression where :obj:`DeprecationWarning`s were being fired unexpectedly. (PR [#581](https://github.com/pydata/sparse/pull/581) thanks [@hameerabbasi](https://github.com/hameerabbasi)) -* Extended :obj:`sparse.einsum` support (PR [#579](https://github.com/pydata/sparse/pull/579) thanks [@HadrienNU](https://github.com/HadrienNU)) +* Fix regression where [DeprecationWarning][]s were being fired unexpectedly. (PR [#581](https://github.com/pydata/sparse/pull/581) thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Extended [`sparse.einsum`][] support (PR [#579](https://github.com/pydata/sparse/pull/579) thanks [@HadrienNU](https://github.com/HadrienNU)) * General code clean-up (PR [#586](https://github.com/pydata/sparse/pull/586) thanks [@MHRasmy](https://github.com/MHRasmy), PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@jamestwebber](https://github.com/jamestwebber)) * Bug fixes with respect to NumPy compatibility (PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@hameerabbasi](https://github.com/hameerabbasi), PR [#609](https://github.com/pydata/sparse/pull/609) thanks [@Illviljan](https://github.com/Illviljan), PR [#620](https://github.com/pydata/sparse/pull/620) thanks [@mtsokol](https://github.com/mtsokol)) * Bug fixes with respect to GCXS (PR [#611](https://github.com/pydata/sparse/pull/611) thanks [@EuGig](https://github.com/EuGig), PR [#601](https://github.com/pydata/sparse/pull/601) thanks [@jamestwebber](https://github.com/jamestwebber)) @@ -22,7 +20,7 @@ Changelog 0.14.0 / 2023-02-24 ------------------- -* :obj:`sparse.einsum` support (PR [#564](https://github.com/pydata/sparse/pull/564) thanks +* [`sparse.einsum`][] support (PR [#564](https://github.com/pydata/sparse/pull/564) thanks [@jcmgray](https://github.com/jcmgray)) * Some bug-fixes (PR [#524](https://github.com/pydata/sparse/pull/524), PR [#527](https://github.com/pydata/sparse/pull/527), PR [#555](https://github.com/pydata/sparse/pull/555) thanks [@hameerabbasi](https://github.com/hameerabbasi), PR [#569](https://github.com/pydata/sparse/pull/569), thanks [@jamestwebber](https://github.com/jamestwebber), PR [#534](https://github.com/pydata/sparse/pull/534), thanks [@sarveshbhatnagar](https://github.com/sarveshbhatnagar)) * Some performance improvements (PR [#570](https://github.com/pydata/sparse/pull/570), thanks [@jamestwebber](https://github.com/jamestwebber), PR [#540](https://github.com/pydata/sparse/pull/540), thanks [@smldub](https://github.com/smldub)). @@ -31,20 +29,20 @@ Changelog 0.13.0 / 2021-08-28 ------------------- -* GCXS improvements and changes. (PR [#448](https://github.com/pydata/sparse/pull/448), PR [#450](https://github.com/pydata/sparse/pull/450), PR [#455](https://github.com/pydata/sparse/pull/455), thanks +* [`sparse.GCXS`][] improvements and changes. (PR [#448](https://github.com/pydata/sparse/pull/448), PR [#450](https://github.com/pydata/sparse/pull/450), PR [#455](https://github.com/pydata/sparse/pull/455), thanks [@sayandip18](https://github.com/sayandip18)). * Maintainence fixes (PR [#462](https://github.com/pydata/sparse/pull/462), PR [#466](https://github.com/pydata/sparse/pull/466), :commit:`1ccb85da581be65a0345b399e00fd3c325700d95`, :commit:`5547b4e92dc8d61492e9dc10ba00175c1a6637fa` :commit:`00c0e5514de2aab8b9a0be16b5da470b091d9eb9`, :commit:`fcd3020dd08c7022a44f709173fe23969d3e8f7c`, thanks [@hameerabbasi](https://github.com/hameerabbasi)) -* :obj:`sparse.DOK.from_scipy_sparse` method (PR [#464](https://github.com/pydata/sparse/pull/464), Issue [#463](https://github.com/pydata/sparse/issues/463), thanks +* [`sparse.DOK.from_scipy_sparse`][] method (PR [#464](https://github.com/pydata/sparse/pull/464), Issue [#463](https://github.com/pydata/sparse/issues/463), thanks [@hameerabbasi](https://github.com/hameerabbasi)). * Black re-formatting (PR [#471](https://github.com/pydata/sparse/pull/471), PR [#484](https://github.com/pydata/sparse/pull/484), thanks [@GenevieveBuckley](https://github.com/GenevieveBuckley), [@sayandip18](https://github.com/sayandip18)) -* Add :obj:`sparse.pad` (PR [#474](https://github.com/pydata/sparse/pull/474), Issue [#438](https://github.com/pydata/sparse/issues/438), thanks [@H4R5H1T-007](https://github.com/H4R5H1T-007)) +* Add [`sparse.pad`][] (PR [#474](https://github.com/pydata/sparse/pull/474), Issue [#438](https://github.com/pydata/sparse/issues/438), thanks [@H4R5H1T-007](https://github.com/H4R5H1T-007)) * Switch to GitHub Actions (:compare:`5547b4e92dc8d61492e9dc10ba00175c1a6637fa..a332f22c96a96e5ab9b4384342df67e8f3966f85`) * Fix a number of bugs in format conversion. (PR [#504](https://github.com/pydata/sparse/pull/504), Issue [#503](https://github.com/pydata/sparse/issues/503), thanks [@hameerabbasi](https://github.com/hameerabbasi)) -* Fix bug in :obj:`sparse.matmul` for higher-dimensional arrays. (PR [#508](https://github.com/pydata/sparse/pull/508), +* Fix bug in [`sparse.matmul`][] for higher-dimensional arrays. (PR [#508](https://github.com/pydata/sparse/pull/508), Issue [#506](https://github.com/pydata/sparse/issues/506), thanks [@sayandip18](https://github.com/sayandip18)). * Fix scalar conversion to COO (Issue [#510](https://github.com/pydata/sparse/issues/510), PR [#511](https://github.com/pydata/sparse/pull/511), thanks [@hameerabbasi](https://github.com/hameerabbasi)) * Fix OOB memory accesses (Issue [#515](https://github.com/pydata/sparse/issues/515), :commit:`1e24a7e29786e888dee4c02153309986ae4b5dde` @@ -62,39 +60,39 @@ Changelog ------------------- There are a number of large changes in this release. For example, we have implemented the -:obj:`GCXS` type, and its specializations :obj:`CSR` and :obj:`CSC`. We plan on gradually improving +[`sparse.GCXS`][] type, and its specializations [`sparse.CSR`][] and [`sparse.CSC`][]. We plan on gradually improving the performance of these. -* A number of :obj:`GCXS` fixes and additions (PR [#409](https://github.com/pydata/sparse/pull/409), PR [#407](https://github.com/pydata/sparse/pull/407), PR [#414](https://github.com/pydata/sparse/pull/414), +* A number of [`sparse.GCXS`][] fixes and additions (PR [#409](https://github.com/pydata/sparse/pull/409), PR [#407](https://github.com/pydata/sparse/pull/407), PR [#414](https://github.com/pydata/sparse/pull/414), PR [#417](https://github.com/pydata/sparse/pull/417), PR [#419](https://github.com/pydata/sparse/pull/419) thanks [@daletovar](https://github.com/daletovar)) * Ability to change the index dtype for better storage characteristics. (PR [#441](https://github.com/pydata/sparse/pull/441), thanks [@daletovar](https://github.com/daletovar)) -* Some work on :obj:`DOK` arrays to bring them closer to the other formats (PR [#435](https://github.com/pydata/sparse/pull/435), +* Some work on [`sparse.DOK`][] arrays to bring them closer to the other formats (PR [#435](https://github.com/pydata/sparse/pull/435), PR [#437](https://github.com/pydata/sparse/pull/437), PR [#439](https://github.com/pydata/sparse/pull/439), PR [#440](https://github.com/pydata/sparse/pull/440), thanks [@DragaDoncila](https://github.com/DragaDoncila)) -* :obj:`CSR` and :obj:`CSC` specializations of :obj:`GCXS` (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) +* [`sparse.CSR`][] and [`sparse.CSC`] specializations of [`sparse.GCXS`][] (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) For now, this is experimental undocumented API, and subject to change. * Fix a number of bugs (PR [#407](https://github.com/pydata/sparse/pull/407), Issue [#406](https://github.com/pydata/sparse/issues/406)) -* Add ``nnz`` parameter to :obj:`sparse.random` (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) +* Add [nnz][] parameter to [`sparse.random`][] (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) 0.11.2 / 2020-09-04 ------------------- -* Fix :obj:`TypingError` on :obj:`sparse.dot` with complex dtypes. (Issue [#403](https://github.com/pydata/sparse/issues/403), PR [#404](https://github.com/pydata/sparse/pull/404)) +* Fix [TypingError] on [`sparse.dot`][] with complex dtypes. (Issue [#403](https://github.com/pydata/sparse/issues/403), PR [#404](https://github.com/pydata/sparse/pull/404)) 0.11.1 / 2020-08-31 ------------------- -* Fix :obj:`ValueError` on :obj:`sparse.dot` with extremely small values. (Issue [#398](https://github.com/pydata/sparse/issues/398), PR [#399](https://github.com/pydata/sparse/pull/399)) +* Fix [ValueError] on [`sparse.dot`][] with extremely small values. (Issue [#398](https://github.com/pydata/sparse/issues/398), PR [#399](https://github.com/pydata/sparse/pull/399)) 0.11.0 / 2020-08-18 ------------------- -* Improve the performance of :obj:`sparse.dot`. (Issue [#331](https://github.com/pydata/sparse/issues/331), PR [#389](https://github.com/pydata/sparse/pull/389), thanks [@daletovar](https://github.com/daletovar)) -* Added the :obj:`COO.swapaxes` method. (PR [#344](https://github.com/pydata/sparse/pull/344), thanks [@lueckem](https://github.com/lueckem)) +* Improve the performance of [`sparse.dot`][]. (Issue [#331](https://github.com/pydata/sparse/issues/331), PR [#389](https://github.com/pydata/sparse/pull/389), thanks [@daletovar](https://github.com/daletovar)) +* Added the [`sparse.COO.swapaxes`][] method. (PR [#344](https://github.com/pydata/sparse/pull/344), thanks [@lueckem](https://github.com/lueckem)) * Added multi-axis 1-D indexing support. (PR [#343](https://github.com/pydata/sparse/pull/343), thanks [@mikeymezher](https://github.com/mikeymezher)) -* Fix :obj:`outer` for arrays that weren't one-dimensional. (Issue [#346](https://github.com/pydata/sparse/issues/346), PR [#347](https://github.com/pydata/sparse/pull/347)) -* Add ``casting`` kwarg to :obj:`COO.astype`. (Issue [#391](https://github.com/pydata/sparse/issues/391), PR [#392](https://github.com/pydata/sparse/pull/392)) -* Fix for :obj:`COO` constructor accepting invalid inputs. (Issue [#385](https://github.com/pydata/sparse/issues/385), PR [#386](https://github.com/pydata/sparse/pull/386)) +* Fix `outer` for arrays that weren't one-dimensional. (Issue [#346](https://github.com/pydata/sparse/issues/346), PR [#347](https://github.com/pydata/sparse/pull/347)) +* Add `casting` kwarg to [`sparse.COO.astype`][]. (Issue [#391](https://github.com/pydata/sparse/issues/391), PR [#392](https://github.com/pydata/sparse/pull/392)) +* Fix for [COO][] constructor accepting invalid inputs. (Issue [#385](https://github.com/pydata/sparse/issues/385), PR [#386](https://github.com/pydata/sparse/pull/386)) 0.10.0 / 2020-05-13 ------------------- @@ -102,7 +100,7 @@ the performance of these. * Fixed a bug where converting an empty DOK array to COO leads to an incorrect dtype. (Issue [#314](https://github.com/pydata/sparse/issues/314), PR [#315](https://github.com/pydata/sparse/pull/315)) * Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) -* Add :obj:`COO.flatten` and :obj:`sparse.outer`. (Issue [#316](https://github.com/pydata/sparse/issues/316), PR [#317](https://github.com/pydata/sparse/pull/317)). +* Add [COO.flatten]` and [`sparse.outer`][]. (Issue [#316](https://github.com/pydata/sparse/issues/316), PR [#317](https://github.com/pydata/sparse/pull/317)). * Remove broadcasting restriction between sparse arrays and dense arrays. (Issue [#306](https://github.com/pydata/sparse/issues/306), PR [#318](https://github.com/pydata/sparse/pull/318)) * Implement deterministic dask tokenization. (Issue [#300](https://github.com/pydata/sparse/issues/300), PR [#320](https://github.com/pydata/sparse/pull/320), thanks @@ -117,7 +115,7 @@ the performance of these. PR [#333](https://github.com/pydata/sparse/pull/333), thanks [@guilhermeleobas](https://github.com/guilhermeleobas)). * Maintainence fixes for Sphinx 3.0 and Numba 0.49, and dropping support for Python 3.5. (PR [#337](https://github.com/pydata/sparse/pull/337)). -* Fixed signature for :obj:`numpy.clip`. +* Fixed signature for [numpy.clip][]. 0.9.1 / 2020-01-23 ------------------ @@ -125,16 +123,16 @@ the performance of these. * Fixed a bug where indexing with an empty list could lead to issues. (Issue [#281](https://github.com/pydata/sparse/issues/281), PR [#282](https://github.com/pydata/sparse/pull/282)) * Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) -* Add the :obj:`diagonal` and :obj:`diagonalize` functions. +* Add the [`diagonal`][] and [`diagonalize][] functions. (Issue [#288](https://github.com/pydata/sparse/issues/288), PR [#289](https://github.com/pydata/sparse/pull/289), thanks [@pettni](https://github.com/pettni)) * Add HTML repr for notebooks. (PR [#283](https://github.com/pydata/sparse/pull/283), thanks [@daletovar](https://github.com/daletovar)) -* Avoid making copy of ``coords`` when making a new :obj:`COO` +* Avoid making copy of ``coords`` when making a new [`sparse.COO`][] array. * Add stack and concatenate for GCXS. (Issue [#301](https://github.com/pydata/sparse/issues/301), PR [#303](https://github.com/pydata/sparse/pull/303), thanks [@daletovar](https://github.com/daletovar)). * Fix issue where functions dispatching to an attribute access wouldn't work with ``__array_function__``. (Issue [#308](https://github.com/pydata/sparse/issues/308), PR [#309](https://github.com/pydata/sparse/pull/309)). -* Add partial support for constructing and mirroring :obj:`COO` objects to +* Add partial support for constructing and mirroring [`sparse.COO`][] objects to Numba. 0.8.0 / 2019-08-26 @@ -187,8 +185,8 @@ This was mainly a contributor-driven release. The full list of changes can be found below: -* Fixed a bug where going between :obj:`sparse.DOK` and - :obj:`sparse.COO` caused fill-values to be lost. +* Fixed a bug where going between [`sparse.DOK`][] and + [`sparse.COO`][] caused fill-values to be lost. (Issue [#225](https://github.com/pydata/sparse/issues/225), PR [#226](https://github.com/pydata/sparse/pull/226)). * Fixed warning for a matrix that was incorrectly considered too dense. (Issue [#228](https://github.com/pydata/sparse/issues/228), PR [#229](https://github.com/pydata/sparse/pull/229)) @@ -229,46 +227,46 @@ an attempt is made to automatically densify an array. To densify, use the explic 0.5.0 / 2018-10-12 ------------------ -* Added :code:`COO.real`, :code:`COO.imag`, and :code:`COO.conj` (PR [#196](https://github.com/pydata/sparse/pull/196)). -* Added :code:`sparse.kron` function (PR [#194](https://github.com/pydata/sparse/pull/194), PR [#195](https://github.com/pydata/sparse/pull/195)). -* Added :code:`order` parameter to :code:`COO.reshape` to make it work with - :code:`np.reshape` (PR [#193](https://github.com/pydata/sparse/pull/193)). -* Added :code:`COO.mean` and :code:`sparse.nanmean` (PR [#190](https://github.com/pydata/sparse/pull/190)). -* Added :code:`sparse.full` and :code:`sparse.full_like` (PR [#189](https://github.com/pydata/sparse/pull/189)). -* Added :code:`COO.clip` method (PR [#185](https://github.com/pydata/sparse/pull/185)). -* Added :code:`COO.copy` method, and changed pickle of :code:`COO` to not +* Added `COO.real`, `COO.imag`, and `COO.conj` (PR [#196](https://github.com/pydata/sparse/pull/196)). +* Added `sparse.kron` function (PR [#194](https://github.com/pydata/sparse/pull/194), PR [#195](https://github.com/pydata/sparse/pull/195)). +* Added `order` parameter to `COO.reshape` to make it work with + `np.reshape` (PR [#193](https://github.com/pydata/sparse/pull/193)). +* Added `COO.mean` and `sparse.nanmean` (PR [#190](https://github.com/pydata/sparse/pull/190)). +* Added `sparse.full` and `sparse.full_like` (PR [#189](https://github.com/pydata/sparse/pull/189)). +* Added `COO.clip` method (PR [#185](https://github.com/pydata/sparse/pull/185)). +* Added `COO.copy` method, and changed pickle of `COO` to not include its cache (PR [#184](https://github.com/pydata/sparse/pull/184)). -* Added :code:`sparse.eye`, :code:`sparse.zeros`, :code:`sparse.zeros_like`, - :code:`sparse.ones`, and :code:`sparse.ones_like` (PR [#183](https://github.com/pydata/sparse/pull/183)). +* Added `sparse.eye`, `sparse.zeros`, `sparse.zeros_like`, + `sparse.ones`, and `sparse.ones_like` (PR [#183](https://github.com/pydata/sparse/pull/183)). 0.4.1 / 2018-09-12 ------------------ -* Allow mixed :code:`ndarray`-:code:`COO` operations if the result is sparse +* Allow mixed `ndarray`-`COO` operations if the result is sparse (Issue [#124](https://github.com/pydata/sparse/issues/124), via PR [#182](https://github.com/pydata/sparse/pull/182)). * Allow specifying a fill-value when converting from NumPy arrays (Issue [#179](https://github.com/pydata/sparse/issues/179), via PR [#180](https://github.com/pydata/sparse/pull/180)). -* Added :code:`COO.any` and :code:`COO.all` methods (PR [#175](https://github.com/pydata/sparse/pull/175)). -* Indexing for :code:`COO` now accepts a single one-dimensional array index +* Added `COO.any` and `COO.all` methods (PR [#175](https://github.com/pydata/sparse/pull/175)). +* Indexing for `COO` now accepts a single one-dimensional array index (PR [#172](https://github.com/pydata/sparse/pull/172)). -* The fill-value can now be something other than zero or :code:`False` +* The fill-value can now be something other than zero or `False` (PR [#165](https://github.com/pydata/sparse/pull/165)). -* Added a :code:`sparse.roll` function (PR [#160](https://github.com/pydata/sparse/pull/160)). +* Added a `sparse.roll` function (PR [#160](https://github.com/pydata/sparse/pull/160)). * Numba code now releases the GIL. This leads to better multi-threaded performance in Dask (PR [#159](https://github.com/pydata/sparse/pull/159)). -* A number of bugs occurred, so to resolve them, :code:`COO.coords.dtype` is - always :code:`np.int64`. :code:`COO`, therefore, uses more memory than +* A number of bugs occurred, so to resolve them, `COO.coords.dtype` is + always `np.int64`. `COO`, therefore, uses more memory than before (PR [#158](https://github.com/pydata/sparse/pull/158)). -* Add support for saving and loading :code:`COO` files from disk (Issue [#153](https://github.com/pydata/sparse/issues/153), +* Add support for saving and loading `COO` files from disk (Issue [#153](https://github.com/pydata/sparse/issues/153), via PR [#154](https://github.com/pydata/sparse/pull/154)). -* Support :code:`COO.nonzero` and :code:`np.argwhere` (Issue [#145](https://github.com/pydata/sparse/issues/145), via +* Support `COO.nonzero` and `np.argwhere` (Issue [#145](https://github.com/pydata/sparse/issues/145), via PR [#148](https://github.com/pydata/sparse/pull/148)). * Allow faux in-place operations (Issue [#80](https://github.com/pydata/sparse/issues/80), via PR [#146](https://github.com/pydata/sparse/pull/146)). -* :code:`COO` is now always canonical (PR [#141](https://github.com/pydata/sparse/pull/141)). +* `COO` is now always canonical (PR [#141](https://github.com/pydata/sparse/pull/141)). * Improve indexing performance (PR [#128](https://github.com/pydata/sparse/pull/128)). * Improve element-wise performance (PR [#127](https://github.com/pydata/sparse/pull/127)). * Reductions now support a negative axis (Issue [#117](https://github.com/pydata/sparse/issues/117), via PR [#118](https://github.com/pydata/sparse/pull/118)). -* Match behaviour of :code:`ufunc.reduce` from NumPy (Issue [#107](https://github.com/pydata/sparse/issues/107), via +* Match behaviour of `ufunc.reduce` from NumPy (Issue [#107](https://github.com/pydata/sparse/issues/107), via PR [#108](https://github.com/pydata/sparse/pull/108)). 0.3.1 / 2018-04-12 @@ -280,37 +278,37 @@ an attempt is made to automatically densify an array. To densify, use the explic ------------------ * Add NaN-skipping aggregations (PR [#102](https://github.com/pydata/sparse/pull/102)). -* Add equivalent to :code:`np.where` (PR [#102](https://github.com/pydata/sparse/pull/102)). +* Add equivalent to `np.where` (PR [#102](https://github.com/pydata/sparse/pull/102)). * N-input universal functions now work (PR [#98](https://github.com/pydata/sparse/pull/98)). -* Make :code:`dot` more consistent with NumPy (PR [#96](https://github.com/pydata/sparse/pull/96)). -* Create a base class :code:`SparseArray` (PR [#92](https://github.com/pydata/sparse/pull/92)). +* Make `dot` more consistent with NumPy (PR [#96](https://github.com/pydata/sparse/pull/96)). +* Create a base class `SparseArray` (PR [#92](https://github.com/pydata/sparse/pull/92)). * Minimum NumPy version is now 1.13 (PR [#90](https://github.com/pydata/sparse/pull/90)). -* Fix a bug where setting a :code:`DOK` element to zero did nothing +* Fix a bug where setting a `DOK` element to zero did nothing (Issue [#93](https://github.com/pydata/sparse/issues/93), via PR [#94](https://github.com/pydata/sparse/pull/94)). 0.2.0 / 2018-01-25 ------------------ -* Support faster :code:`np.array(COO)` (PR [#87](https://github.com/pydata/sparse/pull/87)). -* Add :code:`DOK` type (PR [#85](https://github.com/pydata/sparse/pull/85)). +* Support faster `np.array(COO)` (PR [#87](https://github.com/pydata/sparse/pull/87)). +* Add `DOK` type (PR [#85](https://github.com/pydata/sparse/pull/85)). * Fix sum for large arrays (Issue [#82](https://github.com/pydata/sparse/issues/82), via PR [#83](https://github.com/pydata/sparse/pull/83)). -* Support :code:`.size` and :code:`.density` (PR [#69](https://github.com/pydata/sparse/pull/69)). +* Support `.size` and `.density` (PR [#69](https://github.com/pydata/sparse/pull/69)). * Documentation added for the package (PR [#43](https://github.com/pydata/sparse/pull/43)). * Minimum required SciPy version is now 0.19 (PR [#70](https://github.com/pydata/sparse/pull/70)). -* :code:`len(COO)` now works (PR [#68](https://github.com/pydata/sparse/pull/68)). -* :code:`scalar op COO` now works for all operators (PR [#67](https://github.com/pydata/sparse/pull/67)). -* Validate axes for :code:`.transpose()` (PR [#61](https://github.com/pydata/sparse/pull/61)). +* `len(COO)` now works (PR [#68](https://github.com/pydata/sparse/pull/68)). +* `scalar op COO` now works for all operators (PR [#67](https://github.com/pydata/sparse/pull/67)). +* Validate axes for `.transpose()` (PR [#61](https://github.com/pydata/sparse/pull/61)). * Extend indexing support (PR [#57](https://github.com/pydata/sparse/pull/57)). -* Add :code:`random` function for generating random sparse arrays (PR [#41](https://github.com/pydata/sparse/pull/41)). -* :code:`COO(COO)` now copies the original object (PR [#55](https://github.com/pydata/sparse/pull/55)). -* NumPy universal functions and reductions now work on :code:`COO` arrays +* Add `random` function for generating random sparse arrays (PR [#41](https://github.com/pydata/sparse/pull/41)). +* `COO(COO)` now copies the original object (PR [#55](https://github.com/pydata/sparse/pull/55)). +* NumPy universal functions and reductions now work on `COO` arrays (PR [#49](https://github.com/pydata/sparse/pull/49)). * Fix concatenate and stack for large arrays (Issue [#32](https://github.com/pydata/sparse/issues/32), via PR [#51](https://github.com/pydata/sparse/pull/51)). -* Fix :code:`nnz` for scalars (Issue [#47](https://github.com/pydata/sparse/issues/47), via PR [#48](https://github.com/pydata/sparse/pull/48)). +* Fix `nnz` for scalars (Issue [#47](https://github.com/pydata/sparse/issues/47), via PR [#48](https://github.com/pydata/sparse/pull/48)). * Support more operators and remove all special cases (PR [#46](https://github.com/pydata/sparse/pull/46)). -* Add support for :code:`triu` and :code:`tril` (PR [#40](https://github.com/pydata/sparse/pull/40)). -* Add support for Ellipsis (:code:`...`) and :code:`None` when indexing +* Add support for `triu` and `tril` (PR [#40](https://github.com/pydata/sparse/pull/40)). +* Add support for Ellipsis (`...`) and `None` when indexing (PR [#37](https://github.com/pydata/sparse/pull/37)). -* Add support for bitwise bindary operations like :code:`&` and :code:`|` +* Add support for bitwise bindary operations like `&` and `|` (PR [#38](https://github.com/pydata/sparse/pull/38)). * Support broadcasting in element-wise operations (PR [#35](https://github.com/pydata/sparse/pull/35)). From 82c8d39b5560a9265761feece53f9b08360b7ac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 10:44:42 +0200 Subject: [PATCH 06/11] changelog --- docs/changelog.md | 16 ++++++++-------- sparse/numba_backend/_coo/core.py | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index 56d19ce2..cd6c4cd1 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -7,7 +7,7 @@ 0.15.0 / 2024-01-09 ------------------- -* Fix regression where [DeprecationWarning][]s were being fired unexpectedly. (PR [#581](https://github.com/pydata/sparse/pull/581) thanks [@hameerabbasi](https://github.com/hameerabbasi)) +* Fix regression where [`DeprecationWarning`][]s were being fired unexpectedly. (PR [#581](https://github.com/pydata/sparse/pull/581) thanks [@hameerabbasi](https://github.com/hameerabbasi)) * Extended [`sparse.einsum`][] support (PR [#579](https://github.com/pydata/sparse/pull/579) thanks [@HadrienNU](https://github.com/HadrienNU)) * General code clean-up (PR [#586](https://github.com/pydata/sparse/pull/586) thanks [@MHRasmy](https://github.com/MHRasmy), PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@jamestwebber](https://github.com/jamestwebber)) * Bug fixes with respect to NumPy compatibility (PR [#598](https://github.com/pydata/sparse/pull/598) thanks [@hameerabbasi](https://github.com/hameerabbasi), PR [#609](https://github.com/pydata/sparse/pull/609) thanks [@Illviljan](https://github.com/Illviljan), PR [#620](https://github.com/pydata/sparse/pull/620) thanks [@mtsokol](https://github.com/mtsokol)) @@ -60,7 +60,7 @@ ------------------- There are a number of large changes in this release. For example, we have implemented the -[`sparse.GCXS`][] type, and its specializations [`sparse.CSR`][] and [`sparse.CSC`][]. We plan on gradually improving +[`sparse.GCXS`][] type, and its specializations `CSR` and `CSC`. We plan on gradually improving the performance of these. * A number of [`sparse.GCXS`][] fixes and additions (PR [#409](https://github.com/pydata/sparse/pull/409), PR [#407](https://github.com/pydata/sparse/pull/407), PR [#414](https://github.com/pydata/sparse/pull/414), @@ -69,7 +69,7 @@ the performance of these. thanks [@daletovar](https://github.com/daletovar)) * Some work on [`sparse.DOK`][] arrays to bring them closer to the other formats (PR [#435](https://github.com/pydata/sparse/pull/435), PR [#437](https://github.com/pydata/sparse/pull/437), PR [#439](https://github.com/pydata/sparse/pull/439), PR [#440](https://github.com/pydata/sparse/pull/440), thanks [@DragaDoncila](https://github.com/DragaDoncila)) -* [`sparse.CSR`][] and [`sparse.CSC`] specializations of [`sparse.GCXS`][] (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) +* `CSR` and `CSC` specializations of [`sparse.GCXS`][] (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) For now, this is experimental undocumented API, and subject to change. * Fix a number of bugs (PR [#407](https://github.com/pydata/sparse/pull/407), Issue [#406](https://github.com/pydata/sparse/issues/406)) * Add [nnz][] parameter to [`sparse.random`][] (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) @@ -77,12 +77,12 @@ the performance of these. 0.11.2 / 2020-09-04 ------------------- -* Fix [TypingError] on [`sparse.dot`][] with complex dtypes. (Issue [#403](https://github.com/pydata/sparse/issues/403), PR [#404](https://github.com/pydata/sparse/pull/404)) +* Fix `TypingError` on [`sparse.dot`][] with complex dtypes. (Issue [#403](https://github.com/pydata/sparse/issues/403), PR [#404](https://github.com/pydata/sparse/pull/404)) 0.11.1 / 2020-08-31 ------------------- -* Fix [ValueError] on [`sparse.dot`][] with extremely small values. (Issue [#398](https://github.com/pydata/sparse/issues/398), PR [#399](https://github.com/pydata/sparse/pull/399)) +* Fix [`ValueError`][] on [`sparse.dot`][] with extremely small values. (Issue [#398](https://github.com/pydata/sparse/issues/398), PR [#399](https://github.com/pydata/sparse/pull/399)) 0.11.0 / 2020-08-18 ------------------- @@ -92,7 +92,7 @@ the performance of these. * Added multi-axis 1-D indexing support. (PR [#343](https://github.com/pydata/sparse/pull/343), thanks [@mikeymezher](https://github.com/mikeymezher)) * Fix `outer` for arrays that weren't one-dimensional. (Issue [#346](https://github.com/pydata/sparse/issues/346), PR [#347](https://github.com/pydata/sparse/pull/347)) * Add `casting` kwarg to [`sparse.COO.astype`][]. (Issue [#391](https://github.com/pydata/sparse/issues/391), PR [#392](https://github.com/pydata/sparse/pull/392)) -* Fix for [COO][] constructor accepting invalid inputs. (Issue [#385](https://github.com/pydata/sparse/issues/385), PR [#386](https://github.com/pydata/sparse/pull/386)) +* Fix for [`sparse.COO`][] constructor accepting invalid inputs. (Issue [#385](https://github.com/pydata/sparse/issues/385), PR [#386](https://github.com/pydata/sparse/pull/386)) 0.10.0 / 2020-05-13 ------------------- @@ -100,7 +100,7 @@ the performance of these. * Fixed a bug where converting an empty DOK array to COO leads to an incorrect dtype. (Issue [#314](https://github.com/pydata/sparse/issues/314), PR [#315](https://github.com/pydata/sparse/pull/315)) * Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) -* Add [COO.flatten]` and [`sparse.outer`][]. (Issue [#316](https://github.com/pydata/sparse/issues/316), PR [#317](https://github.com/pydata/sparse/pull/317)). +* Add [`sparse.COO.flatten`] and `outer`. (Issue [#316](https://github.com/pydata/sparse/issues/316), PR [#317](https://github.com/pydata/sparse/pull/317)). * Remove broadcasting restriction between sparse arrays and dense arrays. (Issue [#306](https://github.com/pydata/sparse/issues/306), PR [#318](https://github.com/pydata/sparse/pull/318)) * Implement deterministic dask tokenization. (Issue [#300](https://github.com/pydata/sparse/issues/300), PR [#320](https://github.com/pydata/sparse/pull/320), thanks @@ -123,7 +123,7 @@ the performance of these. * Fixed a bug where indexing with an empty list could lead to issues. (Issue [#281](https://github.com/pydata/sparse/issues/281), PR [#282](https://github.com/pydata/sparse/pull/282)) * Change code formatter to black. (PR [#284](https://github.com/pydata/sparse/pull/284)) -* Add the [`diagonal`][] and [`diagonalize][] functions. +* Add the [`sparse.diagonal`][] and [`sparse.diagonalize`][] functions. (Issue [#288](https://github.com/pydata/sparse/issues/288), PR [#289](https://github.com/pydata/sparse/pull/289), thanks [@pettni](https://github.com/pettni)) * Add HTML repr for notebooks. (PR [#283](https://github.com/pydata/sparse/pull/283), thanks [@daletovar](https://github.com/daletovar)) * Avoid making copy of ``coords`` when making a new [`sparse.COO`][] diff --git a/sparse/numba_backend/_coo/core.py b/sparse/numba_backend/_coo/core.py index 91105a1e..0a5baefc 100644 --- a/sparse/numba_backend/_coo/core.py +++ b/sparse/numba_backend/_coo/core.py @@ -486,7 +486,7 @@ def from_iter(cls, x, shape=None, fill_value=None, dtype=None): Examples -------- - You can convert items of the format ``[`sparse.COO`][]. + You can convert items of the format [`sparse.COO`][]. Here, the first part represents the coordinate and the second part represents the value. >>> x = [((0, 0), 1), ((1, 1), 1)] @@ -511,7 +511,7 @@ def from_iter(cls, x, shape=None, fill_value=None, dtype=None): array([[1, 0], [0, 1]]) - You can also pass in a [collections.abc.Iterator][] object. + You can also pass in a [`collections.abc.Iterator`][] object. >>> x = [((0, 0), 1), ((1, 1), 1)].__iter__() >>> s = COO.from_iter(x) From d518175854bd9b08faf07c527f7300541400e167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 10:50:27 +0200 Subject: [PATCH 07/11] correct plugin name --- docs/how-to-guides.md | 6 +----- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/docs/how-to-guides.md b/docs/how-to-guides.md index 8cc94feb..0600da78 100644 --- a/docs/how-to-guides.md +++ b/docs/how-to-guides.md @@ -1,5 +1 @@ -# How to guides - -* [Getting started](quickstart.md) -* [Construct](construct.md) -* [Operations](operations.md) \ No newline at end of file +# How to guides \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 1767a534..4e83392f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ docs = [ "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-section-index", - "mkdocs-jupiter", + "mkdocs-jupyter", "scipy", ] tests = [ From 97814b43dc4eda8cbb20cc8aeddb661052903268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 11:13:18 +0200 Subject: [PATCH 08/11] target=_blank on link to jupyter file --- docs/changelog.md | 2 +- docs/completed-tasks.md | 2 +- docs/css/mkdocstrings.css | 4 ++-- docs/examples/sparse_finch.ipynb | 5 +++-- docs/how-to-guides.md | 2 +- docs/index.md | 4 ++-- mkdocs.yml | 24 +++++------------------- 7 files changed, 15 insertions(+), 28 deletions(-) diff --git a/docs/changelog.md b/docs/changelog.md index cd6c4cd1..e8971f0d 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -72,7 +72,7 @@ the performance of these. * `CSR` and `CSC` specializations of [`sparse.GCXS`][] (PR [#442](https://github.com/pydata/sparse/pull/442), thanks [@ivirshup](https://github.com/ivirshup)) For now, this is experimental undocumented API, and subject to change. * Fix a number of bugs (PR [#407](https://github.com/pydata/sparse/pull/407), Issue [#406](https://github.com/pydata/sparse/issues/406)) -* Add [nnz][] parameter to [`sparse.random`][] (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) +* Add `nnz` parameter to [`sparse.random`][] (PR [#410](https://github.com/pydata/sparse/pull/410), thanks [@emilmelnikov](https://github.com/emilmelnikov)) 0.11.2 / 2020-09-04 ------------------- diff --git a/docs/completed-tasks.md b/docs/completed-tasks.md index 52330ac0..2bb45630 100644 --- a/docs/completed-tasks.md +++ b/docs/completed-tasks.md @@ -1 +1 @@ -[Completed tasks](roadmap.md#completed-tasks) \ No newline at end of file +[Completed tasks](roadmap.md#completed-tasks) diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index fb545568..260e51c4 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -3,9 +3,9 @@ --md-primary-fg-color--light: #94f2f7; --md-primary-fg-color--dark: #335365; } - + .grid { font-weight: bolder; font-size: 160%; font-family: Georgia, serif; - } \ No newline at end of file + } diff --git a/docs/examples/sparse_finch.ipynb b/docs/examples/sparse_finch.ipynb index 7a43a869..bef0cca4 100644 --- a/docs/examples/sparse_finch.ipynb +++ b/docs/examples/sparse_finch.ipynb @@ -6,8 +6,9 @@ "source": [ "## Finch backend for `sparse`\n", "\n", - "[![Open in\n", - "Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/pydata/sparse/blob/main/examples/sparse_finch.ipynb) to download and run." + "\n", + " \"Open\n", + " to download and run." ] }, { diff --git a/docs/how-to-guides.md b/docs/how-to-guides.md index 0600da78..3347c537 100644 --- a/docs/how-to-guides.md +++ b/docs/how-to-guides.md @@ -1 +1 @@ -# How to guides \ No newline at end of file +# How to guides diff --git a/docs/index.md b/docs/index.md index 7cec4551..f77853fb 100644 --- a/docs/index.md +++ b/docs/index.md @@ -16,7 +16,7 @@ dimensions.
![Sparse](./assets/images/logo.png){width=20%, align=left}
- + ![Sparse](./assets/images/conference-room-icon.png){width=10%, align=left} Introduction { .card } @@ -24,7 +24,7 @@ dimensions. ![Sparse](./assets/images/install-software-download-icon.png){width=10%, align=left} Install { .card } - + ![Sparse](./assets/images/open-book-icon.png){width=10%, align=left} Tutorials { .card } diff --git a/mkdocs.yml b/mkdocs.yml index 61ebe152..fe71434f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -70,15 +70,17 @@ plugins: filters: ["!^_"] group_by_category: true show_category_heading: true - + - mkdocs-jupyter: include_source: True - + nav: - Home: index.md - Introduction: introduction.md - Install: install.md - - Tutorials: examples/sparse_finch.ipynb + - Tutorials: #examples/sparse_finch.ipynb + - examples.md + - examples/sparse_finch.ipynb - How to guides: - how-to-guides.md - quickstart.md @@ -92,19 +94,3 @@ nav: - completed-tasks.md - changelog.md - conduct.md - -#- index.md -#- introduction.md -#- install.md -#- quickstart.md -#- construct.md -#- operations.md -#- API: -# - api/* -#- roadmap.md -## - completed-tasks.md -#- contributing.md -#- changelog.md -#- conduct.md -#- Notebook page: examples/sparse_finch.ipynb -#- examples-test.md From 3623d2b8b30b4246ff27e4f0c5da1fb215ffb964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 11:23:46 +0200 Subject: [PATCH 09/11] titles --- docs/css/mkdocstrings.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/css/mkdocstrings.css b/docs/css/mkdocstrings.css index 260e51c4..6718accd 100644 --- a/docs/css/mkdocstrings.css +++ b/docs/css/mkdocstrings.css @@ -4,6 +4,10 @@ --md-primary-fg-color--dark: #335365; } + .md-tabs__item { + font-weight: bolder; + } + .grid { font-weight: bolder; font-size: 160%; From b8b79d95c9bd0773273b453b1ff0e5417fefaf27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dea=20Mar=C3=ADa=20L=C3=A9on?= Date: Mon, 29 Jul 2024 11:56:56 +0200 Subject: [PATCH 10/11] wip --- mkdocs.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index fe71434f..57dc7cc4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,9 +75,12 @@ plugins: include_source: True nav: - - Home: index.md - - Introduction: introduction.md - - Install: install.md + - Home: + - index.md + - Introduction: + - introduction.md + - Install: + - install.md - Tutorials: #examples/sparse_finch.ipynb - examples.md - examples/sparse_finch.ipynb From 251cd492b900c43227c2dbfab948b5d200bde347 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 09:57:06 +0000 Subject: [PATCH 11/11] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- mkdocs.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 57dc7cc4..62c60ac1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -75,11 +75,11 @@ plugins: include_source: True nav: - - Home: + - Home: - index.md - - Introduction: + - Introduction: - introduction.md - - Install: + - Install: - install.md - Tutorials: #examples/sparse_finch.ipynb - examples.md
- ![Sparse](./assets/images/logo.png){width=20%, align=left} - Introduction + + ![Sparse](./assets/images/conference-room-icon.png){width=10%, align=left} + Introduction + { .card } + + ![Sparse](./assets/images/install-software-download-icon.png){width=10%, align=left} + Install { .card } - ![Sparse](./assets/images/undraw_education_f8ru.png){width=20%, align=left} + ![Sparse](./assets/images/open-book-icon.png){width=10%, align=left} Tutorials { .card } + ![Sparse](./assets/images/check-list-icon.png){width=10%, align=left} How-to guides { .card } + ![Sparse](./assets/images/repair-fix-repairing-icon.png){width=10%, align=left} API { .card } - Explanation - { .card } - - Something here + + ![Sparse](./assets/images/group-discussion-icon.png){width=10%, align=left} + Contributing { .card }