%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