%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.aliyun.com/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 `_ . 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 `_ . 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 `_ . 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 * Fri Jun 09 2023 Python_Bot - 0.1.5-1 - Package Spec generated