summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-05-31 04:56:03 +0000
committerCoprDistGit <infra@openeuler.org>2023-05-31 04:56:03 +0000
commitcaad912c3d78d421bd82ed18ba1a17e3937ae4e3 (patch)
tree024fd400489ec21d8abb8d09308c3a38ddda70b6
parent1de614b55c8a159c5ba420c1d2566eea0f74fc58 (diff)
automatic import of python-ptwt
-rw-r--r--.gitignore1
-rw-r--r--python-ptwt.spec716
-rw-r--r--sources1
3 files changed, 718 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..ae663f2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/ptwt-0.1.5.tar.gz
diff --git a/python-ptwt.spec b/python-ptwt.spec
new file mode 100644
index 0000000..335e399
--- /dev/null
+++ b/python-ptwt.spec
@@ -0,0 +1,716 @@
+%global _empty_manifest_terminate_build 0
+Name: python-ptwt
+Version: 0.1.5
+Release: 1
+Summary: Differentiable and gpu enabled fast wavelet transforms in PyTorch
+License: EUPL-1.2
+URL: https://github.com/v0lta/PyTorch-Wavelet-Toolbox
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/24/d6/bfe000cf7ae3b8ae25b7a21d783bc86517674e943134d67b8a4f493d7489/ptwt-0.1.5.tar.gz
+BuildArch: noarch
+
+Requires: python3-PyWavelets
+Requires: python3-torch
+Requires: python3-scipy
+Requires: python3-pooch
+Requires: python3-matplotlib
+Requires: python3-numpy
+Requires: python3-pytest
+Requires: python3-nox
+
+%description
+********************************
+Pytorch Wavelet Toolbox (`ptwt`)
+********************************
+
+.. image:: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml/badge.svg
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml
+ :alt: GitHub Actions
+
+.. image:: https://readthedocs.org/projects/pytorch-wavelet-toolbox/badge/?version=latest
+ :target: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/?badge=latest
+ :alt: Documentation Status
+
+.. image:: https://img.shields.io/pypi/pyversions/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI Versions
+
+.. image:: https://img.shields.io/pypi/v/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI - Project
+
+.. image:: https://img.shields.io/pypi/l/ptwt
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/blob/main/LICENSE
+ :alt: PyPI - License
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+ :target: https://github.com/psf/black
+ :alt: Black code style
+
+.. image:: https://static.pepy.tech/personalized-badge/ptwt?period=total&units=international_system&left_color=grey&right_color=brightgreen&left_text=Downloads
+ :target: https://pepy.tech/project/ptwt
+
+
+
+
+Welcome to the PyTorch wavelet toolbox. This package implements:
+
+- the fast wavelet transform (fwt) via ``wavedec`` and its inverse by providing the ``waverec`` function,
+- the two-dimensional fwt is called ``wavedec2`` the synthesis counterpart ``waverec2``,
+- ``wavedec3`` and ``waverec3`` cover the three-dimensional analysis and synthesis case,
+- ``fswavedec2``, ``fswavedec3``, ``fswaverec2`` and ``fswaverec3`` support separable transformations.
+- ``MatrixWavedec`` and ``MatrixWaverec`` implement sparse-matrix-based fast wavelet transforms with boundary filters,
+- 2d sparse-matrix transforms with separable & non-separable boundary filters are available,
+- ``MatrixWavedec3`` and ``MatrixWaverec3`` allow separable 3D-fwt's with boundary filters.
+- ``cwt`` computes a one-dimensional continuous forward transform,
+- single and two-dimensional wavelet packet forward and backward transforms are available via the ``WaveletPacket`` and ``WaveletPacket2D`` objects,
+- finally, this package provides adaptive wavelet support (experimental).
+
+This toolbox extends `PyWavelets <https://pywavelets.readthedocs.io/en/latest/>`_ . We additionally provide GPU and gradient support via a PyTorch backend.
+Complete documentation is available at: https://pytorch-wavelet-toolbox.readthedocs.io/
+
+
+**Installation**
+
+Install the toolbox via pip or clone this repository. In order to use ``pip``, type:
+
+.. code-block:: sh
+
+ $ pip install ptwt
+
+
+You can remove it later by typing ``pip uninstall ptwt``.
+
+Example usage:
+""""""""""""""
+**Single dimensional transform**
+
+One way to compute fast wavelet transforms is to rely on padding and
+convolution. Consider the following example:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ wavelet = pywt.Wavelet('haar')
+
+ # compare the forward fwt coefficients
+ print(pywt.wavedec(data, wavelet, mode='zero', level=2))
+ print(ptwt.wavedec(data_torch, wavelet, mode='zero', level=2))
+
+ # invert the fwt.
+ print(ptwt.waverec(ptwt.wavedec(data_torch, wavelet, mode='zero'),
+ wavelet))
+
+
+The functions ``wavedec`` and ``waverec`` compute the 1d-fwt and its inverse.
+Internally both rely on ``conv1d``, and its transposed counterpart ``conv_transpose1d``
+from the ``torch.nn.functional`` module. This toolbox supports discrete wavelets
+see also ``pywt.wavelist(kind='discrete')``. I have tested
+Daubechies-Wavelets ``db-x`` and symlets ``sym-x``, which are usually a good starting point.
+
+**Two-dimensional transform**
+
+Analog to the 1d-case ``wavedec2`` and ``waverec2`` rely on
+``conv2d``, and its transposed counterpart ``conv_transpose2d``.
+To test an example run:
+
+
+.. code-block:: python
+
+ import ptwt, pywt, torch
+ import numpy as np
+ import scipy.misc
+
+ face = np.transpose(scipy.datasets.face(),
+ [2, 0, 1]).astype(np.float64)
+ pytorch_face = torch.tensor(face)
+ coefficients = ptwt.wavedec2(pytorch_face, pywt.Wavelet("haar"),
+ level=2, mode="constant")
+ reconstruction = ptwt.waverec2(coefficients, pywt.Wavelet("haar"))
+ np.max(np.abs(face - reconstruction.squeeze(1).numpy()))
+
+
+
+**Boundary Wavelets with Sparse-Matrices**
+
+In addition to convolution and padding approaches,
+sparse-matrix-based code with boundary wavelet support is available.
+In contrast to padding, boundary wavelets do not add extra pixels at
+the edges.
+Internally, boundary wavelet support relies on ``torch.sparse.mm``.
+Generate 1d sparse matrix forward and backward transforms with the
+``MatrixWavedec`` and ``MatrixWaverec`` classes.
+Reconsidering the 1d case, try:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ # forward
+ matrix_wavedec = ptwt.MatrixWavedec(pywt.Wavelet("haar"), level=2)
+ coeff = matrix_wavedec(data_torch)
+ print(coeff)
+ # backward
+ matrix_waverec = ptwt.MatrixWaverec(pywt.Wavelet("haar"))
+ rec = matrix_waverec(coeff)
+ print(rec)
+
+
+The process for the 2d transforms ``MatrixWavedec2``, ``MatrixWaverec2`` works similarly.
+By default, a separable transformation is used.
+To use a non-separable transformation, pass ``separable=False`` to ``MatrixWavedec2`` and ``MatrixWaverec2``.
+Separable transformations use a 1d transformation along both axes, which might be faster since fewer matrix entries
+have to be orthogonalized.
+
+
+**Adaptive** **Wavelets**
+
+Experimental code to train an adaptive wavelet layer in PyTorch is available in the ``examples`` folder. In addition to static wavelets
+from pywt,
+
+- Adaptive product-filters
+- and optimizable orthogonal-wavelets are supported.
+
+See https://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/network_compression/ for a complete implementation.
+
+
+**Testing**
+
+The ``tests`` folder contains multiple tests to allow independent verification of this toolbox.
+The GitHub workflow executes a subset of all tests for efficiency reasons.
+After cloning the repository, moving into the main directory, and installing ``nox`` with ``pip install nox`` run
+
+.. code-block:: sh
+
+ $ nox --session test
+
+
+
+to run all existing tests.
+
+Citation
+""""""""
+
+If you use this work in a scientific context please cite:
+
+.. code-block::
+
+ @phdthesis{handle:20.500.11811/9245,
+ urn: https://nbn-resolving.org/urn:nbn:de:hbz:5-63361,
+ author = {{Moritz Wolter}},
+ title = {Frequency Domain Methods in Recurrent Neural Networks for Sequential Data Processing},
+ school = {Rheinische Friedrich-Wilhelms-Universität Bonn},
+ year = 2021,
+ month = jul,
+ url = {https://hdl.handle.net/20.500.11811/9245}
+ }
+
+If you use the boundary wavelet support please additionally cite:
+
+.. code-block::
+
+ @thesis{Blanke2021,
+ author = {Felix Blanke},
+ title = {{Randbehandlung bei Wavelets für Faltungsnetzwerke}},
+ type = {Bachelor's Thesis},
+ annote = {Gbachelor},
+ year = {2021},
+ school = {Institut f\"ur Numerische Simulation, Universit\"at Bonn}
+ }
+
+
+
+%package -n python3-ptwt
+Summary: Differentiable and gpu enabled fast wavelet transforms in PyTorch
+Provides: python-ptwt
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-ptwt
+********************************
+Pytorch Wavelet Toolbox (`ptwt`)
+********************************
+
+.. image:: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml/badge.svg
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml
+ :alt: GitHub Actions
+
+.. image:: https://readthedocs.org/projects/pytorch-wavelet-toolbox/badge/?version=latest
+ :target: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/?badge=latest
+ :alt: Documentation Status
+
+.. image:: https://img.shields.io/pypi/pyversions/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI Versions
+
+.. image:: https://img.shields.io/pypi/v/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI - Project
+
+.. image:: https://img.shields.io/pypi/l/ptwt
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/blob/main/LICENSE
+ :alt: PyPI - License
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+ :target: https://github.com/psf/black
+ :alt: Black code style
+
+.. image:: https://static.pepy.tech/personalized-badge/ptwt?period=total&units=international_system&left_color=grey&right_color=brightgreen&left_text=Downloads
+ :target: https://pepy.tech/project/ptwt
+
+
+
+
+Welcome to the PyTorch wavelet toolbox. This package implements:
+
+- the fast wavelet transform (fwt) via ``wavedec`` and its inverse by providing the ``waverec`` function,
+- the two-dimensional fwt is called ``wavedec2`` the synthesis counterpart ``waverec2``,
+- ``wavedec3`` and ``waverec3`` cover the three-dimensional analysis and synthesis case,
+- ``fswavedec2``, ``fswavedec3``, ``fswaverec2`` and ``fswaverec3`` support separable transformations.
+- ``MatrixWavedec`` and ``MatrixWaverec`` implement sparse-matrix-based fast wavelet transforms with boundary filters,
+- 2d sparse-matrix transforms with separable & non-separable boundary filters are available,
+- ``MatrixWavedec3`` and ``MatrixWaverec3`` allow separable 3D-fwt's with boundary filters.
+- ``cwt`` computes a one-dimensional continuous forward transform,
+- single and two-dimensional wavelet packet forward and backward transforms are available via the ``WaveletPacket`` and ``WaveletPacket2D`` objects,
+- finally, this package provides adaptive wavelet support (experimental).
+
+This toolbox extends `PyWavelets <https://pywavelets.readthedocs.io/en/latest/>`_ . We additionally provide GPU and gradient support via a PyTorch backend.
+Complete documentation is available at: https://pytorch-wavelet-toolbox.readthedocs.io/
+
+
+**Installation**
+
+Install the toolbox via pip or clone this repository. In order to use ``pip``, type:
+
+.. code-block:: sh
+
+ $ pip install ptwt
+
+
+You can remove it later by typing ``pip uninstall ptwt``.
+
+Example usage:
+""""""""""""""
+**Single dimensional transform**
+
+One way to compute fast wavelet transforms is to rely on padding and
+convolution. Consider the following example:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ wavelet = pywt.Wavelet('haar')
+
+ # compare the forward fwt coefficients
+ print(pywt.wavedec(data, wavelet, mode='zero', level=2))
+ print(ptwt.wavedec(data_torch, wavelet, mode='zero', level=2))
+
+ # invert the fwt.
+ print(ptwt.waverec(ptwt.wavedec(data_torch, wavelet, mode='zero'),
+ wavelet))
+
+
+The functions ``wavedec`` and ``waverec`` compute the 1d-fwt and its inverse.
+Internally both rely on ``conv1d``, and its transposed counterpart ``conv_transpose1d``
+from the ``torch.nn.functional`` module. This toolbox supports discrete wavelets
+see also ``pywt.wavelist(kind='discrete')``. I have tested
+Daubechies-Wavelets ``db-x`` and symlets ``sym-x``, which are usually a good starting point.
+
+**Two-dimensional transform**
+
+Analog to the 1d-case ``wavedec2`` and ``waverec2`` rely on
+``conv2d``, and its transposed counterpart ``conv_transpose2d``.
+To test an example run:
+
+
+.. code-block:: python
+
+ import ptwt, pywt, torch
+ import numpy as np
+ import scipy.misc
+
+ face = np.transpose(scipy.datasets.face(),
+ [2, 0, 1]).astype(np.float64)
+ pytorch_face = torch.tensor(face)
+ coefficients = ptwt.wavedec2(pytorch_face, pywt.Wavelet("haar"),
+ level=2, mode="constant")
+ reconstruction = ptwt.waverec2(coefficients, pywt.Wavelet("haar"))
+ np.max(np.abs(face - reconstruction.squeeze(1).numpy()))
+
+
+
+**Boundary Wavelets with Sparse-Matrices**
+
+In addition to convolution and padding approaches,
+sparse-matrix-based code with boundary wavelet support is available.
+In contrast to padding, boundary wavelets do not add extra pixels at
+the edges.
+Internally, boundary wavelet support relies on ``torch.sparse.mm``.
+Generate 1d sparse matrix forward and backward transforms with the
+``MatrixWavedec`` and ``MatrixWaverec`` classes.
+Reconsidering the 1d case, try:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ # forward
+ matrix_wavedec = ptwt.MatrixWavedec(pywt.Wavelet("haar"), level=2)
+ coeff = matrix_wavedec(data_torch)
+ print(coeff)
+ # backward
+ matrix_waverec = ptwt.MatrixWaverec(pywt.Wavelet("haar"))
+ rec = matrix_waverec(coeff)
+ print(rec)
+
+
+The process for the 2d transforms ``MatrixWavedec2``, ``MatrixWaverec2`` works similarly.
+By default, a separable transformation is used.
+To use a non-separable transformation, pass ``separable=False`` to ``MatrixWavedec2`` and ``MatrixWaverec2``.
+Separable transformations use a 1d transformation along both axes, which might be faster since fewer matrix entries
+have to be orthogonalized.
+
+
+**Adaptive** **Wavelets**
+
+Experimental code to train an adaptive wavelet layer in PyTorch is available in the ``examples`` folder. In addition to static wavelets
+from pywt,
+
+- Adaptive product-filters
+- and optimizable orthogonal-wavelets are supported.
+
+See https://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/network_compression/ for a complete implementation.
+
+
+**Testing**
+
+The ``tests`` folder contains multiple tests to allow independent verification of this toolbox.
+The GitHub workflow executes a subset of all tests for efficiency reasons.
+After cloning the repository, moving into the main directory, and installing ``nox`` with ``pip install nox`` run
+
+.. code-block:: sh
+
+ $ nox --session test
+
+
+
+to run all existing tests.
+
+Citation
+""""""""
+
+If you use this work in a scientific context please cite:
+
+.. code-block::
+
+ @phdthesis{handle:20.500.11811/9245,
+ urn: https://nbn-resolving.org/urn:nbn:de:hbz:5-63361,
+ author = {{Moritz Wolter}},
+ title = {Frequency Domain Methods in Recurrent Neural Networks for Sequential Data Processing},
+ school = {Rheinische Friedrich-Wilhelms-Universität Bonn},
+ year = 2021,
+ month = jul,
+ url = {https://hdl.handle.net/20.500.11811/9245}
+ }
+
+If you use the boundary wavelet support please additionally cite:
+
+.. code-block::
+
+ @thesis{Blanke2021,
+ author = {Felix Blanke},
+ title = {{Randbehandlung bei Wavelets für Faltungsnetzwerke}},
+ type = {Bachelor's Thesis},
+ annote = {Gbachelor},
+ year = {2021},
+ school = {Institut f\"ur Numerische Simulation, Universit\"at Bonn}
+ }
+
+
+
+%package help
+Summary: Development documents and examples for ptwt
+Provides: python3-ptwt-doc
+%description help
+********************************
+Pytorch Wavelet Toolbox (`ptwt`)
+********************************
+
+.. image:: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml/badge.svg
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/actions/workflows/tests.yml
+ :alt: GitHub Actions
+
+.. image:: https://readthedocs.org/projects/pytorch-wavelet-toolbox/badge/?version=latest
+ :target: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/?badge=latest
+ :alt: Documentation Status
+
+.. image:: https://img.shields.io/pypi/pyversions/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI Versions
+
+.. image:: https://img.shields.io/pypi/v/ptwt
+ :target: https://pypi.org/project/ptwt/
+ :alt: PyPI - Project
+
+.. image:: https://img.shields.io/pypi/l/ptwt
+ :target: https://github.com/v0lta/PyTorch-Wavelet-Toolbox/blob/main/LICENSE
+ :alt: PyPI - License
+
+.. image:: https://img.shields.io/badge/code%20style-black-000000.svg
+ :target: https://github.com/psf/black
+ :alt: Black code style
+
+.. image:: https://static.pepy.tech/personalized-badge/ptwt?period=total&units=international_system&left_color=grey&right_color=brightgreen&left_text=Downloads
+ :target: https://pepy.tech/project/ptwt
+
+
+
+
+Welcome to the PyTorch wavelet toolbox. This package implements:
+
+- the fast wavelet transform (fwt) via ``wavedec`` and its inverse by providing the ``waverec`` function,
+- the two-dimensional fwt is called ``wavedec2`` the synthesis counterpart ``waverec2``,
+- ``wavedec3`` and ``waverec3`` cover the three-dimensional analysis and synthesis case,
+- ``fswavedec2``, ``fswavedec3``, ``fswaverec2`` and ``fswaverec3`` support separable transformations.
+- ``MatrixWavedec`` and ``MatrixWaverec`` implement sparse-matrix-based fast wavelet transforms with boundary filters,
+- 2d sparse-matrix transforms with separable & non-separable boundary filters are available,
+- ``MatrixWavedec3`` and ``MatrixWaverec3`` allow separable 3D-fwt's with boundary filters.
+- ``cwt`` computes a one-dimensional continuous forward transform,
+- single and two-dimensional wavelet packet forward and backward transforms are available via the ``WaveletPacket`` and ``WaveletPacket2D`` objects,
+- finally, this package provides adaptive wavelet support (experimental).
+
+This toolbox extends `PyWavelets <https://pywavelets.readthedocs.io/en/latest/>`_ . We additionally provide GPU and gradient support via a PyTorch backend.
+Complete documentation is available at: https://pytorch-wavelet-toolbox.readthedocs.io/
+
+
+**Installation**
+
+Install the toolbox via pip or clone this repository. In order to use ``pip``, type:
+
+.. code-block:: sh
+
+ $ pip install ptwt
+
+
+You can remove it later by typing ``pip uninstall ptwt``.
+
+Example usage:
+""""""""""""""
+**Single dimensional transform**
+
+One way to compute fast wavelet transforms is to rely on padding and
+convolution. Consider the following example:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ wavelet = pywt.Wavelet('haar')
+
+ # compare the forward fwt coefficients
+ print(pywt.wavedec(data, wavelet, mode='zero', level=2))
+ print(ptwt.wavedec(data_torch, wavelet, mode='zero', level=2))
+
+ # invert the fwt.
+ print(ptwt.waverec(ptwt.wavedec(data_torch, wavelet, mode='zero'),
+ wavelet))
+
+
+The functions ``wavedec`` and ``waverec`` compute the 1d-fwt and its inverse.
+Internally both rely on ``conv1d``, and its transposed counterpart ``conv_transpose1d``
+from the ``torch.nn.functional`` module. This toolbox supports discrete wavelets
+see also ``pywt.wavelist(kind='discrete')``. I have tested
+Daubechies-Wavelets ``db-x`` and symlets ``sym-x``, which are usually a good starting point.
+
+**Two-dimensional transform**
+
+Analog to the 1d-case ``wavedec2`` and ``waverec2`` rely on
+``conv2d``, and its transposed counterpart ``conv_transpose2d``.
+To test an example run:
+
+
+.. code-block:: python
+
+ import ptwt, pywt, torch
+ import numpy as np
+ import scipy.misc
+
+ face = np.transpose(scipy.datasets.face(),
+ [2, 0, 1]).astype(np.float64)
+ pytorch_face = torch.tensor(face)
+ coefficients = ptwt.wavedec2(pytorch_face, pywt.Wavelet("haar"),
+ level=2, mode="constant")
+ reconstruction = ptwt.waverec2(coefficients, pywt.Wavelet("haar"))
+ np.max(np.abs(face - reconstruction.squeeze(1).numpy()))
+
+
+
+**Boundary Wavelets with Sparse-Matrices**
+
+In addition to convolution and padding approaches,
+sparse-matrix-based code with boundary wavelet support is available.
+In contrast to padding, boundary wavelets do not add extra pixels at
+the edges.
+Internally, boundary wavelet support relies on ``torch.sparse.mm``.
+Generate 1d sparse matrix forward and backward transforms with the
+``MatrixWavedec`` and ``MatrixWaverec`` classes.
+Reconsidering the 1d case, try:
+
+.. code-block:: python
+
+ import torch
+ import numpy as np
+ import pywt
+ import ptwt # use "from src import ptwt" for a cloned the repo
+
+ # generate an input of even length.
+ data = np.array([0, 1, 2, 3, 4, 5, 6, 7, 7, 6, 5, 4, 3, 2, 1, 0])
+ data_torch = torch.from_numpy(data.astype(np.float32))
+ # forward
+ matrix_wavedec = ptwt.MatrixWavedec(pywt.Wavelet("haar"), level=2)
+ coeff = matrix_wavedec(data_torch)
+ print(coeff)
+ # backward
+ matrix_waverec = ptwt.MatrixWaverec(pywt.Wavelet("haar"))
+ rec = matrix_waverec(coeff)
+ print(rec)
+
+
+The process for the 2d transforms ``MatrixWavedec2``, ``MatrixWaverec2`` works similarly.
+By default, a separable transformation is used.
+To use a non-separable transformation, pass ``separable=False`` to ``MatrixWavedec2`` and ``MatrixWaverec2``.
+Separable transformations use a 1d transformation along both axes, which might be faster since fewer matrix entries
+have to be orthogonalized.
+
+
+**Adaptive** **Wavelets**
+
+Experimental code to train an adaptive wavelet layer in PyTorch is available in the ``examples`` folder. In addition to static wavelets
+from pywt,
+
+- Adaptive product-filters
+- and optimizable orthogonal-wavelets are supported.
+
+See https://github.com/v0lta/PyTorch-Wavelet-Toolbox/tree/main/examples/network_compression/ for a complete implementation.
+
+
+**Testing**
+
+The ``tests`` folder contains multiple tests to allow independent verification of this toolbox.
+The GitHub workflow executes a subset of all tests for efficiency reasons.
+After cloning the repository, moving into the main directory, and installing ``nox`` with ``pip install nox`` run
+
+.. code-block:: sh
+
+ $ nox --session test
+
+
+
+to run all existing tests.
+
+Citation
+""""""""
+
+If you use this work in a scientific context please cite:
+
+.. code-block::
+
+ @phdthesis{handle:20.500.11811/9245,
+ urn: https://nbn-resolving.org/urn:nbn:de:hbz:5-63361,
+ author = {{Moritz Wolter}},
+ title = {Frequency Domain Methods in Recurrent Neural Networks for Sequential Data Processing},
+ school = {Rheinische Friedrich-Wilhelms-Universität Bonn},
+ year = 2021,
+ month = jul,
+ url = {https://hdl.handle.net/20.500.11811/9245}
+ }
+
+If you use the boundary wavelet support please additionally cite:
+
+.. code-block::
+
+ @thesis{Blanke2021,
+ author = {Felix Blanke},
+ title = {{Randbehandlung bei Wavelets für Faltungsnetzwerke}},
+ type = {Bachelor's Thesis},
+ annote = {Gbachelor},
+ year = {2021},
+ school = {Institut f\"ur Numerische Simulation, Universit\"at Bonn}
+ }
+
+
+
+%prep
+%autosetup -n ptwt-0.1.5
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-ptwt -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Wed May 31 2023 Python_Bot <Python_Bot@openeuler.org> - 0.1.5-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..fcf6316
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+daa97e11c2ae766b93cc1164cefa3c2b ptwt-0.1.5.tar.gz