From 8ae6efecf7a667fae4e98c891797acae8c05cbc1 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Wed, 15 Nov 2023 17:15:57 +0100 Subject: [PATCH 01/39] Update README.rst --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index 716d8c96..bb1fabed 100644 --- a/README.rst +++ b/README.rst @@ -51,6 +51,7 @@ Welcome to the PyTorch wavelet toolbox. This package implements: This toolbox extends `PyWavelets `_. In addition to boundary wavelets, we provide GPU and gradient support via a PyTorch backend. Complete documentation is available at: https://pytorch-wavelet-toolbox.readthedocs.io/en/latest/ptwt.html +This toolbox is independent work. Meta or the PyTorch team have not endorsed it. **Installation** From 09d3d26bab2f8ce02ca8c117d367b24dc8ac9031 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 13:46:10 +0100 Subject: [PATCH 02/39] docs update. --- README.rst | 8 +++---- docs/{favicon => _static}/favicon.ico | Bin docs/_static/shannon.png | Bin 0 -> 21541 bytes docs/conf.py | 29 +++++++++---------------- docs/examples.rst | 2 ++ docs/index.rst | 26 ++++++++++------------ docs/installation.rst | 2 ++ docs/intro.rst | 1 + docs/{favicon => logo}/plot_shannon.py | 0 docs/ptwt.rst | 4 ++-- docs/requirements.txt | 1 + src/ptwt/conv_transform.py | 8 +++++++ 12 files changed, 41 insertions(+), 40 deletions(-) rename docs/{favicon => _static}/favicon.ico (100%) create mode 100644 docs/_static/shannon.png create mode 100644 docs/examples.rst create mode 100644 docs/installation.rst create mode 100644 docs/intro.rst rename docs/{favicon => logo}/plot_shannon.py (100%) diff --git a/README.rst b/README.rst index 716d8c96..fdc47d82 100644 --- a/README.rst +++ b/README.rst @@ -58,7 +58,7 @@ Install the toolbox via pip or clone this repository. In order to use ``pip``, t .. code-block:: sh - $ pip install ptwt + pip install ptwt You can remove it later by typing ``pip uninstall ptwt``. @@ -158,7 +158,7 @@ Reconsidering the 1d case, try: 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 +Separable transformations use a 1D transformation along both axes, which might be faster since fewer matrix entries have to be orthogonalized. @@ -181,11 +181,11 @@ After cloning the repository, moving into the main directory, and installing ``n .. code-block:: sh - $ nox --session test + nox --session test -to run all existing tests. +for all existing tests. Citation """""""" diff --git a/docs/favicon/favicon.ico b/docs/_static/favicon.ico similarity index 100% rename from docs/favicon/favicon.ico rename to docs/_static/favicon.ico diff --git a/docs/_static/shannon.png b/docs/_static/shannon.png new file mode 100644 index 0000000000000000000000000000000000000000..c062c7e60ef5ee486b54002de63fbb5cd3fc6972 GIT binary patch literal 21541 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 List[torch.Tensor]: """Compute the analysis (forward) 1d fast wavelet transform. + The transformation relies on convolution operations with filter + pairs. + + .. math:: + x_s * h_k = c_{k,s+1} + + Where ... + Args: data (torch.Tensor): The input time series, By default the last axis is transformed. From d9e1d1a3abf52437c53710d81dbea7d84e1942b3 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 14:42:29 +0100 Subject: [PATCH 03/39] docs updat.e --- docs/conf.py | 4 + docs/examples.rst | 4 +- docs/index.rst | 25 +- docs/installation.rst | 2 - docs/intro.rst | 97 +++++++- docs/literature.bib | 550 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 673 insertions(+), 9 deletions(-) delete mode 100644 docs/installation.rst create mode 100644 docs/literature.bib diff --git a/docs/conf.py b/docs/conf.py index 5cb629c5..3976c3ae 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -33,6 +33,7 @@ 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode', + 'sphinxcontrib.bibtex', ] napoleon_google_docstring = True @@ -73,3 +74,6 @@ # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] + + +bibtex_bibfiles = ['literature.bib'] \ No newline at end of file diff --git a/docs/examples.rst b/docs/examples.rst index 2feadf28..0d8cff9f 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,2 +1,2 @@ -ptwt examples -============= \ No newline at end of file +Wavelet transforms by example +============================= \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index f3f28174..4d0bd8c0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -3,17 +3,34 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Pytorch Wavelet Toolbox (`ptwt`) -================================ +.. _PyTorch install instructions: https://pytorch.org/get-started/locally/ + +Pytorch Wavelet Toolbox (``ptwt``) +================================== + +``ptwt`` brings wavelet transforms to Pytorch. The code is open-source, follow the link above +to go to the source. This package is listed in the Python Package Index. Its best intalled via pip. +GPU support depends on PyTorch. To take advantage of GPU-processing follow the `PyTorch install instructions`_. +Install the version, that best suits your systems hardware setup. Once PyTorch ist set up type + +.. code-block:: sh + + pip install ptwt + +to get started. + + +This documentation aims to explain the foundations of wavelet theory, introduce the ``ptwt`` package by example and +deliver a complete documentation of all functions. Readers who are already familiar with the theory should directly +jump to the examples or the API-documentation using the navigation on the left. -.. include:: intro.rst .. toctree:: :hidden: :maxdepth: 1 :caption: Getting Started - installation + intro examples diff --git a/docs/installation.rst b/docs/installation.rst deleted file mode 100644 index c75c9faf..00000000 --- a/docs/installation.rst +++ /dev/null @@ -1,2 +0,0 @@ -Installing -========== \ No newline at end of file diff --git a/docs/intro.rst b/docs/intro.rst index 30404ce4..8831afd9 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1 +1,96 @@ -TODO \ No newline at end of file +Understanding wavelets +====================== + +This supplementary section summarizes key wavelet facts as a convenience for the hasty reader. +See, for example, \cite{strang1996wavelets,mallat1999wavelet} or \cite{jensen2001ripples} for excellent detailed introductions to the topic. + +The \acf{fwt} relies on convolution operations with filter pairs. +\begin{figure} +\centering +\includestandalone[scale=0.9]{./figures/supplementary/fwt} +\caption{Overview of the \acf{fwt} computation. $\mathbf{h}_\mathcal{L}$ denotes the analysis low-pass filter. +$\mathbf{h}_\mathcal{H}$ the analysis high pass filter. $\mathbf{f}_\mathcal{L}$ and $\mathbf{f}_\mathcal{H}$ +the synthesis filer pair. $\downarrow_2$ denotes downsampling with a factor of two, $\uparrow_2$ +means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. +The synthesis or inverse transform on the right works with stride two transposed convolutions. +$\mathbf{H}_{k}$ and $\mathbf{F}_{k}$ with $k \in [\mathcal{L}, \mathcal{H}]$ denote the corresponding convolution +operators.} +\label{fig:fwt} +\end{figure} +Figure~\ref{fig:fwt} illustrates the process. The forward or analysis transform +works with a low-pass $\mathbf{h}_\mathcal{L}$ and a high-pass filter $\mathbf{h}_\mathcal{H}$. +The analysis transform repeatedly convolves with both filters, +\begin{align} \label{eq:fwt} + \mathbf{x}_s * \mathbf{h}_k = \mathbf{c}_{k, s+1} +\end{align} +with $k \in [\mathcal{L}, \mathcal{H}]$ and $s \in \mathbb{N}_0$ the set of natural numbers, where $\mathbf{x}_0$ is equal to +the original input signal $\mathbf{x}$. At higher scales, the \ac{fwt} uses the low-pass filtered result as input, +$\mathbf{x}_s = \mathbf{c}_{\mathcal{L}, s}$ if $s > 0$. +The dashed arrow indicates that we could continue to expand the \ac{fwt} tree here. + +The \acf{wpt} additionally expands the high-frequency part of the tree. +\begin{figure} +\centering +\includestandalone[scale=0.9]{./figures/supplementary/packets_1d} +\caption{Scematic drawing of the full \acf{wpt} in a single dimension. +Compared to figure~\ref{fig:fwt}, the high-pass filtered side of the tree is expanded, too.} +\label{fig:wpt} +\end{figure} +A comparison of figure~\ref{fig:fwt} and \ref{fig:wpt} illustrates this difference. +Whole expansion is not the only possible way to construct a wavelet packet tree. See \cite{jensen2001ripples} for a discussion of other options. +In both figures, capital letters denote convolution operators. These may be expressed as Toeplitz matrices \cite{strang1996wavelets}. +The matrix nature of these operators explains the capital boldface notation. +Coefficient subscripts record the path that leads to a particular coefficient. + +We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products \cite{vyas2018multiscale}: +\begin{align} +\mathbf{h}_{a} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{L}^T, +\mathbf{h}_{h} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{H}^T, +\mathbf{h}_{v} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{L}^T, +\mathbf{h}_{d} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{H}^T +\end{align} +With $a$ for approximation, $h$ for horizontal, $v$ for vertical, and $d$ for diagonal \cite{lee2019pywavelets}. +We can construct a \ac{wpt}-tree for images with these two-dimensional filters. +\begin{figure} +\includestandalone[scale=0.9]{./figures/supplementary/packets_2d} +\caption{Two dimensional \acf{wpt} computation overview. $\mathbf{X}$ and $\hat{\mathbf{X}}$ denote input image and +reconstruction respectively.} +\label{fig:wpt2d} +\end{figure} +Figure~\ref{fig:wpt2d} illustrates the computation of a full two-dimensional wavelet packet tree. +More formally, the process initially evaluates +\begin{align} +\mathbf{x}_0 *_2 \mathbf{h}_j = \mathbf{c}_{j, 1} +\end{align} +with $\mathbf{x}_0$ equal to an input image $\mathbf{X}$, $j \in [a,h,v,d]$, and $*_2$ for two-dimensional convolution. At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. We refer to the standard literature \cite{jensen2001ripples,strang1996wavelets} for an extended discussion. + +Compared to the \ac{fwt}, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. +We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. Synthesis transforms reconstruct the original input based on the results from the analysis transform. + +\subsection{Common wavelets and their properties}\label{sec:db_and_sym} +A key property of the wavelet transform is its invertibility. Additionally, we expect an alias-free representation. +Standard literature like \cite{strang1996wavelets} formulates the perfect reconstruction +and alias cancellation conditions to satisfy both requirements. For an analysis filter coefficient vector $\mathbf{h}$ the equations below use the polynomial $H(z) = \sum_n h(n)z^{-n}$. We construct $F(z)$ the same way using the synthesis filter coefficients in $\mathbf{f}$. To guarantee perfect reconstruction the filters must respect +\begin{align} +H_\mathcal{L}(z)F_\mathcal{L}(z) + H_\mathcal{H}(-z)F_\mathcal{H}(z) = 2z^{-l}. +\end{align} +Similarly +\begin{align} \label{eq:alias_cancellation} + F_\mathcal{L}(z)H_\mathcal{L}(-z) + F_\mathcal{H}(z)H_\mathcal{H}(-z) = 0 +\end{align} +guarantees alias cancellation. + +Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Symlets appear in this paper. +\begin{figure} + \includestandalone{./figures/supplementary/sym6} + \caption{Visualization of the Symlet 6 filter coefficients.} + \label{fig:sym6_vis} +\end{figure} +\begin{figure} + \includestandalone{./figures/supplementary/db6} + \caption{Visualization of the Daubechies 6 filter coefficients.} +\label{fig:db6_vis} +\end{figure} +Figures~\ref{fig:sym6_vis} and \ref{fig:db6_vis} visualize the Daubechies and Symlet filters of 6th degree. +Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. Figure~\ref{fig:sym6_vis} illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in Figure~\ref{fig:db6_vis}. +Consider the sign patterns in Figure~\ref{fig:db6_vis}. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute $F_\mathcal{L}(z) = H_\mathcal{H}(-z)$ and $F_\mathcal{H} = -H_\mathcal{L}(-z)$ into equation~\ref{eq:alias_cancellation}\cite{strang1996wavelets}. $F_\mathcal{L}(z) = H_\mathcal{H}(-z)$ requires an opposing sign at even and equal signs at odd powers of the polynomial. \ No newline at end of file diff --git a/docs/literature.bib b/docs/literature.bib new file mode 100644 index 00000000..9dbec80c --- /dev/null +++ b/docs/literature.bib @@ -0,0 +1,550 @@ +@inproceedings{yoo2019photorealistic, + title={Photorealistic style transfer via wavelet transforms}, + author={Yoo, Jaejun and Uh, Youngjung and Chun, Sanghyuk and Kang, Byeongkyu and Ha, Jung-Woo}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={9036--9045}, + year={2019} +} + +@inproceedings{liu2020wavelet, + title={Wavelet-based dual-branch network for image demoir{\'e}ing}, + author={Liu, Lin and Liu, Jianzhuang and Yuan, Shanxin and Slabaugh, Gregory and Leonardis, Ale{\v{s}} and Zhou, Wengang and Tian, Qi}, + booktitle={Computer Vision--ECCV 2020: 16th European Conference, Glasgow, UK, August 23--28, 2020, Proceedings, Part XIII 16}, + pages={86--102}, + year={2020}, + organization={Springer} +} + +@inproceedings{liu2019attribute, + title={Attribute-aware face aging with wavelet-based generative adversarial networks}, + author={Liu, Yunfan and Li, Qi and Sun, Zhenan}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={11877--11886}, + year={2019} +} + +@inproceedings{wang2020multi, + title={Multi-level wavelet-based generative adversarial network for perceptual quality enhancement of compressed video}, + author={Wang, Jianyi and Deng, Xin and Xu, Mai and Chen, Congyong and Song, Yuhang}, + booktitle={European Conference on Computer Vision}, + pages={405--421}, + year={2020}, + organization={Springer} +} + +@inproceedings{durall2020watch, + title={Watch your up-convolution: Cnn based generative deep neural networks are failing to reproduce spectral distributions}, + author={Durall, Ricard and Keuper, Margret and Keuper, Janis}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={7890--7899}, + year={2020} +} + + + +@inproceedings{huang2017wavelet, + title={Wavelet-srnet: A wavelet-based cnn for multi-scale face super resolution}, + author={Huang, Huaibo and He, Ran and Sun, Zhenan and Tan, Tieniu}, + booktitle={Proceedings of the IEEE international conference on computer vision}, + pages={1689--1697}, + year={2017} +} + + + +@inproceedings{hernandez2019human, + title={Human motion prediction via spatio-temporal inpainting}, + author={Hernandez, Alejandro and Gall, Jurgen and Moreno-Noguer, Francesc}, + booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, + pages={7134--7143}, + year={2019} +} + +@article{guth2022wavelet, + title={Wavelet score-based generative modeling}, + author={Guth, Florentin and Coste, Simon and De Bortoli, Valentin and Mallat, Stephane}, + journal={Advances in Neural Information Processing Systems}, + volume={35}, + pages={478--491}, + year={2022} +} + +@article{wolter2022wavelet, + title={Wavelet-packets for deepfake image analysis and detection}, + author={Wolter, Moritz and Blanke, Felix and Heese, Raoul and Garcke, Jochen}, + journal={Machine Learning}, + volume={111}, + number={11}, + pages={4295--4327}, + year={2022}, + publisher={Springer} +} + +@article{heusel2017gans, + title={Gans trained by a two time-scale update rule converge to a local nash equilibrium}, + author={Heusel, Martin and Ramsauer, Hubert and Unterthiner, Thomas and Nessler, Bernhard and Hochreiter, Sepp}, + journal={Advances in neural information processing systems}, + volume={30}, + year={2017} +} + +@inproceedings{ho20ddpm, + author = {Jonathan Ho and Ajay Jain and Pieter Abbeel}, + editor = {Hugo Larochelle and Marc'Aurelio Ranzato and Raia Hadsell and Maria{-}Florina Balcan and Hsuan{-}Tien Lin}, + title = {Denoising Diffusion Probabilistic Models}, + booktitle = {Advances in Neural Information Processing Systems 33: Annual Conference + on Neural Information Processing Systems 2020, NeurIPS 2020, December + 6-12, 2020, virtual}, + year = {2020}, +} + +@inproceedings{song2021ddim, + author = {Jiaming Song and + Chenlin Meng and + Stefano Ermon}, + title = {Denoising Diffusion Implicit Models}, + booktitle = {9th International Conference on Learning Representations, {ICLR} 2021, + Virtual Event, Austria, May 3-7, 2021}, + year = {2021} +} + +@InProceedings{nichol2021improvdiff, + title = {Improved Denoising Diffusion Probabilistic Models}, + author = {Nichol, Alexander Quinn and Dhariwal, Prafulla}, + booktitle = {Proceedings of the 38th International Conference on Machine Learning}, + pages = {8162--8171}, + year = {2021}, + volume = {139}, + series = {Proceedings of Machine Learning Research}, + month = {18--24 Jul}, + publisher = {PMLR}, +} + +@article{Peebles2022DiT, + title={Scalable Diffusion Models with Transformers}, + author={William Peebles and Saining Xie}, + year={2022}, + journal={arXiv preprint arXiv:2212.09748}, +} + +@inproceedings{xiao2022tackling, + title={Tackling the Generative Learning Trilemma with Denoising Diffusion GANs}, + author={Zhisheng Xiao and Karsten Kreis and Arash Vahdat}, + booktitle={International Conference on Learning Representations}, + year={2022} +} + +@inproceedings{Phung23WaveDiff, + author = {Hao Phung and + Quan Dao and + Anh Tran}, + title = {Wavelet Diffusion Models are fast and scalable Image Generators}, + booktitle = {{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2023, Vancouver, BC, Canada, June 17-24, 2023}, + pages = {10199--10208}, + publisher = {{IEEE}}, + year = {2023}, + url = {https://doi.org/10.1109/CVPR52729.2023.00983}, + doi = {10.1109/CVPR52729.2023.00983}, + timestamp = {Sun, 03 Sep 2023 16:10:50 +0200}, + biburl = {https://dblp.org/rec/conf/cvpr/PhungDT23.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@inproceedings{goodfellow14adversarial, + author = {Ian J. Goodfellow and + Jonathon Shlens and + Christian Szegedy}, + editor = {Yoshua Bengio and + Yann LeCun}, + title = {Explaining and Harnessing Adversarial Examples}, + booktitle = {3rd International Conference on Learning Representations, {ICLR} 2015, + San Diego, CA, USA, May 7-9, 2015, Conference Track Proceedings}, + year = {2015}, +} + +@article{Mallat89Wavelet, + author = {St{\'{e}}phane Mallat}, + title = {A Theory for Multiresolution Signal Decomposition: The Wavelet Representation}, + journal = {{IEEE} Trans. Pattern Anal. Mach. Intell.}, + volume = {11}, + number = {7}, + pages = {674--693}, + year = {1989} +} + +@article{gal2021swagan, +author = {Gal, Rinon and Hochberg, Dana Cohen and Bermano, Amit and Cohen-Or, Daniel}, +title = {SWAGAN: A Style-Based Wavelet-Driven Generative Model}, +year = {2021}, +issue_date = {August 2021}, +publisher = {Association for Computing Machinery}, +address = {New York, NY, USA}, +volume = {40}, +number = {4}, +journal = {ACM Trans. Graph.}, +month = jul, +articleno = {134} +} + +@book{Daubechies92Ten, +author = {Daubechies, Ingrid}, +title = {Ten Lectures on Wavelets}, +publisher = {Society for Industrial and Applied Mathematics}, +year = {1992}, +} + +@inproceedings{williams2018wavelet, + title={Wavelet pooling for convolutional neural networks}, + author={Williams, Travis and Li, Robert}, + booktitle={International conference on learning representations}, + year={2018} +} + +@inproceedings{wolter2021adaptive, + title={Adaptive wavelet pooling for convolutional neural networks}, + author={Wolter, Moritz and Garcke, Jochen}, + booktitle={International Conference on Artificial Intelligence and Statistics}, + pages={1936--1944}, + year={2021}, + organization={PMLR} +} + +@inproceedings{rahaman2019spectral, + title={On the spectral bias of neural networks}, + author={Rahaman, Nasim and Baratin, Aristide and Arpit, Devansh and Draxler, Felix and Lin, Min and Hamprecht, Fred and Bengio, Yoshua and Courville, Aaron}, + booktitle={International Conference on Machine Learning}, + pages={5301--5310}, + year={2019}, + organization={PMLR} +} + +@article{li2022wavelet, + title={Wavelet transform-assisted adaptive generative modeling for colorization}, + author={Li, Jin and Li, Wanyun and Xu, Zichen and Wang, Yuhao and Liu, Qiegen}, + journal={IEEE Transactions on Multimedia}, + year={2022}, + publisher={IEEE} +} + +@inproceedings{saragadam2023wire, + title={Wire: Wavelet implicit neural representations}, + author={Saragadam, Vishwanath and LeJeune, Daniel and Tan, Jasper and Balakrishnan, Guha and Veeraraghavan, Ashok and Baraniuk, Richard G}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={18507--18516}, + year={2023} +} + +@misc{HuggingfaceEval, + title = {Evaluating Diffusion Models}, + howpublished = {\url{https://huggingface.co/docs/diffusers/conceptual/evaluation}}, + note = {Accessed: 2023-10-24}, + year = {2023}, +} + +@misc{EarthOcean, + title = {Ocean world Earth}, + author = {NASA, Apollo 11}, + howpublished = {\url{https://commons.wikimedia.org/wiki/File:Ocean_world_Earth.jpg}}, + year = {1969}, + note = {Accessed: 2023-10-31}, + +} + +@misc{EinsteinChaplin, + title = {Albert Einstein and Charlie Chaplin City Lights premiere 1931}, + author = {Photoplay Publishing}, + howpublished = {\url{https://commons.wikimedia.org/wiki/File:Albert_Einstein_and_Charlie_Chaplin_City_Lights_premiere_1931.jpg}}, + year = {1931}, + note = {Accessed: 2023-11-09}, +} + +@inproceedings{karras2019style, + title={A style-based generator architecture for generative adversarial networks}, + author={Karras, Tero and Laine, Samuli and Aila, Timo}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={4401--4410}, + year={2019} +} + +@inproceedings{karras2020analyzing, + title={Analyzing and improving the image quality of stylegan}, + author={Karras, Tero and Laine, Samuli and Aittala, Miika and Hellsten, Janne and Lehtinen, Jaakko and Aila, Timo}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={8110--8119}, + year={2020} +} + +@article{karras2021alias, + title={Alias-free generative adversarial networks}, + author={Karras, Tero and Aittala, Miika and Laine, Samuli and H{\"a}rk{\"o}nen, Erik and Hellsten, Janne and Lehtinen, Jaakko and Aila, Timo}, + journal={Advances in Neural Information Processing Systems}, + volume={34}, + pages={852--863}, + year={2021} +} + + +@inproceedings{arjovsky2017wasserstein, + title={Wasserstein generative adversarial networks}, + author={Arjovsky, Martin and Chintala, Soumith and Bottou, L{\'e}on}, + booktitle={International conference on machine learning}, + pages={214--223}, + year={2017}, + organization={PMLR} +} + +@inproceedings{szegedy2016rethinking, + title={Rethinking the inception architecture for computer vision}, + author={Szegedy, Christian and Vanhoucke, Vincent and Ioffe, Sergey and Shlens, Jon and Wojna, Zbigniew}, + booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, + pages={2818--2826}, + year={2016} +} + +@article{lee2019pywavelets, + title={PyWavelets: A Python package for wavelet analysis}, + author={Lee, Gregory and Gommers, Ralf and Waselewski, Filip and Wohlfahrt, Kai and O'Leary, Aaron}, + journal={Journal of Open Source Software}, + volume={4}, + number={36}, + pages={1237}, + year={2019}, + publisher={The Open Journal} +} + +@inproceedings{paszke2017automatic, + title={Automatic differentiation in pytorch}, + author={Paszke, Adam and Gross, Sam and Chintala, Soumith and Chanan, Gregory and Yang, Edward and DeVito, Zachary and Lin, Zeming and Desmaison, Alban and Antiga, Luca and Lerer, Adam}, + year={2017}, + booktitle= {31st Conference on Neural Information Processing Systems (NIPS 2017)} +} + +@phdthesis{Wolter21Recurrent, + 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} +} + +@inproceedings{liu2015faceattributes, + title = {Deep Learning Face Attributes in the Wild}, + author = {Liu, Ziwei and Luo, Ping and Wang, Xiaogang and Tang, Xiaoou}, + booktitle = {Proceedings of International Conference on Computer Vision (ICCV)}, + month = {December}, + year = {2015} +} + +@inproceedings{karras2018progGAN, + author = {Tero Karras and + Timo Aila and + Samuli Laine and + Jaakko Lehtinen}, + title = {Progressive Growing of GANs for Improved Quality, Stability, and Variation}, + booktitle = {6th International Conference on Learning Representations, {ICLR} 2018, + Vancouver, BC, Canada, April 30 - May 3, 2018, Conference Track Proceedings}, + year = {2018} +} + +@inproceedings{zhang2022styleswin, + title={Styleswin: Transformer-based gan for high-resolution image generation}, + author={Zhang, Bowen and Gu, Shuyang and Zhang, Bo and Bao, Jianmin and Chen, Dong and Wen, Fang and Wang, Yong and Guo, Baining}, + booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, + pages={11304--11314}, + year={2022} +} + +@book{mallat1999wavelet, + title={A wavelet tour of signal processing}, + author={Mallat, St{\'e}phane}, + year={1999}, + publisher={Elsevier} +} + + +@book{strang1996wavelets, + title={Wavelets and filter banks}, + author={Strang, Gilbert and Nguyen, Truong}, + year={1996}, + publisher={SIAM} +} + +@book{jensen2001ripples, + title={Ripples in mathematics: the discrete wavelet transform}, + author={Jensen, Arne and la Cour-Harbo, Anders}, + year={2001}, + publisher={Springer Science \& Business Media} +} + + +@book{vyas2018multiscale, + title={Multiscale transforms with application to image processing}, + author={Vyas, Aparna and Yu, Soohwan and Paik, Joonki}, + year={2018}, + publisher={Springer} +} + +@article{imagenet15russakovsky, + Author = {Olga Russakovsky and Jia Deng and Hao Su and Jonathan Krause and Sanjeev Satheesh and Sean Ma and Zhiheng Huang and Andrej Karpathy and Aditya Khosla and Michael Bernstein and Alexander C. Berg and Li Fei-Fei}, + Title = { {ImageNet Large Scale Visual Recognition Challenge} }, + Year = {2015}, + journal = {International Journal of Computer Vision (IJCV)}, + doi = {10.1007/s11263-015-0816-y}, + volume={115}, + number={3}, + pages={211-252} +} + +@article{Yu2015LSUNCO, + title={LSUN: Construction of a Large-scale Image Dataset using Deep Learning with Humans in the Loop}, + author={Fisher Yu and Yinda Zhang and Shuran Song and Ari Seff and Jianxiong Xiao}, + journal={ArXiv}, + year={2015}, + volume={abs/1506.03365}, + url={https://api.semanticscholar.org/CorpusID:8317437} +} + +@article{krizhevsky2009learning, + title={Learning multiple layers of features from tiny images}, + author={Krizhevsky, Alex and Hinton, Geoffrey and others}, + year={2009}, + publisher={Toronto, ON, Canada} +} + +@inproceedings{chong20fidbash, + author = {Min Jin Chong and + David A. Forsyth}, + title = {Effectively Unbiased {FID} and Inception Score and Where to Find Them}, + booktitle = {2020 {IEEE/CVF} Conference on Computer Vision and Pattern Recognition, + {CVPR} 2020, Seattle, WA, USA, June 13-19, 2020}, + pages = {6069--6078}, + publisher = {Computer Vision Foundation / {IEEE}}, + year = {2020} +} + +@article{huang2022anisotropic, + title={Anisotropic multiresolution analyses for deep fake detection}, + author={Huang, Wei and Valsecchi, Michelangelo and Multerer, Michael}, + journal={arXiv preprint arXiv:2210.14874}, + year={2022} +} + +@inproceedings{parmar2022aliased, + title={On aliased resizing and surprising subtleties in gan evaluation}, + author={Parmar, Gaurav and Zhang, Richard and Zhu, Jun-Yan}, + booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, + pages={11410--11420}, + year={2022} +} + +@article{salimans2016improved, + title={Improved techniques for training gans}, + author={Salimans, Tim and Goodfellow, Ian and Zaremba, Wojciech and Cheung, Vicki and Radford, Alec and Chen, Xi}, + journal={Advances in neural information processing systems}, + volume={29}, + year={2016} +} + +@inproceedings{Luzi2023Evaluating, + author = {Lorenzo Luzi and + Carlos Ortiz Marrero and + Nile Wynar and + Richard G. Baraniuk and + Michael J. Henry}, + title = {Evaluating generative networks using Gaussian mixtures of image features}, + booktitle = {{IEEE/CVF} Winter Conference on Applications of Computer Vision, {WACV} + 2023, Waikoloa, HI, USA, January 2-7, 2023}, + pages = {279--288}, + publisher = {{IEEE}}, + year = {2023}, + url = {https://doi.org/10.1109/WACV56688.2023.00036}, + doi = {10.1109/WACV56688.2023.00036}, + timestamp = {Tue, 14 Feb 2023 22:26:55 +0100}, + biburl = {https://dblp.org/rec/conf/wacv/LuziMWBH23.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@inproceedings{Kynkaat2023TheRole, + author = {Tuomas Kynk{\"{a}}{\"{a}}nniemi and + Tero Karras and + Miika Aittala and + Timo Aila and + Jaakko Lehtinen}, + title = {The Role of ImageNet Classes in Fr{\'{e}}chet Inception Distance}, + booktitle = {The Eleventh International Conference on Learning Representations, + {ICLR} 2023, Kigali, Rwanda, May 1-5, 2023}, + publisher = {OpenReview.net}, + year = {2023}, + url = {https://openreview.net/pdf?id=4oXTQ6m\_ws8}, + timestamp = {Fri, 30 Jun 2023 14:55:53 +0200}, + biburl = {https://dblp.org/rec/conf/iclr/KynkaanniemiKAA23.bib}, + bibsource = {dblp computer science bibliography, https://dblp.org} +} + +@inproceedings{naeem2020reliable, + title={Reliable fidelity and diversity metrics for generative models}, + author={Naeem, Muhammad Ferjad and Oh, Seong Joon and Uh, Youngjung and Choi, Yunjey and Yoo, Jaejun}, + booktitle={International Conference on Machine Learning}, + pages={7176--7185}, + year={2020}, + organization={PMLR} +} + +@book{strang2006linear, + address = {Belmont, CA}, + author = {Strang, Gilbert}, + isbn = {0030105676 9780030105678 0534422004 9780534422004}, + publisher = {Thomson, Brooks/Cole}, + refid = {61231077}, + timestamp = {2014-09-12T13:40:38.000+0200}, + title = {Linear algebra and its applications}, + year = 2006 +} + +@article{dzanic2020fourier, + title={Fourier spectrum discrepancies in deep network generated images}, + author={Dzanic, Tarik and Shah, Karan and Witherden, Freddie}, + journal={Advances in neural information processing systems}, + volume={33}, + pages={3022--3032}, + year={2020} +} + +@article{wang2004image, + title={Image quality assessment: from error visibility to structural similarity}, + author={Wang, Zhou and Bovik, Alan C and Sheikh, Hamid R and Simoncelli, Eero P}, + journal={IEEE transactions on image processing}, + volume={13}, + number={4}, + pages={600--612}, + year={2004}, + publisher={IEEE} +} + +@article{scikit-image, + title = {scikit-image: image processing in {P}ython}, + author = {van der Walt, {S}t\'efan and {S}ch\"onberger, {J}ohannes {L}. and + {Nunez-Iglesias}, {J}uan and {B}oulogne, {F}ran\c{c}ois and {W}arner, + {J}oshua {D}. and {Y}ager, {N}eil and {G}ouillart, {E}mmanuelle and + {Y}u, {T}ony and the scikit-image contributors}, + year = {2014}, + month = {6}, + keywords = {Image processing, Reproducible research, Education, + Visualization, Open source, Python, Scientific programming}, + volume = {2}, + pages = {e453}, + journal = {PeerJ}, + issn = {2167-8359}, + url = {https://doi.org/10.7717/peerj.453}, + doi = {10.7717/peerj.453} +} + +@inproceedings{saharia2022palette, + title={Palette: Image-to-image diffusion models}, + author={Saharia, Chitwan and Chan, William and Chang, Huiwen and Lee, Chris and Ho, Jonathan and Salimans, Tim and Fleet, David and Norouzi, Mohammad}, + booktitle={ACM SIGGRAPH 2022 Conference Proceedings}, + pages={1--10}, + year={2022} +} From eb758ac7ec1777b09cab9294c67c1fc2b4934cfe Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 17:10:01 +0100 Subject: [PATCH 04/39] docs update. --- docs/conf.py | 7 +- docs/figures/convert.sh | 1 + docs/figures/db6.pdf | Bin 0 -> 34564 bytes docs/figures/db6.png | Bin 0 -> 65342 bytes docs/figures/fwt.pdf | Bin 0 -> 51901 bytes docs/figures/fwt.png | Bin 0 -> 9928 bytes docs/figures/packets_1d.pdf | Bin 0 -> 52905 bytes docs/figures/packets_1d.png | Bin 0 -> 15459 bytes docs/figures/packets_2d.pdf | Bin 0 -> 46536 bytes docs/figures/packets_2d.png | Bin 0 -> 18305 bytes docs/figures/sym6.pdf | Bin 0 -> 34502 bytes docs/figures/sym6.png | Bin 0 -> 56366 bytes docs/index.rst | 30 +++++++ docs/intro.rst | 170 ++++++++++++++++++++---------------- docs/requirements.txt | 3 +- src/ptwt/conv_transform.py | 2 +- 16 files changed, 135 insertions(+), 78 deletions(-) create mode 100644 docs/figures/convert.sh create mode 100644 docs/figures/db6.pdf create mode 100644 docs/figures/db6.png create mode 100644 docs/figures/fwt.pdf create mode 100644 docs/figures/fwt.png create mode 100644 docs/figures/packets_1d.pdf create mode 100644 docs/figures/packets_1d.png create mode 100644 docs/figures/packets_2d.pdf create mode 100644 docs/figures/packets_2d.png create mode 100644 docs/figures/sym6.pdf create mode 100644 docs/figures/sym6.png diff --git a/docs/conf.py b/docs/conf.py index 3976c3ae..37793fab 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- project = 'PyTorch-Wavelet-Toolbox' -copyright = '2022, the ptwt-team' +copyright = '2024, the ptwt-team' # -- General configuration --------------------------------------------------- @@ -76,4 +76,7 @@ html_static_path = ['_static'] -bibtex_bibfiles = ['literature.bib'] \ No newline at end of file +bibtex_bibfiles = ['literature.bib'] + +# numbered figures +numfig = True \ No newline at end of file diff --git a/docs/figures/convert.sh b/docs/figures/convert.sh new file mode 100644 index 00000000..45a6e156 --- /dev/null +++ b/docs/figures/convert.sh @@ -0,0 +1 @@ +convert -density 250 fwt.pdf -quality 100 fwt.png \ No newline at end of file diff --git a/docs/figures/db6.pdf b/docs/figures/db6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..599595977f44d7e7c75d0a3e15ed09460a928f83 GIT binary patch literal 34564 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 Lxl~nM{oS|#hx*g` literal 0 HcmV?d00001 diff --git a/docs/figures/db6.png b/docs/figures/db6.png new file mode 100644 index 0000000000000000000000000000000000000000..da115147a69d971f1d6e515ab079ca0a733bc5a3 GIT binary patch literal 65342 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 z zH+(!=4|1BvCn_B0R#(}~kin1_L-uJcnOCD$Z(Y7ALF(%;kr{r*LjpUEL!t@1-6E?+ zep}HSi`{eRRpN_#FClJGZO6=>B~iABW3zY?B^YYq@F0WxJTO|VmqStBXy^whPN8MZ zpEv0C&N?mTj%xN=9-s+54g4TMMgz6^ESx#6p=w3_khejC{B}=cGTxro5ydQwPIk2F z$ZpzFbcS=c##SeiN(|ivzHESShwS3732mBKM=A^E)7@!DQOZjN1%U*#qEWt0SWGu)2eRsA1 z-#9gA@n`P8e4pAjZ?I=8DrWPVb!wiU(ygI%Y^@F|f}{{eybt|+Hcd~qsd*1?c2n)> z_}{kPstugY>aD%%A&oBQp&U2{zNZ?dKs;M3*k)`vZF+{zQr%n(^XvX8MZbbSnz#3Ki$s!iG5}LMDsv5q zE@SW2+UP|eX%A;j11OR)mrH&~(wXVk9oHG%7+T0`UgJHArF)M8Avq-6PNxoUfx_DG zzBU9VnzP35UnCL_}Cv)cw%6Hf9ffL$kwqwTGi*n`jp|bm8qj9GbG46Ob1B zrTiMT@<3&0u}^pW%gQB@N+(~c(1L7(NPA|Hh`IV~)kZB9pa`X?rYsM|3|Bw?)90L5 zc0i_UVsiGu@B8J12TPBg=ojx?3Z04igB3N_L?K5yq&F~gWSauMXhX0;BzT5lX;ElSgCFsR++m4lMB6~UIM??6%bo*{_M4K zvFIlZI(^6T;PqFxdTFc9#pXPH;}MMul%+lk+#^$nxDjWKmRNKE_Jdo{GN7#Hl`Lh@ zCj@D4dySTo_{tg105o`YvW(2e4Zrg~a&S+*`IN=Ngohs9_3-B*4tp&swL1T3BhbHr zvC19t3zf^gB{v^X>`jDmj>(bT3{#TO5(uxNx>PC6m&BQJVkK%O{wGuupGI(S93jIPm1i*M~tmPp}Ie+9=N z?hqJpw}^Dm2JGDL1-F_>(_d9&@ZAX-W!+yOLXxn}4fSK_m*aOrs6f*r)=z}E=f$xDEj%)9qFpmY(jg@VCmc_9d!h1Iak!oN{UpsHvSH@c_q&~p>2t-MU zt-KrvVQ^N5^qTNQJ1g8vaun_)a0C0h9ql>12kpQ0spUgAq&&L%L`cm|7~<8JIlW>q~l;_2mG(|LPv1L@35DCgEI0y z$2X7>ZbQt41RtRfNNBv9(b0t@$1yZPEQBadepXCOf`ks=AH*lZVe-r6QtND!&BE*M zq9a@D>Wznxrmm5oDT1vRrtFVzezO2iyFL&nJgi=|ZJpEgc(X#<}lApnUfDn8F#Ir>JRqCp4v?f}6vjv|~o zt|5asgB=qSF;b465t1#Fo&TmZVIrFD>kEK9-yaS5xhi4D1LE5K+Zjl!ga+*dp#kDu z9V-Xg+5dATBE%Ox#|F~jV{b`lIftiPjBw0&^z zm+!(C5CQOK7CcZt=&MUh*Gd;m&vsXQ4-!=G2sYf4e~%R~JEJJ&Pf58<$b(RKFrdCl zAK;#-sy}Ow`I|QK|6@F+&1^(`BXx^D;+*2pl>hQ zLs3vr;vGm_TkyGIp}@58Ix}o%r#tzQ@NDz>z~f@AuO2R;ELu-?Q`n}2<0}68WY}N) zbxoK}hX#(ckB*Llf&~0i3+T7(AN*?-H!lX0<13=$$Qd1jPe@MF?RN({H~>uVL(;_4Ul5291^V&Fc1Iy< zb`DWDq$7=(Mahv3IjAp>E!ZhLxNTcLVK;;y>9bR1uP0E>EyEI_BovV1m(@o;bU%D( zJNlXp{kqIG!&_5r?r&MjKwV=LU}VIGYG|uZZ8D*wo)0G|6T22R>Yiq9d87gMhuI++ zd=4SA@n4UnPA?sPiWetw*E8ZeT$3GFeObnYwf-3L2@Z0mFdOBykn3(TAe5^Ce2NAHw*-ZL-oeQiOaQ8SmKS>pfj^HQKfdr>%NFT0w0=&@y8gi@%dXLwj`> zM*WCXwIsQZL1WSzL$Ntl4zENC5)~|_zt0XUhpK6?)!)|p{pZWeW<}Pe;%B~!d1j*E z!OnM3xLG#N2`Wx#Mu}Rdh^slXYzRKJFA;}&Ifup-R7a=FwIJnte4@77X6l*=G;se2 z%KTUCp0r?5YazC^=x|1WuTdNNFnd!Qz@SDJa>+{a5Z};^wXLnE%E@gwR^H5CJE2k?Ked zb|5Nk{BSsL@yF9C@G!RqJo_SQX=2|rD>il`zU|7@w4N_9*Ri?IkARix44TNxPqND( zB~5LU3$lI<*`&QxEi`Z~0pjtJMoryJzvmu{uCMe`S# zT!nn%Cdw6NodxW6@}8_{m}7nQeBC?p&vjcnKCWSpQZc=(2b)^u%GMgJ1wL4vEimew zC8Se1$D8?3c?0m6hbhoKTi#9lnP1eA64QJoTcf~fQN^%Q9O!EvO|EUUk<5H~@;&18 z6@*Y(6UDciRri{mgQ86md!MQ48F9JZF(zJ8#*y0u~P2#m{5%_346RkO10#m5xh5m z8OgGVaz}`uVi(SYH}kISR^RxO*@87D?*8KI)LqoD^DVvkc4`xhPzj0)Q`h0k$b{Wr zFLNS1gE8m?ZKI_$Hc4ftqI$^$if~vhk}~W@hNhlbGhLF_Iz8pC7T9++WO`<*4epxd$30OxOw4@s4tO zQv6c*YA`u@t_#z@;n?@%oiXC*m~U`^4QvemHp*y6;8pr?zta^WB_Zgm_Mm>5BT9;B z!QsTQCg|80=mK8Aj?xU;Lr!xQ_S#^WW21+&Ii_yIF&H{Bvgs+-v0j}YpLhUnf=sgD z=2r(b2-b!DJiplNqdq?#jk6cjm1*=5mZ8J4^Cw>dfLlCKFv)R!FSom`Nnlom)caPn z+p!TSZ(18wJYYUyKQA$tqr4X$1{mcxq0ZbBk?9dxjtkju3q=#7+~dlX^kLhKqZhM= zQGXDvI*@eDeP2L!*+{CQNeWlaban{w2kBLtfm$$qE>1zoDUp_>FK_bm-eUZd%rbOj zHs=-8UP}pZ+h%_#DuM1nOf7}ILSXoHcrL8C7?4ogEO$hzJ$;pWzj;ZGxy$}eaTsL{ zo5*ELk8MSsz9o4y`bBaTx2eItJ{y}LFj$tCTiGVN&59|C?d0}j7~DFC zpc3E?X}6oxjKpL?CIYd1*=}4m)gI(N-4{x7HuR|mkTmG+ltM(Vl~L(v5d`(~Q*oTY zWpaGi(X8j?iv$p+_myT*%eSB?b7#rkrEpYH7bf2hJ)CFIRoU1i>OUxa98@E`jqFd! zKhM?i zt@Riw(`{akYeqcKrv2)kRenBn=SYW_J?(K19?XgT-O@|MVwQIsO0Fs=ydkeH(oC; z^~zm42ThvcF1kprH>|mj<@0^M6n)b^byC)^zRYeSsmA-!V4xloO-=Ut?q6h&7!})%bNj# zgncacw`lAlPWH}cN@qa{8nS!0oy zpUsh_rHSAsiBh|p35&9BngA!8$}Qru`NC;e)qZe8wUTKOM^D8yL2?wUO-w5_bnI}- z5ixF_49OwNw9WcYrp=y@n3*ZvgT2_YtJ!@$RyhUR>Yv<}BHuoWg@MtDSCCk@01Fyn zY=B6^I{u&@4=ve!sN2vV*NOF|oUIc$%(b#{Si?aIHx9kJiuyiI(i>E(lfC#6kF(l8 zw&Fp?|SEt?Gzw})8y^dfw|)&=&0X38UMkz-PCQ2`fE-ABjE$dgxQ)S+uh^3d2R7UTJ{b7g+~dXWfg^!T#! zHqVPNqPLwL7H9TuOOhCB*!lNd0IgD`7%&aNq8mpOi9*FWv!1QL#%#}tYQww*mtGL5 z?O|t54*F%xb=lW1n>ML-HTSJ=rpn7Gzj=gdj9NXNXe2pv!5DUvx&DMBPqD;?(g)WlS{ zLcXIo*;%?WDZgPqq!DU_9CUZnc;;fK@5|xDsS7~Fa2A$ocn3VpOQTSoRETgh;{(sq z1SkYWOl;DVqY&p@=*c=mFQq$LU=nBSuQg8wkFfHBXl33pH{Jm(9 z1>5$L+A4pskE9qOiz(ok@ET1g<5%tU$a#V;jm~yg`9I#>N>k(OHet?l8vcm0z|*}Y z6JU&5D$t{P7Iqz3051N6vH__`0>I`>7dA{ij#yMkKJyCvidwaPi}`d)CYN)Ybhtf` z+m#7{ZmD-0WM061J*5-OlXlX0C7U3wq=~d*>0CXu#Cb>87zCydCGDa=QS#XO!E=*H zOJ_s=`p6ZI>Ab;9bHQ{H6e{#SCrvA8_G2dOvvD>l;fF~wA4RdX^ITSi0Z1rKr=L}G zMD5)fG6i6a`7h$*)u5V_uv8mEzRhV!VCZSSmCL=?AecesM>c0p0_7nO`Hzw4=X!~k zn`l!Q4y#Kt?3s42a=X^%XHW_`fpVY@+8EYPCpx`;!HP$`$Gh2WEF(vnn-G7vY(yEF zt>}24bRv}Vn3-np>6T~c{M&ef)-0_ddv$MVdF*c9qLCmC0zN^TIEK##=SDu;hqqze z$SKtbzX^s&+G;U#MG*^_h71-M@U^?{>d-zT7gdj(DeAqfPfwp+$CT7SFIg}wiBVS|4vY*|LV$AA2?sJW@LD|6wg?MrF zPYM~Z(xzBU>OHp>{#1iE6xI8{>DGv{aE z7F`kjiAV!QbXQfa>*!jVCjPyHWK=1I#e~PB!J6?&!S%4*&vQ$P>bElb%9FW4uEFK( zqq+?|J56c*&g3bH?Rx<#%61&CCD&?XsoynSxPH~zGTI4t32<+^h?I z6qu_f2HsczruCC9Pk!@uc$$tNsMrj3hMDvq+@IbRlq{+`SAP7$7v8&-6v zVeoyQvrD6Y*iYoZDiz!LY6!A)iLODPzaws5TyO1nVpIKH7)RD5SMf;nsUA*RH6lk9 zF#`)_6vVM5yoJihLL4bpwK#%?_J$?@3H6d7v!(Yz)Zu667tF61&=Wl`48uRAG;|e} zLKw5}O54;QmGsVVor6KYZ3V{Q_5wN7mpfv~A{;j)-DiYIHK{}6nt)|H08!x=pG8bD!YnSc3lAVX$&d-%{_b9+alNsT3_}&=$ zg^nn;kJw&w8hZ|eF|!&_@J?mBZzZ|{nRf{fr;f%KM9|!Z!X#glgFuEpSgVscnH?@9 zbVTmzKJIP*l&?eskB`Dx&*GpD(;9C{aI`Jgo^3|5L`yk+$zCew@NBl@=LXROG08A? z$;POoJ^q{iXDyN%m;yF}eV!l={z3L>FCU&S2u-`0D;F2NK~~nN)}gkGDPZ~d&uk2< z`b%k@I69cY+rTBHTd-;l#}b5^lHcB25tHbgn+tq>!hk*wt^S459iK3212lJpJ84lM zF4)!YVM!TnG#2FiY?l(a_L~a=go__$$LTPM7q=aN2-mNC+>UGT5r^H$_`FfYaZ+fmU3)go^}1J95+zM!ZW9F6qEu~ zb^Hs(r70FUBpa(>Gy{fQ#)|3rGxglW{1XC0Qis|ZX6S7J;YuvZ_e^8cleXwk-Y7t; zFjoKqlA4u{80d}3+A?P+mBX@xwfD8!JKrmN(~PEij}CuMXT-<-tL-3V+_|3Cy~4*> zW8%T*{L;%4_l<`U!JO|ekO$R!_M{e-Y&2GvT9k9)o|L6khPwtKxORDIN=mV&zgiR{ z@#|tv$!qx^RgVnD%Olvop|8vu!wVFC=q07=bh9=jcFyD;1ZH2Hmi8Tb8spN)C|%(# z*~%_m@_AjVSrL8JMZlAMl-}_X^DZ%MKg*~*z*Kf%G!^NtfU~y>G~~&jnLA6`uU$IX z*|VDXuC7N{y+hSSBUtb#ZOMctW8=X_m_HDecMhMK6djTZnR)O#F8>(SPciAKc8{d~ zeV|rM7g96~$L79~BO>YdnrgklB$)kvG%l5``Z97@>RKZ7jsacNZ1mP52+93D^*~wY z{n&3p8=MKk@zn>xEMXeS8yA4OdG?&Qx7Pm$uj>pat$aC0CrU>W^NT116YnVX6BpT! z+qy8@AD@C5@X~h8s zwXDFsy6x!*QD0uU(5PecpynZgE4WO~;IgYHZY}C{i=cWij;I7tW;oJ*vgeEM2;h0X zxrEN;Je;#<@9zM86oCB1pu)QjG;pAG#@V}kk{c<}WvjsO|Fuo;m;+8T=m5golB!jVcO*%Z}cAO~?Hz7dC zS7WaOP=g7#3%@%YxbZv$d8SPBtUc9e= zz)uX{-+(gAk(1Yyge%uSx1~XkcIJH?wBWWRAfV(1G(ZXev?r(rBk>oPjygR(?d-nt zAa3HbTtyHvNxI`6tr%2$1%!<}+mFIHsS6+0Vmp}`bY2oZjcSZxM;f8bQ#sqvcpxVJ zMmwk5fj_9;6#>gw6;`e@FF%b*nh2Wa_ZfVjF+|`!^-oDkZd`i{k0851CIa8u!@960 zr1K*#9S`6+3yn0dV}mUP`J-y$kheJkrkzR;@wWItyx3H^%*&kQny{4%M&if(NJdm^ ziZxW;qdFQ)aj;DyKC2gcIh6R9IqXU5k?h&qhO$KrrJe@i0^Ri%G~7I#q7%0x-%X8O zmnN@BSg&PBV+@Zq6mUb&4EHiZrF*&3^LOpR81zGk?sF2ZYfdkGy4(TCevYr&j?$`c z;v+I4zcp8sxTCR1@=>KQ2*A;a`hJG#!7;ge2fe8!Ox@rd1RmE$eNomB2nTjI)XHDC zTDKVa&4{NbCDXMus(WJSZRAb@6q`n109S+C4t=b7nnpGzQ9h+XQSbL24nz5555c!P zT;V`o^HNAI=i(^gfw>Kisc@`1>G1T{Ub8%Q2RB+;BJYHIo~nVuAUH{kcr^)mj@hGy zB@fWxvVihpk!jT4nFOW^Rl>=9eAj4-gOsODi>F7l)6<;?6_5^XheAsH?b(^gqqz=t zNIw%?EEZ0$OM3Gpnw1Moly%7i2ZSq6|0U470niqgR>p7%OXE4Hoj$A404m2A5{Clb zZ7$8b1C|pdBN3M&D1&CJuw}g<;@mZ_T5!lkg;f&18a6U8wqh2FA9hs)UUWo*r7L{$ z;gqc7jO#b_kd1cGmr)u&JMCnb#zaaxS;U?mpn;y1crNdhD{ioD!%E8UU12Wd1k>l0 zg-wZQFw0xCGYmNTQ17oQcy3#I%|q)fZFr5iFGT_U9S)t0{f_B}PVtD8QVCuQMI|*) z_&irV_V$^T%IXW+Yd@2){zRod##;#Gw-B`(Uba{&JY^aoPY1|Yb%Kic3EnRBr{zkF zQdYo6;tz6ETj+>s=Y=r8{1m1E(q4+D!z67iXalu$5c<)tbQQIX^XG3A4$3Nv$U}WU zWQNUT{Wg9ymVKoaW+mbToVd=ap6e;BUc8Hmw;vg|vMXImR;$NEbTa>bQf{RO$r%LFo2%1#3ZD+Z&Nwm!ze3dQi(WK=fn8jj00TXGW$w zYsWTZX4Pyp%HU=gG`x8R4Lofz(=%9I{MaA4Si_<*4MQ`kk19b8wi@DtMNZcX$?2Y- ze{T|AH)z!N4tZ;k1DT%40T*(y13zF_RwT`tXPfP*sNEeJY9KRm%r(gONfB!p&6J$m znAZGFLMD&eWpl~$3b7w0t#Y&I#y*V@Nm{5cguKs*{}_sIxpwR>LG7$T+1%AU$4017 z1<{NSa`mL=(U8Gx^&LoS5VbiZej1Sh0 z7VC5hastky#uyHzRRX;|JSj*jORliBCFuot_hp1r5Mni@-`Z$S3O zqZK0Ve4a^)n=Ab&G9Zz6X~B4w~duRh?-NrnUJYmQFlZvrs$6FFd?)kWi;EI zl}>m^ktR_>E-`)KwwuCWU;duxQLc^U75LW(gA_Ys^oxx^zS2;PG4a9$|0CztYev!Qp2y+m{jEkztc0=H9*Gx!pSp9KZJCOv_so*Nyi0(|E>?Wy zDXcroY|-g_E8Mf{m2~%d9F<&J!JOf3y3FlERpB^%{gJ(js@xLoF*@{x5RnzW&G2)) zO!eP@hV@@T!_LX}zXy%tKcGSC_%F~9lKR0AuRzBFEHx6%8&t%kI8elYLxp_4J>a5N zDDxsoXKjtQ-@rONojGyOC^a>qJ`As<^SUH=*2kYeU7~Gl9B8?jS#tAeXsnp?@bcFz zb<#9B>prcJe?L-ly*-@X$fHfoUF%Jb{U+Ds=g)Wkx$&8qAgxdw|53Z z4_ok!^QpGM+7nsOP0FimiZRj-*y^%#Y7f2(iM6X$L|i&fof;##iXUsrTa%|ePi84K!QauJD~c^#*KurCMkjL z7&8P~ne+g~lfZ6RlQ|-TeYUA!Io5qG8ids@?1a^A?@edbleP^%aYEpzI9u&cZaDRI z%=D0^JljRi>87W*<0y-`mR=~6t>whZ)R44wtpz--DIYfv{}f(HHs5R=Q0StYvZP)+h`6KQ*7JS&RIe_%hk1a&e! z$fMK^1x5Q&^dp0~N^}JJ2Pe3TgIk$hayFMIoL=KSznfFoPIM5g*J1Q9&;{tIgLmE2 zJ{Rt7C(HQjaKU?<;lIziU5^cKC#!*VG27jRchbJbT~B>?UR^}o&OTXZPM77e`GLzd zJvL6rY(T5s=d%Imwc0z-W_;Rq{BQpa4F0uImWYGpKSyEzf8!3NK*J-U-M{~xI}kpe z&TdFtR~~_I_@lE;&U@BBT(x8sH>@T|J@?NiGFlyUQpFz~9N;c5Z>zWnrMP);71G@^ zczM5JP`+sV4FhVOhKXz4k@CjXY>V%yq7-I#Gxb^iUdtbCFTAA)9oz92Eh~u9|GA?MZqj5Bx{5!ZVVT&g<&E^jpuRO~Oj*!;9-WZiz0B zD!rPOb7StqXFDer`^V&V;_as!t5j1`kb9Ys`s3C3ekb*$ZV}9L{a5ex}@oV zGlx9tw}SKxqE?3}g`-Pif?3zs=r$}VWo!!iTMx+d9}vKS4M#orW)L&~5mF%%`e~uu z5OqzLnpP3;5l=0Z)5yd%J|6!&EjF+t5b>fdE)w#79z8U2)B0)Jf1K7TqHONT#CU~l1-VGzd1uH#0P%kS$N)J3?_6T)5lr{NjOXc?eMLxqV(%zE z=o3emQou>S8}*Jue!)~EjFssjJ`U=~7P-)=NO?Yvu-d#FQLS(0xV$R}`(}>Y z|74EpZ|1Q0pP1txQh9Ql4fDB$`s2x1oc~E zi9!Vd_gmFl9?5lhJ2Hc!GdflsJWeFJC4DYi|3hw#u=g=o z&}c~iAGy_Zu!wNZw_%uGL_mP&HkU9YX+*L3L~5}0Ew^+DoxhB~#zz&Zjo&1_@J@{f z{a%$3MMYnXlUh*TH1(Uen=YoD)_9n1hB;k=+P@2Fz#t}jJkfd%<12(V6hBG=F9cMG zNXt*{u|%J>vew1BcQ1zA{uWC+mLB0VWHZLM z*s7sO{bTUl4S3i?k6_`K(aZ4JmCe{~gy8Wb5QZ`#?hfD<2UkVGyobK;o&aHVkD;=k z4jBJgo?|g>J1i)t1*$!(zMsR9MI3TT1jzu>5eoGVd#gm0%~Lr1Ew+H;5!e3_Thk0= zS_TlR$Pin^5A)s7r6y1rF_Xi-S*8&{8REhjPyjg@Z-IZ*)-krjZU9809R73IGxoh) z0qT{!!z}bsY0y+;5+4WGeaj4NHZK0l`tkCS2u(I_rI$6U(XRjkUU$)d)Yjb^&&jvi z3f?*#`BUx2{EZo@<2yqPK3VcxH|B4(CC4Xgd~#=~%qJ`I#)G|gXDFXd5&y!Ix_&f* z#wSbl;Eejo!iMeo%O|;qgb7j?eMBe<8A?b5Luohx&b+ zh3~_l`?v+_6SzRA*!$nm%)d4>5OFg8zr)NL7gGC~%HI&6lO8sHQh9nf&;mnH&U;Yl z>+7nh{(a~_Mna88LJq(!J(#Yjqwst&#EmeYyE?4QmUzG18$;*8ilTBaofr zwtLqc_mT3-2)PJE$=^_eKmOy%px> z^u|YkxJECtcEg4tNu{FSvQiNSc=V|>8`8+qscLZ=O_Y9}ahLn<37(}=4)$FIp#)Y0 zTSoB(-v)B+0^SA&+sp&b$uf5fhx`lim$(~vdLAgTK^+TdzMFX)=r`|=B6UNoc}C5? z0MSx;&D^F0D*7aJX6ni55fzIl43u=0MYZ^gzvQK#($%H9wDc z{~k{(OVXik1G{FE-KVUxAf}P!2>ex>^L5XiOoNz*;L993dB%KWleQRqJowjXhV4zZ__QWz6py>Dw$`?8W*MB zNTYtbN6dYQ3PatLi~obe%Sw47%)OP}ws8 z1jm>c{^^<|{(Svyw{G-K1l~J2&hgJD zrN^$Om9I^suQ#qY{^9eloZ7E|?=g1dZ~O@>U&MxAA>?meOm0a!2(l`87s;3112Gf9l<-z~|Vw%H) z57DMrFGGBv55Bl5;cli@Eae##wf-O*fFJVltW?4vKMGbc)VXrS*jJOHh$LW0-&16!g&%!6!8=kjcy#hOg8wErQr&*fEFCDIad6~2Sp1f-h<1o3rD8F zMHr`oA3Y$h;?j1KOoT0Y&7__}Oxd2GNwc@w!$fK*LHV(c^R-sUs7L0JOb5YAKV%t0 zP&mV)`}3mo(WL@hdpM`HBp*T07Q+nYXVMJL7shi*K^H91M|EtaUa|~EZQK}|PuPZF z`#qIm*5Mu!Aw1ykq%NhIXr#%RDiY!TjPxrJg)8GJ;Lna?jUHi>HDhPV$@8Tz894Vn ziT3^swyK6QnS^ ze?caG5IR2kFs^*%j(;K&zwxuKd_|7bu^w27v>rH?-%Q~n&RnbdM0X&b};=@LbIJzHBN!*91z&(gsNhT*s3FI9RGCre9xJ!|WK)}m-?=0NoQ`j0iy z5-A(mJAD5%5eq#ND-#`4M;i~+7E*(r+ zqonGdGG)y}mvG15?b8VY#DHivY7cDg17qac1Smu!|ECbdTp;2zA-O0Ovm^sLU8sdJ zYKCOh9C!Cy`OK*D`q3I|0c0`~pxizo36Zz}{R=h}KT#SSMhjtD0+VWUWQ@E-HPr|r zP*Hm&j1@q&Y1nQbGFkk4VV)Z3jTe!G@?CYg{bx{-4N<(_r&a91QgMKq7~4X`L|$nE zU(&Pro`LiOpxkPHxx=Z3EFZ37F;q3C4iD#ysneepDQQ$x?c<19%Oxe zpKsT@MG@NE+>u%L+)Qqnt-B_bcF!bkcf>xoeU;{Nr`Xrq?W4q%*?|RBqn!m#=i<&%8G*Rr7M1nPC0kU`5J+Zi|udpK)8{NEI||1;yx|J&}1+&-zHd-~DObro@Dmo8^D&%WP&`|O9Zg2JHU z+oh9CR%G_ov$Dlpv2VKdE^V%=c&t&;@vRL${_(4-q^5WndR(vk8+>QiTeBVQ$DRK! zmeV~|D*EctrT$6XTjm!0`7+tRd-tol-tSJ2tu*tdb+6gMEVI*o&b`>H&WnF#YlT3n1$8WCwvi;*lR!IZ1ke`qhB|!=xwchFSI>6;>^E@ zU+Fc%y(zUOn|2!o?O$9No$=;hM%D67>}l2P-Fy<+_YVHhHOQ0pskpiB@a1osdwdo@ z*?#oytYxM4>9gk@*F0Bj*gtE+Iqh%xbwy=jmVCL$;`jZ5D%FD11?A=*H} z#3+_aKRB~070BY!4_AmbR4`I71d0Xa=a(n|$LkCff1bqX?q+K0X6oYP=xpp{;OJ)IY+-5WW?*KgKv)UT7N69-^pXq(L)aa8L<|gyp4`aW z#314F&{{-PR8S;^;hRArPuPOx+qaf*c>8)7hyjOmJtUe0bzXk?_vo~?T*G|k`x7Vj zv@$6*NO>u3%u$`hYrl8z+#N;}SDraC+4An{zpR^Y?0T|q!>=>`*F;ZWlKN1yab2Z# z(^c6u@edwz+Zk_=e6zHsJfZr4e9!}t=a_+9T#{H+Qc(m9R#QV$BO@+VRabvEE&%*q B-B17k literal 0 HcmV?d00001 diff --git a/docs/figures/fwt.png b/docs/figures/fwt.png new file mode 100644 index 0000000000000000000000000000000000000000..eb41f970e2c2036802ac6620975328a412272e06 GIT binary patch literal 9928 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 literal 0 HcmV?d00001 diff --git a/docs/figures/packets_2d.pdf b/docs/figures/packets_2d.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1855126660228b081c916db96019b04f888e1269 GIT binary patch literal 46536 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 S+hk^CU}c3NB^8kqh528VC*`34 literal 0 HcmV?d00001 diff --git a/docs/figures/packets_2d.png b/docs/figures/packets_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..fa303a8ddefd1eadc37d54ac66cce4c41efa7d24 GIT binary patch literal 18305 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 literal 0 HcmV?d00001 diff --git a/docs/figures/sym6.pdf b/docs/figures/sym6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6c812d962525e75f0efea528d33ef7eb484c9cb GIT binary patch literal 34502 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

xN#_O*YT3cBn2us|FR}HWd~*x%`MA& z-g)*`+1V^!R{fU5pYwF`o3XG7Qm#4T{>6I-VPi!RF}jOwDomp@CNaIaZUBiXM@1kZ(0mlpVBPO(aj#Ukjz_bc< zOdXig2Z6}1ubR}E{WF!wEN-PUY2K{3G9<@%2$P({_1T_5Jg~z{{(Y?6l7+4QZcoV^ z%gWodW+*wjZNM~D54sDdaYG{kRWkybCJWT%W2a=sE8FRASNwusXDC#PtGITKYK^7S z@Zw3@cN{f3BeK|;j`}V?Z{n<6vnx-uH(-yK2;&fW?PJa1@+*OtH6z8$bv@axnNI!#UMfg#(o*>6X+RGVBl z&@NA3k)f~`hMrk0+3xeQX*;X*x%@W9(wRbh372?2O(p-_YNTYWb_6`eBG4VjguO^F zULuRdU7_wkhNutx>tc*7=g|V4HjY5WExd z)#G}atMat!BmGA{0MK4A)k6T%%dY$Z3Ay@hxo)uY=KEs;7sy;H6IVelToi@#JU9S< zz@>6@P#(I3TV$Bwv19wLGfyry3?jjq`<1HJC^o=x&Zj!G0xldV?{VP8=i_@z@pXm; zJ6~Vn)vA|WsOaB{pU@LuRn2da=B_JF0#_ss!Gdd_leo@2E~fx{$}5;Vg#iTsa}`P1 z1)JnJx9SVWnc{2dfNOEHw&wHu$p~llD{A3hrM|mP6Kq>jW5mm`6btjarI>)_oprX{ z@cH$XM+%Q+Gb~+$D;AvX|x_m+81|HN~`U& zc9-cK54y2ZT2`K;`$e>aIy@rl2$enmdZt$y5fMuD#Mr>mH~s?q z?Q6eD{p|NSP5Zwnd&gK&qF_t-*tTukw$Hi8wr%?!+qP}nwr$(S+&42XdHLogGhfnw z_TH85%1&18?yjn}ir=|sXlhA(pd3GK4vxd&jLH?1u8JriUE=On(JW4l;n&5_QBmcN zW=v=gs5l0M&zvfg;YE}erG-KlB%DqDmEvYFsWb& zzMK&rd2YsZg@$g!9I<<#?M)apP*o4qGa`UvXl42|7>`j#t49*XN)hDCZ5g)!?SS3H zT%p_S_39ebYO{$>Xt3b%{IYTdtm!)vvbK%!aZ7Q%A6?IVD`A1RQ+^05p@ zF|326ydS)>6=;@6_ySBGK^Vv>cniPSpKp!%xx-jDQr-Tv%5pO2J5`vj^WfYxu2A}& zkUau>c(BQk(LkFbVAc}!Jl3`;8T|xfpI9BPktef6^$2uYrBdAhtqu-24D{Sa&J`ac z1N0EVn1Ga{&~1#WE19fU;3}2x2C%7?C%a1+$mhY+z{~y)H>5yax;It$Iqb!!WlKzB~+qB1QIT(1HcCXqXyszExieQMx8j5cJF|} z{u!+Yzy#|GW{n0)<{b{Jm&#X!yvWnN+F2IQ!cSZ*G(4q=OiYN#(&11UD%I@75{79$ z5I!?>tcUj81rP4EHT#qI_gtqz;enF%*6#C0So6#d@fIgKNBQ#@HjW7hp7JVp=%Vr(qqFj&i%f^eCLT8%Npk}+?!@Cl(~{(vl>;L+6pC9uTtHl-@L*e zg$c{`ZbctD39q^YAIidL?GR_2V3jti#Zj@dE^aowg-PI!TE5l78T(5AFX0y_O~#g( zQLv=eeduloST~~|-%nz%308VVglO{fJ5Ng+zFZ~Xlc1ER75~yE!;Oi(#Ixooh9~hp zXDOJbg-7GQ^QB1o;~YJ8Fa#u|R)3O`G+VP5*_(MeyQEslCL9VmS+h#R10K&eM*qn3 z%ph6*su|+%!y)?T0Aum`ig6iddA$2>x(Z-`Rg}r5S#vto5*Xy#n9ycPnO^)?-A0gG z#IaFKfnm;C7t~cI_S&;nmsF?XV$p%NVWcjrO#o^UiiQZGZds@8SOKoS+ zZ<=MST~dIbxg#d#|Eh41;;%)~wDqTu9aH1S19yIDS3`HjdSd#R{T2`^OA;*v1fMzQ zF6^XTeyQC3m<(Oi_@bi&ZYWhqQjJLR-?IaH4SB0e;=~mW(DiM+K8{x-k5m;2fTD`o z4uY<`dufZReSai7xz#~r4rajF*rmR;glK~VLT@KS1C5*7VvRm(SCzR>qRH8@H=$ZS zx*JqVw_MTQy_NYHfe2qP1Hbb>jtsEyLvESE?(*05>Q~$MQ|HwMaIn&FXNi?GKIj1h zMi>FzG4H5tHx^&P)^)o;_00Vj^p@!ky5)yK|Mp?m(2M%4dTC*>ue2r|l71JmoOr{<`RRyq28F12NdYrr;KAh?U6fah-`=z+ldTN~bQCU3P z0&m`ulR2NpE!OZ2h@6eXH|8YP+;zvnoejnv#d%I{v=fdQ;)qF5!6qo*4XS^kOA*|m zt>N+J@sC(Ris2>DC_-7iHlR>OxhWbTCNot*jDka6rSqQqFb9le$ z>D!#j)}SYNQA}MY`qZ3JR^oxL?bb9mb><0_+zg&uQGqyGImrYF1u#*YPwv`0LSLs$ z3)?Dw)Ioh(_+WWzAz-l{|0|Z2`Y-VoqbO`E^f)GtBFN*K2AX?$64pFhX8>b${m^Q( z=@OWnOhdh-I5NXF=Vy{f`RtNaGXK4A;dhH?*w3`Ih_4iHzZ9C0uvm?9e39vvUt%7Wy(MH+#8j&qTI%i;dST;ZM2 z@{F=|qd0Ck6P_mbNp`4_NP7VUv;{;1oJb>MUiT6Ff$Ayf9Ou}u0$7-O57!fkVDY4F zq9FVZlHFj?pQYp*ompn4wgYUUmP*AG3>=#0%o@5gVBeYzT#$9 z3yXlji>%Q--fsi7EN>PlTH0P7KA+tbl17+cW^TYUjBSHrO(k>lWaxy#gqf3Di2#c! zk90}uT&y94@Z38QZk)kM5_B`~CtsvKh}KB760sK(#F_ajyG`&=31s#5?A~&&)}dcB7f$K)kz+f4pN{<17`OL z)>GgWJ#%%-5NcMqD)v=6ZdvD~x&-LX0mg%(hlP#ErJZu_)PZg?(Qjq$0JWp;D$S@u zI(yq+Q!|{UBoXcPrP3!23{NczS$?~tulE7l$B7C{P0Zp*Gp08yhkQ{kU@53bbF}K`@ymDjBUW>Y7o|2b(r>q>+8_wn=5+l5(Rcyc5 zmElKQ&&!JNGf6?B3w6zGuZ1`9X(glwOJ|^4Qsne^g@v-nN7PyWFRg}bWuh8!YoUI z)qPrJ)t(ZbC~GN(bfldO!Zx`1n{`FIu95gFakb56tDme~j|-9dai+n$jG|&1PkRW@ zv%N-zhpI(g{e~2kz74=+95M#qv&lqWMZS`q=!lvwc3ZNjjO~>9SRSpbd!t^dUSA$; zTeSepR7hq2y$|IF?nXQzZ>y5Tst)QsC|2DoV7z2{GY8#qLn!HQ#Or`v3C_?EZZHJa1wQWO8piVsDmllhO3xm%E z7h|f`eci(ZYst(^bYylU3$^9`)EuA{9nkzg9j%QWfZrqdqIJQINRy|qNf5L;s-9eU zEC`-~U*T;ofVGv^CK`*Yo}nZ*v_+Bs_sK1hYpz_GyT$Up_wEyVzG zM7+A<)5>O#oA}JVJ$ZiPddG)oN%c8@pm^gQ2HFV#LVgj7A+f10$oZM9&}W+I6Swdy z&@SBWZ5{Jy59ana9ZLnr&);f3KHaXX4*L}J$hnE^yhTxAQ(Vb~SC*V12#wgz?zOg~ z0@7sgCPf~u^QmgDT8RiDdP;pZq38Q_2gKf0e~BGXF+8r^=cTbbzs=EPP-@;Dy~@=* zvIc0v{&xI4ed*d2{yUU<-ki9{Q;MWs2GB%k3rU_Nge00H%sJl^on6_bifXarXW*E# zr0cGYZhZ1{SiuvAzOJ0s35oNmE+gU(RQM60zMsrwh4Z?aGobt~?@}gyhElnlxdr({ zTQ%#6-`n~wYVE!()#diY25cIVY;<_%Rz{~t1PATzfHwo;{^(G5k>*qzn47@(_NvyY zJfmCS`E8h)*WqMJ7e&KfI%K2Gf+hrP|Ab16HdO6h3RYW2x_>!IzC_Cxk=t$Sb&nf` zayRN|GUX((m;?1=qsbGtZb;wJ$9gAgRG0V1*&{Jzm!=>1B4S*(i$UhNz8&pJE_FZ8N^`QS;{;sIoFalAz-B4&)4YK zi%~(0N7#@^1-%oUoj}n$GRuu3xXl`jRZCLVVITtL3DOK-2$yTrA-twZjm1<&uw_s) zP*^%^Fs-ljPUu4pc~O7WBa=eTJ{HL2(zgu_D+5#X-&j3j`aLUFE~-HnX90pKSY%J) zbYhgaWhvLfYR^0quJI9RxH&K5y=DbVNRFgZ^o)o}z<3NU*@G_d6zhM1_hJ$rOvYg` z>Tgxx{VX>Jm2iRDGOz_1>!5s|^Bm#=p9#P+eB4R0HTf|fx&lLYFBT7{!Ug{Ctp zoG;y17w2nM`a}ULIg{+A?pVmC&iV`LgFcnqxDdoNe7B*e#^E8L!SwmYEvU7jUJSH} z{d;|?+K?~KldmyAC5|TqZM*Rde@`HN_>z^p?;;1W4TT_Os)=Sd-Nbs5Vv{_od#McT z6*@(v4E9vPj(H9NEsxW?PDPNmOs5FT*a&tgIB!~9LG7lvp*OZA$>J|Rnnyv7H2n2=#@5GgM9KzfTmcH;5x*w*p&WE?goI9n8NvQa` zz_xN*d|j&5l%X-z$Z*3n=bM>?@K;mp6i$Y&}$kRKt2TDeA2KMf%_rPZjQA`Z(lxxp(Jc1hln*h+Ud7 z*OW#{@=;Co9aXz7PbQoVMWm%7gGyjf(MP#tpLtsm0QXKT|r7h3Z3? z+gT5Tiq%D((rKw(@fWLDG=ctLqV%~ldW(hVk>dCE-MOJx$_AA&IUMKSCvHmBK6xs} z-Uq;w9b{Vjc;9!+b4FYBk$-(^vk|I@3Hw4x89ayh2^Mx>c0Q~f_%R#81qMvpuHSo- zI61L>QD;$W^p`qYDG<;12PjFwBCf{gyhUCopy%(;fKsa5V29vB@k&fjAJ)*90^l{a z^hY$0XzB0|RM@~#_@ctNx5=S>ayeMI6uC2a+*AA_)>jl!H1wbL3_5Ch(=qVE1UC8) z%{^q1Y5=0wP%Ay##ycXc08o#%eS|cTT5V!oIcsdW#8a}V(Dpgtf+kqFsp5~V!5^}|q#Wj))ch9_RzS`?pvwkwPDw=*- zF0zI|PRn!ECXSrG$7va>N`2UQCasRamy?^{waOIdEqX`>{vusa)gR%6?vQnRdfDCh zJxB9RpD1UWXamPKccFxR4+q}U_}8-{n%h%JqFl>9=*oa-uagw~Qz$DXlu;HWy>|wI zk)E%SciR}m%S0PzjHsU2#jXh4UDA-c$vY-A)j+1pSfQcz+j5B$awPu4YfPbXEUQS) zq_yVsl(B~}4g$k*L*qMeS1!e~n-HA2N8r23?~*lpB4m|g0F=-Jj`572ds`hKSU;5% zr|`By?;zp)@vAc8#tLs;?XNon7n!GtcYqh2G>_Ki3_U6f5Mv1>e23nC%*-fo>t0;7 zsOinKycagNf_mrSNg6>?F;=qhPDUGmQ{UbbZraPW;LC>r8(_u2BX~Ymg`W&b>KKt%Rk>`pjI||;5g?)nWYYhIf+;_-+ zwWoC!`HM?c&ZB>V1W#To@r5#!cDe=#I;u|l+`8*pMlI1E#Lv=FQijhlp78}w`tkw& zdwu|ltx0GmZyDd?jnr8CqzK0CX3OsF?D5|c7C3-rOi^Sbs>)pF*-M#J8N1UrTA*Tvk+BXvfSpG5OJ-7(Wk$Qlex|kO{urg2T}P<-hy;l+z>3X! zyn99YUNA?u2UU$8T^K2!l;qGo@!02+vzSuXdpi_vRTUqHKA2>h7|fv=eC^`11zVd3 zN0vYkSE<{2hHM$Vp5V0r6cBvn`8q635pf>i3~Wp2H_V4qjE#vX>TH>cgwL`A(W)cd%CJuMZ-(uQ?*OvVk`{>fVyW>=_GIWU6f)7WQ7px@SVRyni^C8J$^ z2TD}tL{6Tq8*(mUCzJ_)8<@|#FQDr(BbRN;r=QMIQ}Fb-6dxsjmi~2TN0x z;pHu`Bav=8FKbN12Uu}O05NgZ2m&i4U$Wz?@S2z%P@G){6*qiSOFMm3m`QVv=v=nJ zoQaJhrldipw~+wW>0`qd%AGE>lRz=tQU945w|r6p0GfQ*G?)KXNzCc=IPF4c@L2Fnr5*XU^IDw!})HrG_*SSbkWT zC*z{><8@;kJ>vd9!5tmHlq8njLQ^WP6H03bmUmdM?s*c`q3Z;r40SzT$penz zWiE-r%XoG_b;24PnB3F+|EiJFqd-`urM>dn5@hxf)gPR8r;rxnFH;|pjF!1!+H}nr zw+`~KLkUkSu7(K`G_TXRsJ9bSs>##2xXGV+|H+>QJAPN&2ITZ{(6ufZn$tCw_F3+tt|21hVjNH4^bj59f2Qc4F?CUTdlU zoFiQ~EL2s2;xEJA#+N-UxD%m^OQpEcHFjh)nm;fBEwI2C-}?TU7-4<5BYcjtz|nxC zWSDatfx^5#eY|~)@ghS0&S22XN<6C``C<68WlNrASL`J-sR|ZuXvG?dv@V?a4FG^} zOr;jqAUt8=M#bV&H)-HUW+Lg6y`!BDksVw%8*d2-SA?<#im1_eYZ*(Fz3jE4@Iolk z@6HRxMacg-C_w6A{Jt2bS(+`oAKNuQBe%nC)47OQDYVNk0R`Y(g-(J?7w%71BvT;WS zF!mM@4**t$_!qtfgZL`~nCKWu6A}PGpdbPO1>di)%jQvFyxDQ{bz-goLyGnl{{ZJ- z0k(+e+fcnwuqdDdf}48`00igCR~rxL`C_}rUkJI^ z2rQG8Kh}#g0s%3xxdRL%fUU29fDt1S>OO$mj|brF;$L3^C$NhP^9x<|i0%)6XXXST z1SIq;^-BJsMnv)DR>unwWbf1(`YE(8_iq=#z|JbqA@aNxyaBx04(aoFVZsGQH@(({ z4PM~P`)*gR0WBj!0KA@p{7!@edGc;3iU5$HK3NO*YFW-~RD-#xh_|-->`{<@)%>Uw z;29vgZ+im$;8sy%?m|9)y8{LGW8(CTI6OO`GY0ZwdHOS`{20uUe|l}?^ic#*C@9Iu zs6YVtf&6_0W&(Sm(%w4$`f>YZ&NG92bP{g?B0OR22~dDU{S3T{Z+Ha&QozgG=l%L| z{j?9DBLQ&;2~zk2uR%hM{<^s~VZyvyMf3T=m%;Zzg_YzY0K8p3)^c014B{Z#r``7M z_r|I#Ob-k!$^3nt9s6~pq9pVN`1u-00PvM$BoL60kboheql1F@GQ$J*I?LtzAy!3( z69gdnwM6fh_iMd+4h7cs0~vsQGo#}L$!OOHSnUn}L7;#F$)^|kHS73=d;hKfQcL+w zKKtE{&mf0+*_?ew-}}Aa>=ZQU@k1~_@hq65niI`y2Kcor<9wq(zX-(5&$0czUKUv| zT+V}V6JpNLJL>_s`_XfyP=vhzc4hG|5Sa0+KcVkDr|<61v#$dLg8Y6C5)=mv_&pYm zggJ`vjUbp``nm=xWPO_LsIW&ExKCXR5*-G3!NYs$c{^(qtNlk6BxJ6_73kxeh)F;J zAf7iz2=EjY001!n{JYu@1Q=+m&_@1{iu#M6E|`OdXP*9D0?=`_d%2qd_SdJ6;A@x@ zM1pJU*u;I*B%7$4{kN1cYq_~5jb!r2{13|L7qg!k?w0lQxww>T3@ZzCd z7&y{-r{jnx64ec)R*4u?8t(h#TV_$<+5~V>p3JPLB;lJ2emt8OYk{zt@sro8EQU4P zlQeH+k|GP)aEFshuZfZ&-ODfszAO)AY9Q*f;SxijJr-x$-=%E9q+~ty3w=7)(S1HR zW>ufscM2xRDZOJKskt04JM!k*{N$|ME`b2DV!}I#KDvy}0L*%!Q zE__Xs{wyf|O`I8L-&ElPzC11w`{-JdrDK$0J?fz|59l0qQp;gB=%y0oU7^E}wi)5551crYXk zCO!F^S69apyLWRIooplgL~fW$Y1oF4)V_)gWYNuJei((3G)>sGOXsZS1COUDp^Vuc zLUk}qNp0E`-T3)#P2L1{bY}_5SkJ&a`lujP65no22p)b4 z^MZTUwDd$p+`jh@yJ@W+#h|!r(grn z89cxcW~Epz4Web^{ydvqO0|y3Cb-Qt*k4P1=bwY1O?Nubo9X)Q7Q9=Ed<>$o8qsAh z^L~&z%_#+3>XJs7HAQ)!)SNeJ|N2MQ>cIkEi}IBx57sSo%8`24Rh~OUmj0o{I*B;u zWxZU0rI9wJPUMG3-VCK2m_mS+Pwn1#d{sK~!dgfxUUa-P5#O1-4~Dl+QgPumuKrlb z%8}(Yakk%_l;HHq2jN~-7{<&^F&FDkq4$fkBuQ;sOpc=30R-AqT#wpNd(fRC zqjy=tS-5jL2GR)&diRz$jKGCjXUAh>owN3Tvx-%VB0ML8fE%T;;)a3;dF|dIkyA%) z@zK+_TsByxS6-W3fQXbKP1IoAlbQ46Yrr{5=9y&gTN%5s)-0j+Td5=OO}Ut1MyIa}?=#gT4@RIZOgj&Ck&1fQ2aq#scYt%T(O>VA9;%neWcYpTOXT+z3*;nR!*3qbK z#Pw!;6zazsB8k_8FGcnn!W8>_PjP*E_EGcExcG~&0_9ZVpY-s`&;t(!u}n_Al&izI zYjTeee#kq}plR5@-rHu0skfHn5$29+$vnF(wv_W_36L@W4IIAaj(OHQ$EBWR znHpk*!_idCmukCH7JQ$1rrsiT3DowNvQ0}9Cm+U&jb6NsPYW&oq`1F_{eeGKP_Zdj zVi@V~QtZn`J?$Xl2BuA%3=`OzJ|<2bMu*;(N1}+|{0X7!{JmI5(Z1k_>uX=hDo|n( zbpX8ukV>LhL~SQa_Qc#57{PMzivWe2;>8-pR>y~M%-`IO1|DiJbAUJDaP~=8pOG~6 zFNyH@ezwii6t?o*?Ax|bE@b6fTI*B}N7Yx~i;`12D>8TLC_;%{c>Ui51dQf2S^U=|#S`zFsoJ*K2anTK z!IYl!Z=+f%C`a4<#LbJCk?pm6YL-2q@hN-TGtOB@@(c1=YK4(w;o+f}2mA|Kiu&>P z0h&Rg4?6AVsZ1I@{4&}xYidw73Fr1@0|F6?AA4ifwY9A=fddAcSl+mhz)bCLdz zi&0ivsA>ioA@8`u4$&w?Fh-u}*}lDqAw>xb^pMs|MHJY@;t+&Z4qXqTBv#*sSBfOq zv9>$nqWX$e8N3ZyF|)3?RpRT6H#qSo;#o4dzF)(vr!Lb-{5;x?t@ z;?T95jdqeB+rH1^B$^(i5_Ry;ZM^OL%nz=Zf$^t%<;Gk7qeE3Ei9$ir)#m{(ob9pF z2AzGld|CC!nxAl6PQZP~S^ilA-p)Al* zI969+MZ3HsD60gC!-IePQLE_H*EaG+Sxjg%(=)Jb8@xg16E1viu<0*It0@x)DL#k3 zy7Z*;=XIhl*`<2cWi(2g;9Yjhr@Xmow&YPc*1J?=>W<-gGQ%0&Ke+20E?QJa7-z`Q z{P2M;uhr3V{ENG;$YVs!6@@TW?>?bBjso|If^MNJ<~O0%SH``SC>=p5*X^>w(@BW7 z!J9T|I-TVk2`?v(ikaGW+Xp{Oe#17E;an8|VoFMT8C8p9agCdOwN@rDX;&o`TO7ya zajO;VrQV}Zl_sVGdZcf>HTX_uiPi(2&J?}vV~l|0?!b#n@X1Vv{q0vGuFT(;hi-|5yNkUJkV<9nNAWmc;XbRj5rk44vsqRi9Yf;Ze=LyY ziSzT&4KaUFOp3y-<`;DtKvgh1h5%+<8}@j?JLbEStjy2xd{vZ!KlwGjyu?SP*Y`CC z&T$g!9fZentw@RM>qad`lFJ3I6(r~yU*szf{uS3eez%*=EkgxF=%kjRa?IPXua8L$ zE$mJ&sFRgrD_r>9SsZwTrn)}eOfJ2U>?xEL92O4>XTg9$C)?Q)n{V6mO(~8SugE%?}r zXP;ygnotOsx^(rvor|I`qHGJ|uFq}{OYN{A{E@Y9l-W1ZlWX-Ul1Vw23oGJ|v_Usb zHyB-5m7P)S#(5qoY~Dx54EBA9qyq16@JvN)<-*+yin{-a zEyJa0KT=00b#KXahK+7d`HaveS}~$$+yM@hH)3J)gg{p5THU0pj{FPBb)HD^ij(_Z zS)u@!`own+r%|LcNrb9j$fC9BSR#C!^V#0e-qE13yIWa2#0Ms*30-R`sY_{;X-1J1 zmF0^*&h2+G1H)YPk01GslNxN(pgK!&?)yn~@thefaYnP;b z-Vd$ag8a?tO>%O|_4F{PE!$dMaQGkXHP)+RuHXJqeusxKqO~KmZ(u@xZnP6G;!t8O zf@|UN41T(QR`W7mQEfH4&d1K-Mp?6w-a~B>Ii=A#gYg6^h$DfT&&CXamXu1@awDF6 zjIvs6m4cGA+{XsYeaP&3&6@6n;+zjm_H6R5i!uVBL!x@5@`4G%^$gRLVcp{ym?gv0 zg2{E#ku)_opWb8_@6rB_q!zizzN1o}n3VVeE^LGVQ^5lK5-0siGQMe3r<2jDeeU7c zShL9t8SOz$?y+U(1f@ksW#wkf?h=CBn|WVkVY};_kjHak7@k<;46yOv*6@H*KPJ?M zLZ5=01%h8ldOuxR(fsqo(q~IOS$bG?J&Razu?JNb87adu7Sr$$NJ zN2<(}F!*20OwIRB7}(@tWM(dpS7hzo@=_ZVFzPGIhFT#nFz}=T`x*3E=;dZ~m@I6( zOIFQhLo2w=8!>R|L)=V-_i7p88|&@(^l^#EPPldxH~jC)Dk_%J;dO_`mw;)yxidI8 z2Z|fTxxokh1s7feHHr9d$^j*5Z4&x0p=LGlM)mv=JDNmsgK=tnaXf@$zVlb$v` z2_{RQnlitC1@;oZ^p|!d;wa7?;@3YUM1k#CEhME~rZ26;?$^MSjLlyn+amyXtK|oM z%G=059VQA^FYx3pOE`Q;3JR^m|HvP509_zub{O5`mHH{vZfVDj`E^LEt49`IK3gPD z24kt9wbVlqd@=n2`E`sl;{0BSCoO$v=6EiB~~?HYO92A35GJ z>%z~<*Yd#?Vm*QusVxRh5053ry8t^5IB6?F>kEH=I7N)dK7wz!VYU$G7Bx_NvO|AW zwnj{(9y-oYE(J8@yq?uq2X6wtf@uckN9*3^xK|FJl8q*W;yH%sIZup3X-lW}YCaY? zEe1J&RlGh)CdWXcjXv?0%+YAV9FrZ$p1Covu#p^p&09cAu#b{`9u))@p&OX6RVBr* zd>TF$(w?r>mX4s}Vic#bb{Xd*E+!mMOfY> zds)QRhoxF|KNiX-*wA&`czP}wS4i1nF%Vr&{pd=#gH13rx_k#&hnaQ4An$C}L04^B ze&8g*F)pev0u5mN$VBfk9fGQ&{ld&EU)sdj!VbVn*AD`jmzp6WjyH`j9d4$C^sn{6v@ z%tELrlX+dl@N^u5=69Co>GOGbNqt@s7k}xEY?YT$1`rndxWkGVo-`G_b?Ei5?!w>e z$sF8u2HkWosS>|S%k~nCX2+11Xr`1rH=P`8P}}8CgF`oKdYE2jS<1^S)NHa=#dl-R z-S;(>35@)ejs&O7zjusQZzYx$Tk6IF|2m`C9QXrP-Cm?miZzidf#+~yp8rr_FsG<| zms4g-e_5i+wb@-UPE4AqPAtwdq)$8s)Y1-1Ba5#rO`O7YY1usySEK7U^Wk$2cgeF2 z(dbeoI#-%ApC2ytga;nkb5go%2}?~kh8f;hAj8lG-x1HMY*r&VQ#C*J!I9H zoTKrcj0D)dy-1Y2oLGjizXuK;?0(GBQswmRL8ff9UenLNFj>`@FO3n4_;l6&Muhs2 zY-shFKJJJuWIwJ+uxj;2<$L|LX4dH(`23d2R}=O`ILdXPIjlS)&;>Nwzmv4)@2OTm ze7>Q;joqzB@M>Rla(X2co5eUWTbauHr_wXH4$Zil+chz3kX;*e%z=~pDcQPg zX8AG0r<~pUZEDOuvR$~PlA0$9D4q{Kb^nnr;Yn8I#sOyHecv9N&3NSRr8T#0e&=X% z??Or)ZJ$W)TSCPl`jpUWR}ZK0vKN#H7hBL%ePwkrN*iiEnCfgc>N3L60F?UUB!EPl zjbDRK3pOrw_hIA;=xEa$>WLCuzpu55jjmkL+2)O{&%AG;sG(yC!pRQm7lvj&cV$$+ z#FBkpaHm|k6{qm@wW+LnU@QFiVrKBcu2-6H`*`;0V}}mVoYUdIP(j04qqa*=BNIn{ zb31Vpo>;80V9c7M*TcJWtb`H_Z&gzh=`xpn+_sFpD>B@J7cUO(`KZ&0zzeEz($nb6X@^yAn)^`}xBj-O z#;Sgl6HB+0!Q!8-eA~*OiqPwPI-~>@7f$WnGYz&IzPPS$9{85^rcgRfy7i}N+?>## zL>4}g#nhe#pKaf|&)S8p`4>knTv}rWylT~|25`0c>EA9Zn#>=L!|2B!j|Q2A&by9@ znugQGnx^lX@4ESfM^r7eVX6k3=W7|q+y?%rttE$d9QfkHWMG&BRzNWhfxL_`-Z%h( zh&xI$@H&7z$T1FpC4_cx6#s!?MRx)he~}Jt1WP6WiPR8)iu^g%fc|zM24PPboi~^P z!#X49cu62!NQ`nb5`A;$`ACMW5pA)c{U{&?_(9AfY~&E93!J#neHcq)9+*@~fD5*) z&gXkiv&Z|6Nx#mY3m7%%B8RcKghJ|6yj1 z4A6bh6SSez5W`!W81;{yAn9H9(PoKVc5&SEPqd)V9$Q27Qa&;`%ZatP<|CJ^fZ8rh zq>to##x2$K*W`n(L(qff(QtVelI2_nKeaP#C3;duFYPxBcOe`?|I#IC3Ui6_ROPvp zlbpYuQsr>70kgHPK&xAq{k&F)Ukglc#VU8wvw?bCaK7gxZ^esysVn{T+2FlVFuv)c zcht!2y=RjJ^pL;SSNWR@6!bo~FOam?D*S4-J(qWqdchbP0E(um*S4%dH& z{u>-H{hv5sXXgB0Y2p7D9H{&U4p6%O69=vmKq^7Tr@{wyHYyd%x`d3|5^;G5aNn<& z_r&h&F92BlvAJef{afGeI`YcfHq#{DM_1EX9Zq`bk}pn9FgG_3HC*^I+&tJynVwm^ zy#H`exnlYc2UL2^(|7vgl`R{&R?H1O+rJN`+Gg? zgFB8rnWilxww6=0?U0`5t}Xe`KV6&{Y~M3`$qzpsEHWMS1S%?OnTrle>As7;X#~gK;|mSiU?tVRnbPLN zuI!4)(#KBT!Bm=HZ;P-x&5f#W2?#B_7Q z`JtNHZuK2vpyS@k%HQix=+`{j`k3NIlpZiN<#3=pBvk=sLC||)u6uoq2CJtHjatyz ziV~}dGDD1f7-qg*eH^ccFoy^DKVy`3R(p`AfRv|QjMc~j%2;f#T_Yw^Aq~U z@IjtCyOndC4|!1SI~5kqMnn17E=`?^iSn^iy|n)cpN&@JV~=Pk$P?G;;`Y6HEQ;9V zDSu#-&)7YYjI8xoc(BTGK6@r$;Q6yUs{m7heB4hFc$ z7?|@3SoZF&CT8deGR#D{1^)dtw$UonCSEvd*}k2d8z;mq*Oza`yVoy<`B5}N@4k&+ zUMGunw;M@{Ga*ux;%YqFiU{BK{|joRse9h znR&m462NDybXFS% zwL-g$lEI!F%j%lat?$-sx{x`|{1{~tbpZNuN?XbkVl|Z1AUleaM7usk%^he=66pea zmV_A17Fxpt?P|u7tvabA$P)!3@%wo7r9V}H76|kl;2l=uy8Z*24pCg1PEp+%oJq!c z8P!7X&@q&|PBQPbx1j9ZC+-1hvr++>`8^BzwFWuk-IS)q<0K)?34o00ZBWMZ5k?il znwY}xJcS_agUnJBW{;jzwr@WY7-MzUsQXhI0e<5d7)Q!kwFbcvx3wcQsCu1PS+u#S z!19+IVC<7VxEGt!xJyl2sWR5>cGCA557ZN8)lyRjbUi@e;+h`7j~$V!cd%TiDzn@&6{9{+Yc@4jRXMW(xKKYZ@e+i9$L&-jS89h=;x~3&svus&^ z+7Br^y0N!CG8PhrZc)2Y+=)XNcXFBrfBbcx#O?NzH#l*nG z%*epR&dA2d!OBL>z(mf#K>p88*3S6;QGJs!A8eS$MPR0lu&$p|FJv&Q>>EVzr;CZ z4|@{=dU-=jC1)EbdN~5de~i0g7LHEN1dI&q|5;o{z`?}w{~QL3RW{`|1rU5*)uxOp zsdBnKY@{Jjk$}4WDFCHVkNY{K>rf8Hb`;K5-CS+Pg2iZ``e$yY($k&D4!0pNC?t^g z2t+`DM6mvXjDy$%Dl+ahDIKX15W{K<;|%v9OEklQv|8TJTm#z}?yo#{=*aWa z#s#PE-aU5l?&EuR?k>LMf6V5we?kM=oGyxg^6X7P{gWF!t}^W> zH6)I`%|9aX=k(*p*Y4RduZU<_RBJxXV$r+}DpLfw^RF8DII8PhS)lw-ppz@PfAXw$ z8KrjuzFU?p^xB#CckS8Z+ior`6AXN!<6GChxZU_;%sjcXv9H=*1szx>qJLgJ*sC=w zS9fN#zM!v5w&-b@&M7L}4(eRwby_xO$%!k^y@e+2e3i>$lKo$9Eze%*P4iZMUNz(P zrmVJiD!Y~azd!nX(eu6Y_a8rm)1S;p6aK{}b!6ZC|9v7C1ovs4+TOCPe*L+-UtUj{ za5twerR$__uCU|+?Z-8;@8-{S}a-%GRoZF*F(;uJ-G{u{zg7h{$~`rbD4eJ)PJj2cb`_iWdCF1T1Mc; z&{ZoL@626MxFv_7^l@(eilpf1g77n9UuVtxa=uFA`lDOF)*1&*`n$&LUrmkSvg}WH zk3QgkTNilsT4=AE{*}spaR!zB=618(~OzN&V=(_L8qrCICV&`+0|788KRN}h97vN1ZvNz9W z1fBA{(6T0G%6`VCRG!;diY_yZY#I@in#QH?nU|7Up%87LU}PT4r5~JG1uO}GSv6cC z+E4*_YBo?TC_leM0hnbC6oNp?)AALJK;=Xzq0ovk|nwMUZp|f486O#o?wPvaYQAb|q^GCn>D~L;YwficVake9s7SAoKp+sRjI_8a2n2%(0zo$+zyU{)VeBtJ zAVgX#F)?K;GcyoKIxI2KLOEUszyJ80e>X@NOEg4T>?;F}e*%Us-LJA@;hjun37gO+ zXvXkRPKj6vD17}yN^1!mNzEo^HVeRrGlMSRTKvM8N!N^|0C0 z)arOkAK(o7cJN_lL{>>>HE&oRJ?6Q~LQDI*{tElD_UewG$AR2f2h&~L`u?baFD?>@ znEs9k?K$|_={Q`SJK*9^@qkUClB2q(W(s*+YQrx?(&XU_9BQdvT5(^sljp<-k^-rZ zMOEUqjzhE}HqP?A=YDAK*jYJYjVw<4_T^$IB%l4pEhLQEHatOpoIvFF?VhWNAm<}! z;k!vKrO(Y(3Em*yqZ1C;)MwA)L{wA+f9M@yI67#JZ-~xcFj--eI`Ozc_$yG}A{c)_ zH{@{C&`<-=&BpL_APHkKZiG@{W=oL5H{1-k%oYA7=*qzPmA3?NF<&s`1CoVdm%hA0 z2>6acm@C2_iyKpeSz$Z_5*qm z43`r!!OaQti0T8zOo5#;d8G|A6Y`f8-ZjW)_0pa*18KYS_QVkQx)7xoL;3#`cbZUYyQP=^^d<=T2y|0@2M7v@~6r$#MxBgw^mz}{TQ`N8j$R5ZX z&>Ud6V%?KU_0X?I+DA7T>tnq|*NV38Gw4BGEwo2=cWC8Zf5b?BCIKUfGOoThi989GrY^-84KwV~UUM~lb&7Ke=a6ypMV!Vez9}C= z70!xfmwT6emtq$+RepwiJ}z)@ccX2C_DthU?aYfUEhURUiAmHZUAta86YMDgNq>JQ{r1GRz za(Z)e6jZpFubp%z86P8A1!d`_9r7s)uB7W_QDsKuhGphurDXAC8)eYt{1QxtxCeTM z50ZBiJSZdLrjst?M&kr1y%bzEqu*N4_a`$Z@G)OYlP1k3T_-Iw`N_8%`6`O2{FI@P z$WdJ_?JB1fo77}etd>8`U5mt07}TZLERo-h`-NOc9p5c)tjX$?O8LR#gT*GwChsQH z<}2K!@NC&E+4Lc7jQ|F{ce3^J^->!7h51{RNo6y+SJEU^W12B4LitNYf>l3%Ax!+K zm@Hu%jr(}2%~OsylR~RACCQ;tYk1y{CmB(JTjip?U-`cLb1q4qL4}VL{0!T4*fdW$ zM-x)pkhjLK(mRd3AJjlT71~A|HIa&qE3hb4sU0V_r}=(=@_iJ19EYQYLxcljg<2B) zHrOM0G1!mDis&?|H0r2|w#rq%?X%15-fSOl-`75=NV1d(`2_{n^ota4_IDh(DGh03 zDJ7{vY11iDHM=%Su59mwU&8Zr#Kb+MZZO-8|q z;TkC#nTZo=RwSQ%e(PH1*^EG@LQAII|eUy)|d_Fy-sG}}1r zy3jP=HEA{rI!(D^H@UQQAH6+-U+AAHty0jP--Y6LCxz$Fabe?l-b76Jmv2DGrw|4(WX^N%0sy};;Y;Ac%h|HKw`87GpZ}bH$cRuO&bnlB9 z35X8J76|wo$4nM~y2Mk^QoN#|+Sl2yon2laZ=o>h4vI>MG9elV=Ze9Iri6n*y*uxItXs)N-wv`je`+s$Gq#qwAS*xT35`IO{a!rE#hB3WKG5;IEk? zmx8Heq24Ey(MSWr_0*Zv>D1%ehuSf7IrBFkuI+v;)mcobN1Kf)rK_ahrh7RiI=O8` z+pXG^%p-k9U7o8|aM62e7(7&*S2`d+2wgta%MvlPTAI&<;%hm_J!{-nI&hquRwdUY zrz2SW+}v^n{~Ntp2<1Sht;lhFyDPLyPXbP2QzD}GVNFly^^^AL`md$pHW->h8mTLj zE1E;1zjn3H;w9o%in~2f*Dxd>Mryih8sWJ}TXk&p4ZT9`>DFVvcU9z;sa7}|ZJKJx zPutfUxadWBk7lLac4LNwME@bRs?aEAE`4<8yxIxmE&37d8FhDNmSUFLpT%{(-_<2zzX_-450Lg=^KUy=7R}eRJZiNW#bj#< z8u^Hvi4ID1^*%(%B|E+yHBfBk_oBHQ5+Co&>eqs)S~|YmBWc?5JnVDn-`Be5_DQzY zUgY+hTH9*YJJ8E)RIqcqNWW-&{&=Q$@4qYDPg2Wg;5K^fie5?B%5Bc!yqWdbwtww$ zZHHb(LP~r}TbE-*A6=ki6wGA z=3407}-dO=6ln{h{0rf7W|LMPYE}*TZvm` zwSIq}rdg116x#7x4ewfRqDIo!?V^^iMm)v@e3EZ$P1;Y|M((l6{*c`X!g*)t4(Rs0 z)%5;#_xthh<@q1gwO_x4M44jSlD5=ngpKzXJlfu!2B) z#vl-H3J8R6pYcP5A9w@KR8C49^bGm?t*s~?ID%*|t>XmzgnaA{)X$CU3A})JmQj#^ z-+_WfCnN@C2z3Eh1j&etsJqV{wE1|eZTmd=4W8ACkeh{Klgf*S{-mQXv4qagm;0z~ zl@VicPY{xaE*81H-Sm?U$u!P)!EwIF6WsqOahsqG&^O1#`Wvh%zGW3ZdN>hV22*9EywFAoQGDjPQDuM*cm7lW6F<7^WmsuLqld3vksO!AY% zFhos5vJgZOQe%mO{Vo>?R(-rcH$5F^oEagGR^Dc(24*y9e5=<<(a$d8bY+hYFB_&(T0=3;TwYaDSLXI-aQ+r4<=s#x>N2}my(^GP?P)1@#m+>oZ z`C*8z1=AQJQkbt{T64?66fsel(xhtlI(+UNc)&AuCk1DQ1Y%&Z$d}WCW5eX?5PRR= z#K#Wql*pes)Jb9>D1y$xDOPK%8kzHtpm;m8S8J1^vEh_X(W6+)5y0r{uxW95sI|h^tX5p`)1jMiyO|E0e}5CI z{U>msz$OnDbIAME`GPw9ZMw?qc>dW1$Ek z@1iN!)WJUdK|ARvSfU6LuoU3f;#WZ$1Us1`U@#j}p5X6KZEWB#BxA)@kzMZ58;_w{ z;scVN`LKJ+hB4JxnC*1SM7!EpqSE4jY@#tlLjy?sQ9E@(L7_RTO65BbHH z11H9Ko!I5?QgD({53OA?`S=AnBG%AP3wsBvsgxJcWB z|Fp5OEC0_EV8_!o_3p4K4nC)CqOLa9ARMfq=heDW8Plm#r}CC4kglWjM34Ep7WhvM zp*CE9ryCh39ZC(CMt%B?Gf(aV3s^w%R3o}tsoWNc5{ojdU(*o!-!)g8MygW2?T&nIq_0F=UMD$1%y$4Gay|oNg`am?GWwoiF$d#^y~F0b^2tBhesnjSX|# z59wI_<9o`IVbTiowdEZ=M_=McmqG%eH(W|(=v4lS6pmbnpRDw}L=WURmy2x5fQkh^ z3alo}5rDc6^bV1+VNuEb&N1Rm*Y5zYpA!xfq}+|#hK$iKS$=t4g|Pj0lg`aIeBfg;x-2I(T0cqF2EH=g*-*zU?c?|h;~c-dnw3QQ99h5tOkK-ooJ=g)Ici>aWrys|9);wylQsV+}wO& zFqM2aa&|v+Fnb2;qu}l@`-m92Pmh6 zEVAXycp%BmYgfG>fyF*cTh3#siIrl}RC;H6Q9^M@+4 z3IV(Eg}osRsX5Q*VPZ^fh=2ob0q}cyG~&jxYYp#e9m&i{#idnx9)L~#ven}Fd7(Be zE&YbDsZ&yjL=a@?U&xoJYN#m4NB1wGRAS!Xf@K3md#Q>6Xy$w(E==6XsWu1rQ(RUi zhYqrBT%Z#c9mjkX$2VwPZOzcKAp^Ss!Z43JBHOCmFCCanZPQFCLZwFbR< zPG#Vtv|~Osyrsky{2vCy&5jnDeL(g*6BON(c~a+7Ch`&ZEJr*(cg|xuVj(EDje6N* z{V^|f2(f5U(}bnEAwO4`kl7lFSn}ZZHEJ}26wEjQ7IP7wSB>wzt;NrfWY1ctmAUqPDstpUlz^L@^h)w5e+*^0W9 zn{7uwA5$DPm)voiudZ*E$5z5o)#L8NdCB|szqJI*OV;dF>vbn^w*++@s(cZNax-S|Bkk~}(_n?$t7K(= z^IS;Zc`?Coj8ukp;iyoPaFgmGsC`KkCSDocut?fKhXI|U#!^ds5pA54pxQ5p+Mchth{br7p+!XHS zj;Ln+{FceWc_LmiSh^G`%soCDH)G;EzNmy5&M`e3S6Z1zaIEt0r`gHW4$J!i_p!xv zft}0Uj|7f)$jCMDw3{D2*`0Z_&)VhN#w-SgU$+8ZwEX*_{3oMN;GNUaQbu;ixyfpb z?`=O}hRjR;Qfuh2h<92#Kxvot>W5-1;B47dfTBaQ_a$n1MT4vNqpk}dpL}NX$Bw>~ zKOD&0ohB?iEikol{n|$H&b!cxaRt_SSiG)}G7p@2o#biN zmOnQx&TwSiV>4essyZR^5DnBM?xw|iAQ4puVW4D$L7n)l{0YN*#g28r{&A&<26cY2 zc*s9(O!TU|wHG$7-(8 zZh6D!{z}2H-TU?dmFWG*!Ol)-Npja%CSO#o#rS)_W3T0wK1)utw>mZX{kDxnA4gKE z-MfQPIj9Kthm%>djWjhsHq0Nwf$W?0?+)i1mAKMJk=>3KcnY(A2EwCnu^6>`Kb2~f zZMEoEj%bu=8o+_drg@#N4*qUcFJ){0!ydGOM$4^Xo?$CdTaQUpJE3gJ0{#RR1mkb5 zYM&wdj-iF_zVsr-QuQ*h7}Jak`VW*bjS?m_sKcXi%D%u(*=}H%cw}tkgw`~@>iINa zHD}X_CHhjEmzVd#ZOLOhsz@n&%wsFnVs5rVZ(9{P!0WhecEhzLuSSZ@`{ZZbVv8HT zz)2?zewN?Ut?TBc%l=HW;L~Z0o6ytEI*oyWLF(BuPJ_)~)jE&!Egg{kO6QmNm$J{m z?VU3+FxaX$Bp)>Yt@$7~xgH~Ac-9GnuJ67c#icmpH{ay29>lEIfFtm5(p}gcf}TC~ z3E%Fe4$Bnu%&DSxQWK8LZWexmV83Ulv#anbL|q2 zZOqXruUX%nZUFYa_M$HgzX zH-SMc^nG{T=t9JkM2%Kcg=>%-1(q{HB2R6z&~(}r!P0KI(B|bf*)Q~TYFlucPKoi} zZi#>R&~-l$F*G_F%|}9_Hwvh`&w*qQ-?;x$<~BF~J-JzrNd~`;U?(k_O05NQ#}qV? z8*9vs4XNx%2-v}*-Uo*b;e~X9g{}ReJ=dwyv_sqmzX%}ME_M<4-Gpw{8-5(`EW|0< z2~ysGijYjl0`9U~I%FakuI9g(5TlWbAssbpuu0|9e-h(_^U~AP8;kM1$TI~sJwM%x zwHw{e&s6AzBsSLTR&XrZHu_%fO;;K>!&P-Wd48EcoPp`wohpi-yQs{|6MLSn@^wK2 zdEX8jwPPH$xwyD&gN*O54tqa;{+wprC-n~^nc|v)PTt^3iBp?4c6F2*p?;%~=qp9Y zDzr=+;3*}33j`nT>Fq2n@YC=jm7KosaegV~x#ij*Slsq}Ln`?kyVU;q@Z>?i6t*Eb&PnI56e=Q<#sGf5|NRgV`T8`WA&wzZ1=CByssH?Bv zWYTZ?UIl~~0)H@|1(#U^k=~KCch(Cr{AUBrR8r9!Z%qBVtF33>=Kad#i}OzdiiyQ! zu7m(2R?Dp(P7ZWcz3w6}x0A1I`kB6eVz0GgQ4>=xRZD_f8_Xp(6`F-EIo&SRqq1ok zAcPJJD%Ckl%!g@lJ4VasZ(MZMThItbBjz@aMcr3E)@!mi$v&%9ef4R%-6uYA*0yOi z_(?f?vElRlU#=zh^?YKuL=;2sQwb^%u*x!)v}+=iU=h%t7PqRcBh;6oC4(o+UXNVO z6>i<79IEuL&InH9RFqq4GVBN3(}s0kO6?`Ti)w_O&&QuSTH~Ekr?y46*A~b|&+9?- zFr-yuDgHz9hS})&Z?7$s1_8uyJ9WXg^}?m0XPyc3h{O#Jr(NhPd*w)oV%4NYT((hYf5eWNgzv2JO7D zr&pEo1B;uDjuKM^;SEpfh$cKKTI)55sDo;Z?&AvwRNG%3+w5P zz<>9lks||8s-$yYfopQnKo!7VncU)}8yqaevW`f?F5g_j$Rn{veIO;0c9NncXf!nX zlbM~l3+2BArL^!~_t>9{icf93tuJ;edk-2Kl*{}oT@fJHR<0v2BpE9zLtfw$x@b#9 zS9H#vgf1Q?8;v@=n71P0EdxFeo_PRU3#;GCoz-nyyyIn7W!Yn@VYU*NC)Da-(=Wc_ z?1cDT9l@%dGwo;y8~d^lD6WpH3+zN90wnA3AYlFQt>UAjqrs!UlP>7gX3eo5$!QPiiobd)?4YcNsvP78~ z?0A>#)~AQxtp`w`oz`DMr5cu1<3;-iN8>}ILnnr21BcIRHF0d8IkgN8Nm*UdNqBMG z5=;1wTRF%B&`9|S9K3*qz)7^y8GM6Usc2jZ->n^70hWTw#3?>ip-0ct;(7UL^m6#6 z_lc8EFyEP^R)ZHqL;tn5*P5ZcnBad%FEd?3K!qJzP-wMyy~uuU3J@Y=r4A{-0ykx{ z{r5jS;n>>*$&dgB^M1jjySdti9sWixnSt@hwMF1)`dNz1r>@(W)!lzJFn5daaq~fO5^Xlbu4H|Rdx;hx$+m-jcf};Pr;}}l&=q`ij=Mo z=IVzLK|+taN<|^_OG(Un;kNC!TcphkWi>1zXe8_h3(Xw)tL;wPit8CXPInvQeGzl> ztN;Ta=NRXoLc2*{3p$tdUME^kK?Fex6Hi4Dy9$J%$WVvlcZK!1Q{W`T(y4{j_vYrD z4tcx|vk85({grjl6Pg`h-?h6(K^AgVsS5_2JYL`2CgM*;W~X0nz}VDuVtvZx^1>pk z<##&jjWRz?(ee8!&g*qQO;6j_zVD{J;iSFVmF4A}uQ(pKKF_H$UHfy}ulQ4_H~oS{ zTuJEB+1TsnQsal=q+EO>@5v?r#X0tTtgNhV1AiKy@L&BgqxlJjG%c&m+gXfr_10Po zsEZp*IQ8}Qy?Y&1dW~b37gI`&**s3P+hahMv8BYipZtWEGxWLCSf`5NceI^v_-s+{ zp0(%Q{--Qt*O}LFbsf^BuR)ED6@oDofTCN{uY5B)2lSX~0gcOuel@OQEfu2JJ~%*g z+I^B-UC&oa%!u9k*+WnZ3H=oz6~Ik0@sW^_j+&nC_Ls@VADf(AgrAQ?=8D=b?rW!h zR9;ya>|X9bk@InMr&GvRi&QCb?VRqiv#+EB`!tp3UDa{B-bX`k%iDzr-IU>mhK7vM zbT0hk#g^HdAQtZ&F^|WAuT-~?F6u8(xOFlWxlA2a3X%gLFPPjs0{4ar?PAs6&4riY0 zXSN+%jKy3JHYSoCFALtm!(|JHqKotP6`JS8W1yh{uph)Qahi2J?QD~lyyh>1jxOC& z#;mI|tfizvo-SvNSd@J`9^XEq= zKw()cAVs9xeGOGWn2!0xnj7puT8lNbAsTQ-VGdNU)4;QC01#~)m8f#ZJZW)`m7ux=U?7J^y+PLtPj@l0Ix{j(9zeNWD)Wl1)qBQ1X zy}-g%-0k1$EFxwxNIcAchnjz)Y5p@~TP7`AvwDb}ar=Wff zjuaRDgjGy%izC!#?9R}~kL%6$j&u3fc%+SzT(26_SgRo&;Mxp!^CxiNsMe0vug!qppr%J&1kQnHn^LE(m%L0cf zKNx%fW%W9O1;+y;+?XEU0}BZ4OWkw9xJ3xZ&n;QhWcw(9BL0k6fbDwAjbg;Mk`Bao zTid53Z%BnIs>LwDpXNX72qaeJAbtFVgDzZ;Q1%)dh=L=Ehf!Le$wGL)6rRJsmlmG~ zO6t%j2=Q4Z4p}6qg54LkLy$@|8<7A@*J!p1PE!g2()5dnWtl~?=JzJf=+`?s(WXBd z!9J>(t72xE$|NYgL?*ED<^SGQonlzMgkm9SL|o;nGCx!jmi4f9fXR#?sO;f;AFt?HI<`-h(AgGt0nc} zPvYvzEPW=}Hs3Rb<>iT>bw`wN4$;)SO|Rp$S2@!l>`46YQ>`N>-(b%j1JW@H&W+=* z02K~;h#JA6u9#xY($CtYe;%oM>sPrSm9uMTNaNC~SmnJ#?KPvc%+W^b;YjXg;BDaP zyo5YbfRa;M=Wip>#U8v~GU)B(3Ogwir?4v%DGPK{=lR5%K-3jiMNMOAYx~}NizAzj z8PYwTZ4Pgzk8TAKy|+n89WtByZqhCPfgjR*3Vj$#=zXC*w67gyW-oP@CV_Rvn~T4x zxlPMZKKy-iswz4vza_~L1S^BMHI_LK4}!oPv4AJ15J_L1`{`O10E^qiyv_qFt}U0R zHf2D|VD~;9f6tkB*h27}aCDRZ1>XoIfxSp9R(8?==#?C=T=h;R)g$zyn=mrJC5AK@ z>_e8Hmj77(G0x?+Q@vcwH5wkueR4p#PHkV?=lOqeedUyzca&c&xmXXi&pM?dRiC^v<9`68+RD~khxxQdPkjuDu#ENDOT}V|tLGHp_ z`qd{8ai8+w>?MEVlr(qiuxA1GuOJc9c7)wVdx3xS({UKG>8 zTmThrhqM~`!>bHTOc&Iqd=SPTb5;vrV?t8WCs~_GYzQS02B14U=V;{JYo^`TIIGNv znd+j35)Eq#RU&lBcNOT)dJF*PvH3uIg0 z_8*Be9>}PC@7JwQOfQL>=4!beO2)%+89jZ^;X&sqM5;yBhIXUH%~-~WFsn0-~VfjgHJ-G75(|T)@r9YHt2~| zfZeHWAp5<4IX??KyAKGYWCRE2$uY4%)FW*7KI571Rc4W6^-1m9g{Mn2Me|R!wu`*8 zKV0@Xn^VLfof5{YGIRcURr}|3*54cySqut87J9vVzC+}^pBVcq7Zxllx2!UAAI|uC zZw%H^^m*e0zbv8P$dh$$tod%pU%|q{f_9u*2Qt}1OPsvES`&yL7sxw5P@q>tah#-+ zOmTnxM=<+^L1Tc+A|BWWA$rpsrs{pQ($Z+oJBqz#yFgbAqFXC61Y3MnU%N4c$>>N6 zIEqLe7`ikaD)%+V7muzTXCwx%&iU?e_zVnOtY!*Kovh9`XDG*^5R8cG*x%fPoRT-WofZ&P~T%Km-$9w0Y06 z(ClQP+UiO|LUIR@!Z-mXEAf=Y;D>Y0UmHXBla-&}9@&5WotVmyCG7}Q9qeqYkpZ7quNt?7lhJgME2Kqq{3kVtCepQapn#; zV2x>v#Z}RFp0>fc-#MRnxD32Kp|xqjSK3_rls6adj6+(7>FMdT!}}LXimfG_LQOTl z1Te6WX}1Ck@pxGRu*5V`E`1bQEvne60iXMfb;kMUW`dpR2sp>39z%kv7%PkY5K_n_u(a(y-I zTuVDy-PsGTum-MUSzdxvz2><##A%-5bu(as5>~nkCPu8ExVc|G8 zH|L1=R{zf|fJ=aG9Sa3I`mta6&GaKMKsk~k_1IYWN+orMUERUHxw%R4>Nl{1?p1H= ziXc)uEjh4A$3gps0!MZiR7z9W!Kb_-$Xf#ZSsom6DQ#tvrg%H=>;5 zYT{Yd!h5vVf4iOdea#cwi@I=aBYc1OF0tt z5j)sXERA-;;~TZcaBiGsP&4BXhx2WgT;nt_wqiH9v- zf-CPXE~C|JY%ARuSBa?%8&KUdN15!UFua8E6=Sg}k*6AoO`@*nO}jUyRN9oTpCYr)uyP-L_Ju+0M9$*KG5dEZ9gy^ z@%S5BTQd9V6FJe62nnsxRLnk}+j?b(5SO8tHl(7y=tQ8z#Kc15;Addg6uwD{0gpz^ z3P#e>1tzceyG7Y(HY|VcAyxchErR8BqwS)nWE%^ljI$D;Wc8DJl~bq0LOKBc>jftX z;08a%SS$dT?Ago}^iV4g83r&`wVJ~E1A`7c@ax8hTT9qk?cDQQ(<;)!sa^LkF=U&d zD`cu~!BZj#Vd4O9Clxbcw3eW12zw8&IjEh*LhPOI<6z}E*rJiWF7#^dFRMYY93 z*T3XgGErt`MgFf0qxwUTjN87`{(O|{+Gg>`rF?O)^O*%cv+i%FeiFB)yhodat7@9x z%K)Np`9da4?|~`f5g@+Aw!H;P@mD9HKJvAA-=5vd79A=dhh6_^y+3Mk;^pHr(ylQd z3?>lzK_<*20Sjz@>b58gDu1;TE%F+m7t>Un@L&z|0Qsj4B3sL!gmCbXXheHpJ1B~) z);rol=8JOfy_WLgbi~Wnop!GB{hR2IO9)DSaIG-DX7btV5+57TbzYG|S`McB^z)`G zvo_uIDPVr|2*lCw+k@}@VWS%(T#Np@lDaz1Qu|!{`H0KfNneW}m{p<1Z3cjRXt&2! zE&Btm0O;G9sv9_=ihu8VwL=?M-l$E9XJY?@Z?m0bdmn*Wb49Kv_T+2iBUiJZi?%>- zaT4#0np@*7)E=d<;m*ntD#uUaoHyzTP*P0_hgbf)r zi2nqI2A!*Jo`Kdg#FWo}sJz5(G||vHWdM7v*pU;!j>HqM=8D|-`UtHUNwy@Em4-`v z9!zm$*6K8fcZvqyxGTXKRjQ>T7s{V;>ckI9WwqFm+anDY>oDrS9l5;ze{>e?M=Vr^wx?~P4y4zBB^Ku{sgKGcrIL3y(A>Y9L04Od24o3kQ)`qDlAVDQk z&$(GA(ct2r$`*G2(GUh;dyxFNOpS~A*q~y+PP@DTp%}I!E2w@-;VuV0H{E87B5mI5H!?xPV%;=m$O!%;J zof_BLO7YJBl^o*w4ltfuSk)Wi5dyXEnxVuLwg3u)hZMF-=fTNzEBoS{iFF3pB;^~m z+3)%L2sk+t8^w-I;+3Ilmt4@o7h}remh}KEjp_VjMwY%qMDXbS^ERy%^9ySL?w4um zN15AZ)e#E9t{0Uh|7$4g&*MrV6yuH?KlI?&3^W0r)rX&UbEwQP(f8FbGz0;~Eu&iY znktwrO8k_QTVkXmfT{*j;gA-I&$|SqA{X>;@UGU1+^>nNy||0 zl_Jzh$rA~lsF+~^F!prF0qi_XHXvabxgTg!3G^B$#yY~n)LC3A;$R#At95&;AonOE zgK2^**@jA`^*0Svj*IS3V)mWo?Wqq6J~`O(i|6iAPh2I{*K?A9#YWu84_E<_C{jE{ zDdq|YGCY_$ze~}s{p%w9rlsXA)ygi6zjoxob@CT$)&fnt4!}Q#_O*l_MwipXXmZVim2grD^9QgP%>(1kW;|Tw>to(W zKJ%N_o4v32S3)f}PIT1`+^a?h+6;ngHjNr5Sp{8yVW=~^9}aBvV1+fFHiTu3%%~UD zLpvt5UeVUpvRv|x7;{{23O!0~vTSN~88!a-FpF{VWcsx}$Pnhcf!6j%OA-nzc?Ne% z94+Vk^dDG_^jd&bI#wMEy$?{~NN>(t8K4NVZw@<5esyYWpkJ+W9JhtxS}X@Q^)JF3 zH{9%ajv4lBOL1f7FsTy$bgZJnAk7Hw=WRKOM;~8ifKA>_?J9BSV8I7XB*jNrAQdq< zHDPu78dZGJ$OICSfQu=PJhU#CA_8TmjuxDs=3fl%ND=D{HE?rgvEAk7Iq)&!JA)2y zVS(-z7@P+7!#+<06#}(-#3wNkh|9#(k|LZ^G^lFEnCI;1-ml>(j_+hH-J|&rPcQ3% z4_^_%_bPHS5N$+qdAn}6iBZL>;uxjOn-`-2q=*l7(5n?P6^2d}hK43-?pk;PZb`tB zb|uU}@ z3*@BaMG!&~JSGyokZH=m2W_>7I+upcr-PgEkKTVCO^#ZUmqzbT=Y`s57KPZltpM4T zJJRfdCkQUm=2MX}l|V7GLv)2V&a>dyR8nl6NlMOZ26RdsiZd#v3rX0mdU|cUP-Os# z(m-^_EZf9r0&?A(B4A2sU)VCE-msSCif72Ruey)Wot!6ruAlEjyOFZo4Dt!3j{T)D zQ=ly(&zD9BGT=8)pmn#Fx)m7OHYIWrU+FbWNS zXqTEIsFPVpFMH!Y9%>@WsSg+e1GNxhvVH8|Zn(pU|dB?D1a zA{8h)j5$mNAg~Nd?ZNSC7ON{GF_X&io?_gk#Ce#Qs06wzC6bm^7hudLh*wc`Fvh*S z*188+LaX=QW=V(pGk#E|q1H#kk69LuR~sT#<7NBTz+~*8E#pn2%F6(l#iL(n z!Z~l*sKE_nv8zK&RYoUe7c8i1b6X-49y2^s4MqF+Y>dXD0QS{FBt8xLn(1*bQ>G$3 z5Dp9wyECDnS+v7R*EF&YnX6yQ`Ff+D_udPvCo#=d>h^1}OWD%(}+ zJX1y>33%s!IK-CjId!!&tu_>D`TNp|4Qj!$O$c$sBpg6}Huaq)+|=rZ&6MSd?x2W1 zq$7<)%rqgEWpjSre%)prDY?D^ zc!fO=Tw6@~A_*h7Z2quv#N_}Mv$NX|A3l6+S+oU#0B0O@|t~tWa%JPlddPjECFqHK+|()|ke(fOGfc zcZE?`$C1~k->dSV3C?Flo{T{Oks{TSq2I6NMC;Rlu|VKXvkA_;zL3iJD1ZU>OnhFD zbCqXiSwc9z5_~-;FWitP9GS83l47DXS2#m)hhwjcBRhrgbXfnFUN44JAgzjElBM+| z;1p>0?z<}uS|R~^lpkO~c>tu6HHfI6DD=D%h@Nz?)Yh`|1)j9&&pg3#moZ5@+|vnnn@y24@FLDm}W`NGu5NPUJN=r+{JPuoy zA8k*8kjw#oyQ5}^W&;D4ILXb#33$&GdI6c|EyPK}mm>WK;){c51#ZVn26ey-%6j2H ztsdu0fI4Rf8QALzJ3Bk?KvK*ZFzt{%tibo0vEf5}ClF%8IxUmy|>?e`qXR=0MDey8tgxJzMXk z=uB4uk?)n$_Sm7CBO&DO1?^Xa=jB-1oX-Z|WTPY;e*#<{x05lx>L{S=Wj{Y@mM>?G zfQW#G4Xs(`QV3YnstnuaaGAzeAoFPZmPaSYyNlfn^O%nRuTu@p3lmT!GhzGzLnVGA zAX(>k@uVTq7$!P;edWi*+kLELJubn67Rh9qWiT`f7(iS+b7Lz>!(i9drKoT|)_3Nz z-QmSni@QX}_fwQ9L}Lm?VCfgf#Z&;as09inU^+Pin2q$qs!Re#x4%1C?oJz)w`@ey z4|*=rG{(tS_!btC_}!j&WIVg}&&!NTcwYZ%@tADC-doXlWLbXxunPI7Yq-m={o;JP zz3pP2Eoh->(Y7rP<{QSyz>C28uhY$g1Q5sj`9Pi}FgqXw ztyH!gA-(?9{BiX4HN<6c1aT~^ip%Eyskcr(g}AeYHzrCT(*`_9BMjMT5RXI1nXYA+ zx^#I1VxD2;BT1y}?qkj$DpJl%gr&S3nFnTK&6_sTx8g_iz|>*Y(tjxZ7E&M*%Xe&E zX^_I^Ho+It08JOf1+=mb1KP}`J_d_uZQE*$Z<=KqXnVfRwA8Xus81@@Sknun6xD9*ycaY}$zK_T*V*!%g<}tUu_(q)2oxlX}F4v>u zr!fJnf1B5Jp?I7NKxp+(-qasr!ufvRvb_{F{(~XdD(#B^%P0Kq~Q&bKb^$%ZXrh}8)v8u~oRVBZwf5?P}keqPomSLLyq_#cKJk`w) z+4ejYwx_7G_AI!`>R$80RZ)H0-cP^OJ&hv@{FakA;Ctw$WmbkgqXH-c-USEnB!10F zBL_(rS0-fPhT(ZAnBFI1D~RvxExa|VFcHXyD+(9B*2QQ2%V8nl;QHeR&m z{Z_ZGSkIu>GS}gBO=5I@r{wpWT*RlEGTG=JUz3BDp8d)4_IDsUoMZG&346q!sxTdm zT?_&Xv*F{a!Wg1hR^>Crs4JNfM}5ad@J6A?N$^nL3IV4BW?Nojsh2lDK5F?b;G`|jR?LhCQHZELdUx#s;M{pI-N)a~89!y)1ev^~+bMvL!K zRS91n|6Ifv$Y?-8L4M`JiIViVva&MawOi@CbTxhi>(y(xa`6pW**uA62Zm*iH3}sJ z3Pc<%>)tlz@47@xLX^^^V3N)_01W|Rz{`^}mkM5|#Gjzc4#h4nbDCda;lT&4s7%F>h&KG%fHpgT4( z&5mnY|F4f!>VQ?`+GG>H9Sc-b3##KxgjY`C$l?@7_jfS0oK}qVa$9I4Gx>Uy%Lkz1NGsr7*!iWAo)U`S}R_Rvb(@x@Nzz@S^AOv3}&yW&uf{QDI!r!#=Gh(<( z&(}(JEaB(yV={*qoEJ3QZb7?T>c33wj!_;LUr6O4>`0wtJ1<6X&V=>m)dVmXqe8lZ zkd!ZdHr6x$hq1qms_OfrN8v+ABOJO!IE19MgdlZ5TDqh|N~Ht=X%29JLxY4g(v2V? z-JpUXX@InXG!jbOwe|bESX zEsIcJhGI}b{AKK81=+T_&7)lb=THReTjE`2$uy#T4QQxPz#5l&vsO;@6_qcU2iMT0 zimYe&i~vj0I3t2;jsTVF^}&nf%mbNq&qGk5(HyWmk@`xIe-5fdd>UB` zzaK@(i-w=YfzD|W!i+(=wYCJ!c^5aPD$Jph2Iq|Q$6pFynq}Y|eI@Hx=yB)$58l6q z60R&HVSp+znWtaeBX4JpDZhng?-j{KV0v!R26l7_s_3Rxo&Nrc*PkD6o^C(wyzk#j zD*olk@z^%Vu;i8B4MGiUMi!0qP?6v5St^`H8 z6X|rNx?^Z(jduf{&e%Bwr%C_@c6uz@gk8%t^0ps5d08=9g^%o}&u+o1w;6vr9WG|l zvlF+bY?x7F>oNE31OTOe=X5>SbpcR5GG;7;+U0!PtE;!o*s;hrURj=R7zwZ=P)?#U ze1FHoHvL2nfGT*0{tpsjsZplb77>?IyYFs%DUx%$7iLqddFaL|IUUHS?kbMnxdk*t z(UYcx>fNy{RwT?z@s8noHP6vyLXYz93cuO+`^UOyA!0j#S zkl@srbies7njo=o3D>xYJA;qUZ1zR@ImEO{462e3jS!hb9-_Fln2uWenk;SoK?a$%3}qbOdH@(ofUW($HM zXk`9DLlk@6BHb*K6Xxb%$E8q^l_vR*AxO~&j&#T_6GsZ*{=r2@JHaV$SsF$jB8MvG zmNO!|V9BHAg$G(@4P^@M^NA*uRslud>-PIE6baH-pDz|b$7TuMOCLN=K zTLbFVK-H&s6~Cv$gRY_0y4f-LwKyROoQ(wR|G19yq=@`a3ye#xFH+Ok!hdKC5ov(!6YQt zF`spW=QRi_9~6QjBCH18L&*&Y(h5i5yR&EU3yjwLQw&_}|Ae4P1pkhIf(%L=)Gd|2<=rqG)slUa(Phr_6m}l|pNU zR9|q8aK5(XCu(zEN$i{u?Iy8RYHqbT!CZp{X5_9HgWLfz{fE92(&-@brJQkEz(&sb z@aC#`UU?KQTo(TVG*!azrSrn7ccKc&wzO1xfH@MLP*%?Q$Nl@ILb`;o9foQdUW)Q; zod{u4krB=bGb~2{PMev2ZUH2_Yl^H7DCLn{E!XR^YOq4i4pgrg-S}Vz|3@JeLQCTj z!_Llr+bcIFQnNW_Q(8Y3HBwWqcpjd-#9EdGBb*+;l}XIfXGsZb6KwgGBy6Nn%lR+j z9O~nA$whSh33B+FB&!A&(qS0oW);v%%&Rb12~a<#_D{>O|b%*Ukn*4Mdg&6Yd-IuwNVZQ)p!1_%fnz^GJ2(rL}FXryv7TMUNMD z=C9kKTQpoi0f1**i1^s@e?r0#>EIz8>#29h0m?m&^(vgT2K)YmZ#8Tds7OnupS}iU zQI>0IPe?x!qS?%|pNXn&Yr@=aiFhs+VKCLAxx7hhpg3z@2k{6(n}k8{79jn31MrR@ zo~2aw=zhkSKd1eEImFtuBLOFg<-<I8Gsfy~147^1j2w&BPgi@T)A9a)*1H zYt?G4`=^d`w&2IvFH`m2Ub-708kDi_`@=!}!pRAn#Ll4=P2gELhd_n-Rhw~hBCuuHSgLBT^O|dC za9TUK`?jO*mQlkjGR;1eyi2W_mScspr3LK~_ZHDw@_1~W&K=I%4g&0VSrMX&z(2Qa zz5eW%l1qvgR?^VWAV58kJFFKB6!lujCo7r(gC)b9sI1U7!D zSK#42cK`89lD5Ov-!pUYV9lud=+23s#Z8!~Q=K@H3zFRe^xx3>;pHRHxjZ=t2e9d{ z_d)He=ffg5(~O(W6zIl}#(nZcyBrzbU!gR89^)6_n|5cpy^MLsjJ27;Ck7oCBH~bg zbK8-NS>oBPr?rJ_e|ltH-yD4^$?><8wU3T`m7G~=TvxDuL-sW4V0W<>!pK_N+!lLM z$l(wZOC?DXY*K>ud2UgV6pMv-<7b{F6MG|)mXv+ui8EXLNqq>!`#k0)p||U1Nq)H?>h!JL>-_emm&?4BrD56T6YJIC z86K=j90@a}V*nVQKpT!qzooAoaeKB$o+|z>V}7n1glCv;c)i8XQBlA6tC{ ze>;;tgZxGAQEr`4f?J znt;OwF)_aI{(%g08t*~8R6k!LqlEP`eRJ0 zzrJw*l72`quJW7Q*!p~Y@WSkM+%h%%rfR8UyFm9r_gU}+EZ!+7;|YTob8cuBA>jF`0n0KdXaL$&vy=5lGk!PCCtREspe{cM z&?5a$8v&#p_PbGA6rkL&$(m)HDSs0J^yX@FF8bE$5RX&`9v*5OONOVGTv!S zQd8rJ*i5|SWAngBeI@>+uv&d|{A6{NZMYa>7=&s*PL)u>vz3mjHr_IH4vfw5zwsRMQw zq=tU*%6Ac>of_%ue{lp1@d%15&;yPFCG}bRPQVUB;kZPz-Ea~!K)2I{YzLMg3Ms}8 z0|}u2pV_7~>`)H^1^6d%w7h+OM*Io(wm6nozvZ%2vB;dCx| zK7o^}1a6>K_*q)r17qgC6z;IrpATz(%lL&^3$h8^6FG$ov>#3kr-4>s1!#Y;i`1e0 zz3d?tptF3o)hL^;QG5pgw6cDOj)9=Zsr!9EcIU)u80d>1n%3F$uR^lWm4R4BfxoQ} zgnG-KAASS~rmH|8B%}%rIEJ{W&%p!kLNF>|1vx&uI9>mo+HrME_R=4SazB5*{_JO6 z5|TIyB9F8m&%2m5I#1b0_Kp|(JE*I_y&ebB1q6@V3f7?BKe+t|0_V-z{Tg|vMm7J& z66O%p#$DN8jiD@f`fZM18HM;vZb6nA3O;-rjZz)jzU27?N!P7Wx7zu;5^f-Likxs* zHOVZD{5dDHw4Q{5p_^aL^Zox1$o7r)afwRNEr{Xt7sZCysefs>^GDD--~%#i0QYSd zKoI_L&~2Yxs|!F1a%cgW7J3k<<0!m!`2PcOM=^Oq@AdryMjdk}$P)lkSh@oM9E?a` ztDLt$gCs~$02rbHA%DF@ke+qU!&XEnv3|x8_WXx;D^v$Vc2iXTd&uz~XD>*#pi8IM z4CY^`q4*EZf$9olLhy+d?BJ&!^{z?CD@rI9J23f+(Ry|Yk2aP7o7)YMIH3ky2RRUe zga7Go>v-?Z>5Am)Iar^h?CKpI4$_WkiLT5qY|REc6U(1{tsSjiD$}t$RSP=7n4uBb~#)@XKJnW@>q_Lf82}! zE%lR27i=8pcXo0+^KLZ^zDf47@`ombHvMx=I$)3of%<~eU~o5pOY|O@h*tJ=&g}Ej zz1qczEEzU(;hLFh*(!Td*Lh4!_O8=!MMam==10R3OXcw2Ufqi5SV?Bo?ol-N}?ztip_2t3N-ty^rN!IE7_T%=Ow?9|B9o|zukldN7@bhVJ#hjgW zpWT;T9OdJI5NB%t{p7S{v3N+^jt>J$R+A2YUk!uk743Zejo%tjdPXV}+Iv)4yecA8 zlz~xP3uTMJqogpBykY&0fvN9C^^uLGyubI}L`8eLm;?b#56h8L^xLt>W2EbYs~?_n zRBti0Z9iBYw1LSm+{O&Q`>3su$%9o%g;1cO=I(Cr+DuBK`qM4mDOvL8{es4xS!+sJ zuIO-b;tNJY6`$5tVJw!-PcF|&z633V7u5K#`t!`oK|H;42>)LxM1B^8B;FKg2(Tu3 zsg~NEBB-B(pFB{EsC8|mm7>NHb}j zXB16Ntv`NCDwFumq+5}G%hY@^`hc4D*nVZzSDIGfLHFiVxL-|Elei)`&WolKTO(Zq zIau)Ltu=%=MDEp);1NneeF|O)7v^qo)<@3vqJz^<{*Lt``MYj8S^0-(*Mm`fnUdTj zXybeJngX5DB_Pg<^G{>bB#y^`8Ob@-Sm<*d0yOLk7Bmj^ihUkDJR2|x$aja))6=!N zvGO*D?ruPfffiLC9rLGpuHnZ+p17yL3*)gBS0y(MjerHy?zbY{nZI=&YdtG2tg2$> zp}S495rV$CfeZ1(>v73L$FyI+mg`2V)0q^=EP86?+uY7-6gvyh`7H!Wm{jWBmjmV3tChvQvKOF=fXuX);+1h-ot?=9qPrz&l z)GvqO10nQ`o$iLR_G)UJr~g5}+ShXIGhe(QRl^Z)`TY@$;i*6VBkf{%2i0iP1y_6% z+R2ASuiiI^$a!8{aizO_`+M(sn#C3=r*y-&@L;ZPsfYfuW@nOFyy-OUtJ0TRXMw-{ zHRJ9nO-RGb5Bd-anX@7aO5;Wy9(P>#2CKi9XwV;;b!7e6+9I8G&8e=|aJ96ADvxu$ zJAdY4PMhXGWtT7eACBL>O@bGO5A)uczqXfi^na+y)gph+SUh{=!I#Sc0iVM2`V|;? zB_u`(9le&B0>%bn+P|pLw`37W0{x2FVnbsA#_771yST$)FxY({K-SA4u&nB)Le_F- zYO`u81Adc&0y&rkWbd=Uf=p&W8zzbMtptd|58ZM?p?viffPOL_Ei)i@H!+gnjr~6p ziA~Ajr1m%B-Xxr9bIQF~6mV9&og_ggpCFBfe`at+#>Hp`@@Jl*!MrM1R)46td)YyE z%eKcIH2D)^x@8rfO==7M37qn^X9WD~^3cqek%1xFuD89gkj(~v3yP$@uF9>>?-LY*TGd)ypz@}T1L8m~25Ny~(oBNpsz;H?ta|)LSFU_hQ z?~Oi=?(!S<^#WXl%)jjNHux%!>kvvg`+EMAG(onOLk3g>0PEnc*nQgh$GrQkK<7`A>4e8nH2`UG zJ_B{emfy)@q$Vgw^UvmFo*mIC2Hcw7gBaq*zKz@$m@Bw#A5;a4bsF(Z73~lfiHrq z(^*IW8;q*n8@a%O{YF!yc_}ea`UmpvaUTc|%yq@^s`huta3$_;Zu+ zleswy{x$g%|BmLdG$^^sT%H|l-EVpl2290c*kK9*M->3S4M(B`l|(wA zV^ZjA$#dMB2kB0hknH-rhyr;Io`D|X{7NgA7WM~{F#nV?GU>A^uz?EMKVi=uP2^M* z3h=rpP(QBckA^|hj@Re=e@w>a9;u5-ivk2loe0>;0Tl$I)u5t=1JV58WAUpDkq3t* zip)rMs5}B{&e;2>v@!Vd=O$}%P>Y71rhBdpW>vs@g=pKjQn1O{*TcUNuL6N!ZmT{q zGuL4ayu*DN+P&#DQXsz~?-Rb)Y+Ygsi%rOIRua^3NR8m+UH&Pt@CldvzLGUGMLy`FX;H~-1R1l;gJ_Jk1Lv) zy9{Ba=0~-|_~vOR->;5unYmz!n&}OT022Nfo3c_d>AvCg|BW~UZG=Ljsy%M3Jr`x( zc!X!PJ4s#U`B$g#9j-r{fOieM=-Ujs92xGs0QqVm33b<(A&Y?%)?BpAzAdp|T(mZo z>wj;p+Mkz%Y?A=}uyM3+_nP{-xsq9xuaK(C zDlct{@bWcW>uNZCU5+yWS}{kG0dj;u21&&PyNAtecjjMQQI)qmj4s^v+6XR*<<|5F z&&5?I%jvfVh#te9Shj1@aBIq>@UAD=U5qoCJ6+m^l5fGvesLpE6mf+ktm2ukN~<~a zGEuGnkWngd4ahTq&uJNOeM~pdp!ixh6|vCF%JYM(pxgW7FV7WUC$s`dk>by1qIf=C z&l>&SKL=!?9v7ZULR-somvp0h?8a~O5!wHA-DQ!2`;&xItMVlIb+--&yr?ZvLRT2J zx;uNA9sAZxJ&=?%dO1t$5!`AxUy3PSZgSX~5YH3DJYgDCMAE&Fec*MO>g*l||BGw0 zbLg~@SA!k7ixLL#l$mXttm*I#I+}qeU|E}{_t<~vvo2Ypw#>uuhQ3cWNhCghBz{gei)T^pZG;GNCSqJt zNyb$W3Kn}>t1BD9HqHHM0Y8rZROE;jQ%(17E$6aCES3U! z96oqf+R$eg|7-vXe9Jj-bchWySTLjRKdAGGY(3;rOMjhuOxk&9;E5yl7O{ooDIvHn ztZE^9q%I8a=_q2C%te64kY-An9!!M(x3m;WxTfwzB?4gz^xLEEUz+xe`_p>Ur`0Q_ zN2DP!NrVoDl|u=d{;bLmP{g1K-evPtmhFR)Q=M7B^#jnkfr=A;&I$@b$w<^Z!G8ya z1SvVtNeBa9aBouNpf4?Tp_hg<9MR&1q)P@a9MQH~S>;)QAkJ&YS&R%zuSlfMlcY->8Fd3ia1=Ou4LG1vE4V?=|imK3B zh!BATm=$dl?bMZxyy8I=utuPqe@S3${%CT0mt#zk5M>WYBuZwLi#&2tL0*;x^Bla+ znG)!&d8qbrF3&O;D4+Sn5S*I2Oii_z1Bf?FVvHx56@iD3{{q%Pa`o!|+TDrlS5VQI zWTsqMU7?WilVNsHh&#TV$hIDkWJ30<)|3y>2{k%#g-m58Yf~?!XzB_o>(jtUOe0CK zG0O8jZjkZEBrb-zSQ>S5YpI){*MrQ^R59%oijoM;rA$#UUQE?hszucT>}%cUEgQQu z+0Ks*JnjAK3J)8jO)vM*`TCfr@#3r|H;);^Ls)i#;QE;&9lYADX>9 zhT~d6PMrun^Jo#~5xt+%Lg5lLI&2Kocu7&=P3mw8&54D|ay9K?as{nejYoRqLIRx@ z!?-SgPZ%<0h;XW#gh8`!tD@&V#bYZXMNJbd*VNv0+-^Td4Bnf=>@uneswT8{Uj{qw zR6F^!?T}t#rL(3oe-v;PVbf1;i6CDBdkb}>%Q1ozOn zIe@PYey*resYj71vAu4x_VR5NIz5+^11gbnwR>f=ya>30mQb7~q_Is+(2f){NqVx~ zEGk;k-9r%hKDlOE`|3YS5TM(d1wk(@_P%Dguqu0-LNWn&Qg6C*&pW-3TyI-B1DI^N zzAP~ZfkQ6;Nvqc2h+%kWA@Q3#oxz~h7x=nIhay;$vsC*(H5Q%I(lOzVouMgMDG|O0Cem!< z2t;c6HoK|ur_gtGeC!YDh_co6jgy6DTV4vmSuMlr(b}C_|CU&%#IBFOsm;&GWBRk0 zFLI*KJ~+nU>$M5*sVQ(w<@{_oTYPvcf~uq$Lx^-fneW*e?P>T?O6QTMF9gVM>UMQv!?s8HJ!8fZ)isjLun zcx=-HIBJSDt_iU{5}$fgMZb~rjq@qf1VN&3i#zNMpYqtUf4J_PPj1O{};#PU7qFM;`edPy_6MZ6t*R7nb2`+b#? zPfut*d)wQ=$D)qq<5>*Ag4f`axYzg8FWs4h(|^b1L+N_l^dCI9k_j2E+9#o#q{|H$ z)_)7u?WujonA1HqWgPTDqwU@)_8E9D@~b0_lc#0ia=Y78^|QjE|N9XVP;FAUl*QC!m~DttZ$?ZdXx^5p^&PG~9Xj2YViR5LVS? zl_)n(gR2Vl7+2r8USIkpLKopHaJNi0eU;>mOn##%#J_KXow{Gb8}vHN1SS;u8qq>7 zGbeOrNg?-{w<7%;Bm9u?0rrtrLwupfl(E8N%CUpZH@=<#w`mEu6y`?oe~D{k9HW?` zIVGH^kO|{7ru-WMY(tE7u1+1W*ehh%?NNpW*UF8!6HpIO^+~7~qZ5=c&)eZNPTR>& z{=9>IVB|}9p_=?MezQzy12Tq8=5SOc^tej_xe|upEuAbRnUO8a+&CL{GU0wYg^FBg|De}2epRu8+?pm7}YBrpL z!kdK5C0bd7!B*z!Kt>*`WuCq zP98HO5(61^X5H}|YqHa|#rm6vm03Z+J9Cc0CWj}(O7k!Cgq>0{-;|#!#o&u!;nN zu&Vq-Q-2y^8Hl79p*nOeyNQ7MEp{S?g3=*9e!{q7A?8S>!u2>NPEo@aVI6S;%1~oT z!)a}6%>vmW<9IeWipVLtJd^t0TUuhxL~ZC(!#D2WMUQjUXf$mAY-RD*gU6y|lzN~W zbg3L<H|=#GI~{^-GV-7PP=+WVf0TLGr>`fRpF5~x+NW3HUzydfO+sb_s-j+n z41Ln}OkKB!Y)MJstOhk_GP?gFyT@ud9zRA=5#u0SpJjDT^GX4Os!!>&yBPb7Psl<7 zfAxd}PVfKd6%;W%`BLfbm6iUtm6-g>^XX9a)*O*SQ^=NUEtQ)-=rTuM%~xMhvV!Y zqEo-_<=|@`MQd|Z#}E6usA%Cts|bu!q#f5Mn=Ce~hm_^^R5;_MbiO;eHTNG*0bishp$}syO0-dJx$r;MkIlOA4{YCX z88d~(3Sf3KaY`=LUPBA>yZtJdt|uKbWueBfqRZ3}(7iy>h zOYZotWV72t-M~yVT3bP0GXAZB?|&NQsA#!iUEjt#LkoJQa)7k3da88Z0{gHt`Xu^l zN8M;5M7jz^f3T?`NOoQrpnM@JtMiNvYH@~dk+foc>lq)OiK!ptR;6Oq+&>-ruf${b zLz-yychOlhm8f$iTiu;zCxd+(iIglUJWn9FQg&7B?lP)a8eZ_R#cyGNRA+nY4g*fh ztj916b|?NOE!&F^MGUO!?L-1*y^d?>e}!KC9{J4_!ZN0jl?t&*9Kj#2+AkK`TjzxQ zzc5(G4TKpwJv1e!2%-K1THQv(tyEikU9bCOPjl#qtAF%1gd1V6UxG%WEKB4Ad(@(v zK_;famFQpmDL{P4H_g`O=Q3hs|E&pL%#d{0MO9ce$-ARyho~uBmHQfbCGKL9@y9ukWU$uj^qD)-QwlWK6IA zReN0pT{FNE?cj}-T_Wl*ZZ}v{;k6(rrRaGpR;zBhwaa(I_%0h$EDYFh^sJ8?sMbuC z?4B-A$+L599Dyye$i?KD5($WR0Vz-o%+erEqZ9U&^XCRCcn*xvi0%?V(1qTv`8!~0Vx(GDdO zBap#ja_FiKqZ5=+(;kQqk1G=1h}`8xU=Q9${pOwt7E|iY#O|5<;>heiACtrVKWIvU z4U?zRew|9OOl%6oTx*RgfVaKp!tAJ_c9yEHWKEHu7oCW7ZP z5BjMZzckwcokyYSr%RQ2w6kRutNn|g|B#xu_AQln+<1E9}`(RD6|7$%qFfcBCBK|fv|$k>ZSNmc#;F<8HHn(9$1XYha728~f6 ziJc6Pv{%dkMUk^AY)(Jo*5ttBTBM0*p~=ytW5AiIO7*l^Jeok+qmg_hzfW6Rp1miN zYAjn!Kgx=fn8bcTlT{&8`RnQna_qkixRaJWd7)Y?(}?JHL_R@PDb;{;%ZSxu>WFyr zvr0O*?w)k2N$Si=R&x;T@M5puD@l*vqk@}m!QsGsf|-*yIFsB)o*Vua!+YmI~(87P*QIH9z+?2tSn2v+78(btcl?7Au$J z1EiOTMQcq?I8D>tU(?sh_nS;9;54l1VQ_NO|D7W{oH=S`7B1eD(LEx2im6mB>%$^W z+0_a$QDtrfhIOs98wi806gC@(x!T663RjCQ+?dc2#2m({7ppU!z_-vUXQPGA_hcK9PpQR0(KJ!!lT*2kh&IFFz^Ssmb0hCKMm)M zVb{>R(ywxpR+HM6IflT+IiWg3+uoMnRIP#LT&u^>iNcqB{Ah~hZ>cts0cfpuIFgR( zz)`cvqb=6aAi24@UnSiQV`VKDt+V<>UsAU~y@?0QN7_%xv7^m}0G|Kug+bO+YhICX zatbk+mhzrq#lSvW0ihGo;S}8sGTOhi;sQ7oTd_f^F@{CCRPV{@H5V*a@hJ6_5XN$$ z+1d!tf))Eb(TCC3KJQUU7wc2P3w&*?#4M;NYjNS}iKrI1qOSz}N>#+)ADi^z<2bne z1k6zF5N?%ELiWICaZQa3*SZZ!Su8ql5M}48+S8{;;EGbu6d*2mOFPb^<~Z%cZj@H? z-QFe{X;;J^L9S@>Q3ggLL}049au=OYJnc4k&!;)l4$c~VEhQ$1=C2oK1{&n_X~F6< z{Spi5lS_kJ*tnUb_G$(4QZ|hSTG$u0+Tx78l;!5!-fe?L3d!X`U|ErJa@_-^;5Vl`LpaN+H>gYk|r2U{zvhJqJM*^?}V42-I1Xz$}=MK{BCe@I;c{Vx?zwxV-258mSYjI7NmqtOWnLA$ogeS?0)3)lM8q{);&5>?_x{ z7?5P;6M;)LT(oXbY_2LlS5{5uCFOh3@Zm|a<8{D8Pz}Pe#@!7)`DF-zq&wyVoIM_s z%VmQfcq*PNW+b&lGmk9W;RnZKTI0DpOH@pZ#I#f~squqC#M8~%n^4$FX?e5p)`TLK zPRg+L+izSmw&k4btfL2@MFDtFKX?sHVcNPhu&ban=Ju2Y#JtH~OSM*uFW}-JA%p17 zY>FKY0InnujxxjaUM>Ix%yVQ$fi|CGQLV6pwmdEf^rHy+Pe-D+=Z&y@6wcmXfxWtU zQXIXYH%^=%w|HHBS(KVrq|6CB*rYYiWyKRgA_nuI5Og)H!d#Opq5#PLwV&>2zlxga zU6lA;tKm}iQZZZ%pnzJ6m z$s^knzX78XE5W2#d5KKTjSlK^XuTwY@M$nI)cpa{V#FW6Z-%b6@ zQ{Fx;lez{=A3en$U{^wF^rc`bmB3hIRPDUxsGQ_10i9LQ=pMM`$Bzn%O5n7Y9Z}-a zEin94Wx6TAs&=}q(pAuRwT>U^BQjvv2!=!})&4UyIUur>((a^PugoN{r{Lg7=3ozf ze7suJO0l}`+VO2JZK=eUSE-L{hm3xQSvxT2^B@1dQ%dWQJs%3b@)5&jRZ7^G$(c(B zx;M=H%Sz2|WBS(_p#qsbN=E07v@VYlJIH#QvKOI*Z=bGh+^IV2 zSb6Dc8lAgrYr1B@p{!?$lzzEj#C6VKU@JCW<<~G1L*2z4oAT@tcJTf-vm(W7^J;2W z6oI_jN_#uFBdUkfA37UPI5hzGNEetrh%VxDl2|Gci{?{i`wudW_mwlt83<$87gy=5 zakE4=ic8lxQk_!QJoyH|7-FMAW#F=Lh6MJUF3DjAF|s|q6c7}eUn|LWwrX)N%B{~G zgk;An-^@OJeo%E(drul{e5NXq->_@%WMR3v3;&)#A|(cm$xU8LYI*U&K5V_+jPIAg2+7(6 zfR?V4=eE1QOmOPNuLq%>E1TBiK{oGBjV%{0>N_s%a&Ih03|XoS1RD3rq&Ti;$W{-A zAwrR!io)O;mh#KJ?Tt%s2ik_fC6~*KdzI69!!J~&ZR9?l!oipCPt$e0^hM)5H|zAg zaAL<&=q{-IF~6#W#Y z9il*-D{Tm>X%?DUzwLZ!;a&)!PJV`TT_pK?bmVV91?Gm80DF?TJ%=sVbCV0JoynTB zg}0XYwScv}#9R0J>}gbExH$ErU7{uRf{z}7eID#qQy2H{HC+@TSO$Q~108t|J5t9} z<_%75l{!`%Kd_QnvRr%&swYLlLOIpXKhpd!i-g(rGU^UFGbU7!#;`oT!t>xm(@BdC zf>U_a(vJKU74Ys4`cAh~FcatCZDC9lTgS|P+{t*U8M!$wyf!Evt2BY6CQB{gwkf&I zW_z!fs#h^gZaeuShO9+I*c-gc_c4-#(0J)s?^|8U~TLcAWkXP zE1{YfcVKQrN%*i}O{4Xk67XPKV|f*xZ@?J45zX&Ab=69hjtuol;-Q?M*LUx@aI`jk zW7(Y`&Z#r*^+N9Ff>Y!(b{gj_s6m^YjSkyuI6{dUuDZMvX=QROB|K9(@nt+LJO*PF zZGyfO7U|N2mOk%e_Sq~RI__Cn%HQ$U65>)YG&z(2MVEgfA{3JvTpP_O!947LrN+*+ zM|>fO8E-u`Z^!aCBYxobXEc|I=TvLoM{&9y!rqsyBm&DMIsh1_Hcg$~Up{{=Ai3lF zTi}yx#c2}+KQtOr4gqcnm~@#v0@ve#4Zat}`0gr9WckbC6_|43{d^_XaiXB(FFH|$ zYrecGZl%*;?$@LKM2$L4OEu!nMA_3EP-sqd5Xq`=m>&iin2m;qGgTh+UIO}TnEvams!_^_{b16LWrm+>(ne5la?~a zjYM&~d;5}Q;hPA0X`ls|%U^YP*+Y8oj_+IAphcHIXH99>RdledL&||0T-L+0JU5=_ z*NzwG#erkqy{yChGqm`(>;ysV6Y;w2mw5-L{&hh^3x}d#g`!@hD@luDCd%LYR3lS+ zuQOZ6^yU#g(0Bo3$|=~qbtmg)fMY*Es z@bc$;e2q(!0p@d}Yf-VNSA0rKpKQ_B(&KWkJo zS5G5Xa?%bo-HF=qF=+WJBl=gQyU(s?E&FWi+m^O%sR5nh%{A?oy_##WizWGyl^(LV zXOf&p?Ae}%?*2O7OFn9{u<#F!*p6Uqm!?9jqQBp`@$P&)A|12=Ttv#5jCgn&O+htiZpbo4T}ZW_5t$cS!5I z`|8!Y)vn*vprdN&*xPg1h=_b>zO;{vV4Imuk#@Kyfw{7f!JN?Dr}HOjN1PhtUcDc4 zL&(VPk@B*@x&oxgS{~t~zuqOP%y=Vo?ehH|(;|@8+4*UG%AoKGGzHH{j(OdtOcckF(O(xC%%B=KB|0@BX z?Pl?Dizpu@Mf9VQ;kHEM9l*v>`BNZ`p8R7?i|3%%yrWegtj%or2u7p4SC>M8I;;F?Jz4s=Cv_Pj<)BpZ0iI%8{7s$VFjD+MEe4XF+|yY@L` z)_)Tve z(U#9#2jcN|406g`20uTeSZPby`3gJpB?mTWCp|9na&&rvKVw8b)JoyRdwE*}`;*^e z2NccCO81axYKDsDs0cqg?(JGA3K`^(wKlNr?ZGfYZ7FFQ56zDUI0j%nWG)DXqBu4*P!GEH>W2EU8IRgpB9L1(+s zO!&*&{!TxDz`!YOJuWJ6k-TTW)>6p}v}b|+v%(0mO4s{#=3W^_E$aj^M>l!grNH9( zrn*Y!l!sKd+!=dwKUSg$8k;|`RCBNTjrX0JfpCNqj0e|!ka|=DQ48=`IhF030r;lb zdA^Mi$^E{Sof>R@K2}FTj<74y^}4QGy~zn91+m4@X^$N~yDF${?IW)8he}PKeM&DM zy>M69vfJqJ@=EpvPtNT?e#2bG7P-Kg8ZVzeIq|hZ2M)%W?o{_k{O9&NTn8>dy=KZk z$FpHe12WA@e?TAcdSjPJOo@$?tAM^HHE-g#C2lHsug>GV#K$?_?uo`9<&p2Evj3bJ z9bQcAfovdg`I>d@5sBIO@|XL1f(PET#ot@^^w&I3UWC*bIj`pbIdzqJR55*NH9PVv zL!6)`fs3Tnj z2t&f)%1;|E3+c(@Db$=YWiWILobng{@_st(3QNS7GA#Kd?__Qk)VLMp-p6j{ByXqi zc3rQnI74Y;A?ZE+vgVg9(S`^~3$0S`D?)7{hoz_U42v^W;qfq-j;ShAUcXgsNFl~~ zej>zrCR9*r)!{`k(j63#w^$h}CtkIhQc%7gM@Q{Y(RaFTHlJu_t!8W|ngpzv^Kl6UR}M%=!Q7&e>e zgjx-6gP&qMU*(%#e0*>h5+sQ4*9GiaJiOj^S45Hm;LRobZDqVXeSnske_<)Z*7K?- zC%s?lVW3?6XBnB^eKrc8_%CF6SqPivePU@Y^1y!Gz@6Vh7Imr(Xs#fRXCE(K2+#M= ziDTS4b7_yS@|?mK=+Bl;v%@MnS#oEV;m=Oq6?aOVIj&tYCg!~a5}HEmUqI&w^BI4& zbdr0yJRfdKNy^Hc)D4tRgDyW~+)A`>diCEHa=xd}js@=-VzmAaTEY}Y4-GOx>nu~D z`X$|1!~U=*4^ytd-xQA22@hqF-Y19>e{H51vDb#Y(NM8g?$(em!jMrBEKfg@o=}|@ z0VLhU#ApJcIvh4$$*DeFuXkS@=W+7(t8*%DGzCuP8}X|_#YDuM(bV-<+{A=7b=IAB zbmA!I3%V^&6AH48XD*ay)Z|-2562K|+|#>CCFJCUw8?wX(IAE}yR2=i70E$PB+Vxq z4W*=8Mk4_y55^;5XOi*9hq6(}0V2;aca4*WEQzx`ciR431j0_pdhH+$XX+)RB!-&~ zJUazHf^JmQj1C#&pH%cjqH77GmrO;So4Bg}{dL-5ZhGBGSJXN1P;;xcVt~BF_Rkl( zu9y7oy%!`K(9vp&(GwdCiS&{duS=z`idkKl0@jrT&#z;_)P=S9$jO-BM@6ud9|jG^)wb|4hYfPzXV*3ySILM8#~fvnzPtlU%@=s)6|~s` z$K6(wQ!Ow0c(R1IOEE+`)nbl_5@nv7N`5TE`8b+7^S!!~8iN@tbzFGmys1}E8q-o7(hY2w|HOL-z6vk)Ny_oFt$VT_H5ajuU=+-whu$@WbMM>XvYx8U5)YU?=h+D70I1hj5J@5( zdt?6h)04a~&ymK`(-pRngYOc-%3hrr<38+2f((xZ)P~7)Fu|f)9U{&(FHM15$UZWt zKgjHWp3RpBM1EX*tivB~XYy=n?i@`;+FbJ(d82)2mK0XXcrp=A`}l0(v;O)$Ujo+Z zGbW>sVa=V`2E~j1r!-e~3uaQoWzTk=*!7RIwF%%G@0R6nWE>(BP|yY>kBk9(^lI}7 z>bh<-E|OO@c(_P`dY!z@aO*{CpWh;aZc1cha?08v!kwF#%gDH7)}}4)q2M=G6nL+G zHJc{bVq1Bbi_pW|e4XV_6Dv=fsa}3L{?$qrd42)xWSiHG(A=*-JQ6Au7Q9`;w zL6%ko0STpJ>5y?ldV?(RE_@4ffAzxxNzv+RCj=FFKhCqL&SEi~2Bse{HHbPPz2 z9fpfw@V$#7N(?KGOLv3~1+N7E2N9~=f0)1nlgeGB7w~1rvR72Bce!0tN!gxfZsp_st}ZbQDwpOxMDulvPgo5>T7eq%awXXa=nqGBgp9yQ`wg!W0Sjpc!c z9o{@Cs_-x`RVC}UcvxKSyQEH+{6BD&MQ>BvUi{2R+5Ao|GiIxFISRZL+gHr(oczM2 zv#UJ_X5ND-Bl4Ocrn)X62acV6CI<|?&mzA#$OC}do2PK4njy{}N9oq%nn`NbQKMIR ztgP~9f8G_(az5T&5(GV-XiLdoTMt zwyijSPU0TKsw_9(4MOx(;CDvRz88^Vgb;6XG_{<2MCZ7B#g2;h#plh73c7;=?2)Zl zvz#EJbWM!p_P1yLEivfSnn5lDmnNZN%HVw^{4qMJy!lDyyv^oU!_s$aQjgO?(j_op`XA{9vtqG8cQ|e9QN5 zJ7=m(9bn}6ikh7(n*mwTAM+{(xa_%C>$BgM)PPij*}5p|-a>IBSo+=WB%fmgUQ==L zy2rP=%_!Gu1DV&?+w&wF-dwKN)>1hxB))|#351gvtp#1moByq5PDU(yF|SZ=z0y27 z%{=z&GyZf_8 zBy`zlap0E!E8-=~xcm@W_W3Z^UlVE`UI7d7&8FUB(HV)pw|enRau2khQy{QVX+rnM zb){(gCFRQ)rQs$gAr6Y)s6kYW0kMJ`q-@~2q;K<37?-=)i1@A|wwm`s*4DYlBm4Y| zD}b6V3m`tEZ0-JYG`r0o9V+?+7`?W`g8RGxT03tA*$@cjzl^lH!biDmu?`!4k~pQg z6s_ryd1)l8@NGwYi3>yOLAYEk1@sGhEq zf%`9g#=iKC`k#fbKXw$q=Z*rO-_FzRN1=DU*_mNxH95CiNZXIY8A&o9HZI>4ad`si zWc!SZ&Q>#3b+wo2TQPBWSj)}Y{|+Z!Pr(zqmYK=LTfT9hoZHIe&_uq@dQ-a43WqvF zde6G;U5#f&`Ka$qp9dRV_+D_%Ms@^^)2kP-F&g$=Q0W6o*t zoqf_E;oFP(W#yiPw6X6}pU*J=2}CS@u2K2^wpm;I~*P49hbLi01V#!Pe~K(^=?HMPjS)#X&c|W&?#t-fCKoFmE1JeTgqS z(*sVWWD>4w!CR*4EZ73;^h z&ymy@?ErD?Ep-}7as9YQw-~!kxc9pJ`c!=D4XECTW;MPCIR|1fMt{c#$P?XPGEc2pQv(SVLk z(U9Rv-ZelyZMm{EPDC3B!v0FV`veib2etuT`SMfLo0GJDaro*7ApO^1Jm)G{~ zsj;fvN=*N`f~Lpyt5c;;ltJlu#(MehiAY;I>LS`(q!ytVY>~@RNBJ-FFjctFQbZcz z*C7%-N8b(%E^Q$Gl^OQ`Pzumabnpg(U#*VHl6GhU9}=ou?l)I$J08P_nRlbjRjJ&y z1E!yT3*t(?XxaJs;(4_JS3`osLQxFje?I`iG`DRgnwRyypu5fp+pr58Cr8hC20SKz zVe`#hA^AN=w$Y9%wr#KN`${r2iozB45TObK$(ijm-yejFC-(dOc#>rF^Y`EX3RM%= zFdw%BLJI3dI_JuAcHND2Ur6cqR)hzwrrt&^2oT(TZ`=kPbW19ZcfJ4cNN|NbK)#Ir zHc;}h=uzFcjZQU12eT02C!@!1b*M7=Uk9gK&#y;UUCViX;JZ<4_$2RgA9IaZl>I6I zJ&s#ytP{YP)dvlX*r*EfSr=MxeO*VNfdE?rh(#8LJbm`XjSG~;oVU6@=Pn^eyiF^> zveylG5nki>5tKeB0ubgdI>T6>tlE1hSp0Wxoc#5>PS-%?VdcBm7gH*lUP3$ago=bu&LU4(IAnoLZ^!p;_Bbs;IqtwlNo) zCi=_U(B^2xsOL>(+V!`h5y$5=;;@GuX3KzRlLOcEM;^9#E|KX7`4R-;K!T59|9cpn z4fXoQTaG$m5gdTouUdQOEmeThX5cdbz%XcFUf@0>)aNz$~yCc%^%Q^d`lm zxJi=$RxUN!lz0l#Q2OYtUwKmGX225=~X1(#_kYBUg|3?7-j%zqv_9k zS$drCXX>2~<=AL6G1_jL2}ECDukL^0t+us*lH15jAv<)R1$nx`+RYSN&b{*9$qQvE zrE*Gj&_&XrkTjT2p?%|o`cPt^d<>euSSULy)|Ch8BaI$;PE9_2J8#8hIb2xk*oV=X zLFSd01u)R~Q2uQYZ&&~(a`A1?d+hZ~Fc17sp-tKQG$ea{=OMDs`b_x;8H~|T42N@J$l$EC!pK{G?zBxBk>e^zo1DD8MxUeL)A|l)~DObt2}7U`PGXxlw`(V zh}AAX)9uj#;2B7xbS%el!P=G{66t7DV%MA+c1-1P%IM0H3Zy|F=WvHR(bTj7$)#(S zN}j$RkW)c23*Q?bf*f@MKtm58>_9K(9j0CZQ)^7sBaB2KpPm6Od;*g9I^3ujQy;v! zWDd`M3-SEC#Bx8w4_j5d3vrZplFAvm^kRWYgJ9Kd8<#isbHZ_}{fq`@SUM|5`HoVf zP{OlNnY6EDeFsYSeXHH+RFD6vd=wug8{tP`_G%}3KR@N0SGKGT1Q5p9fBg&Yg`W|h z8fK!fGeH5&r~}|cri)O6!`yu}mf||9##)dSyNuJ~8`twPs%3!Lvr<+Xf)dssJr~5;cKWACgRfgdiF`6Un z!$8379CeCz){7Rdq=27a^RIbNpIq|{?YOpd*SFqxvnsHIQ~gZzmmFz(HX`yU_SZpd ziHrqjiSch4U)!=%=vyjyp}>UWRzAzw z4(TOLL>U|7d+)a&Qk$w*T`W*kzc6Cdw$@YuZ`PH8^FAROZJSB-Uj}>1D}^4di$N|S zAMRDo`#1GmH{86nz0a&M&?Mw>>(z zeDt0d62DZ!ROd?Oj00LClvmM{*CdI*;`D2e;8-M}GZH%nD@7!>%&Y|@P<;i7(#CJVJ#yZ)`5YPJel)&$07$x3fbCW8A@ga-}C zph~popj%F`)%Ec=FHhUr&Qad$ZjU*b@q>bQ!9Opj6V95rDIeY>B zMRbw_FMteKySt=D%y1fAIZ>c6a>UntH7IjpqAJ3u2zx!MRhgmVSqysW{7ruq?;Jbn zZ;7C4Ok#}9EqS#)fq4uZF6=TI#u}SsS^RwP9>P%P%L? zE04cSt~Ie3I2bcBXvn<(8+Uj$f%5(+zIu}OmUJgv(z?gf%0?-B7JYR^Mm08$uCbGsx#({-b=oapUB(8^@q z_*j(G*h$%~DCgFX(`YQmFU31Q9RZqL+pC3$I zytb^3K>-q0jH%6@C^9)djqb_K>P!5MCOlRVa=*IE}x44_%}-pj6r*c?aB1xi_<^>CW3X2m$ez^I;|P8$#QYY zgfJzhBB{3wY=mG_;3@BKV_X!+I1Fi#3AA@$BcI5RDZJ!cT7c{G29J^8cd z+0sHwMJ6oFPgQ$CKSPT()`RaCNQe5cXyIV>!sKvc-Au8FAE+>6V~+mM*8CduKX)Kg zqU*|AzCHhb8e;{5hVG4(kUtN)#6o*-WxQ(a(ACD~^H8R~x19FK$Znk5S6ep(+_Rxlub?yXV;9T0Der+k&nX()ss*p2OT$8-CcM0OsJ-`o{s)F zG{xmj9n};BsTcbil*~@U!{dEx|HsXA+yCU4f9UlsA$d%B;j57+I(5KoHo5&GD{{aCbz&)HL_QpF@yLH&m;x=vz_Vk zrx`^T-|}zs2w9%xG9!Gxfw{xs7ifw<7$+SKn_Q2UF`%10hWTD!U;=#%=&&#my7eJE z{m)j%xh-)Nv&Y(*@HjJGs$ing*<&es^F$ITOGjKNwu5OWQ!!p+l$z$dzUq&oguct& z3~48?1q z62Z3Eb-}_zusyr&;%PtN`DruNYHMJj7oE~$`kF^%N`RS@GuX9H{;2-Q_;>B#Zug>H z)x3l|F+L^L&VhG-J-s%{I)mmNh*=i^7YR{>l!0}5T1aSs%e_Y0ilb^&){PDe4uhCUXdOPO%vb^Y$^4N78rz$V4SdV4jHZd1W;-mC!)6r zXgY-0z8zg z5SjxN;PQrW$&7^G8jF;=V}lz@4P_^s2TmZM&fT|e9I!?9$~e@^>CY*>8vSg)iClW_JIs{7aeCuRha)}M}BE!2~Sb;;qTBFDeV}||G4GmT`3TC9w zp45*Lg|ekNTmr+NMyJ<0Q2ah8?d@_H3^JP;=8DQesAO4~YMhZ?k^?5g^sZ4P)9r>Z z5ZGqptV6-(h_wYx#eERPDU`1iv;+v^YH@!1y!IE?T#=P7Nx=B%dAfUAWRk79*wGgN z%KfVLDyDX#g`DRe7 zt%<0;6MOg3k1O|qtUE`$bh9*N>*X85^!|K+L5K1zGY}^S8^ept`DhiSCY@rjTPRWs zF+j@|ZBP}Xs}~yk;)5RCi#e1huEb9_KCd_Ozo0w_T_-o%C|+aVucF3)fFL#&SV9&& zY*41Sehh?SJ}_{@nVGo=uY{-f-gnbe4SRyBz-NwW?vbeK5vng~wCbYAGmO@+hGJf* zC&77pOW~db=@19LuDetSH$0(9ig4QJpydaMIp=}O!ONZHbY>wu+0{|jq;NctYs3cr zeh9X}ziEM&o~$MTC4bAl807Gz`&qZHd=>p507mT4RE$CW5cL_N1v3<-0)lub>|O;%0dHn;6#M@4N5lW<-tG^laja0C?$eh(g=!7hQ3Sj*UbZRd6}BVXkNtjfyTICKOhE zOCn>Q!wazXI!D#2x4as8cl1|6j1P}9XiVQS=+6<_QN%RC0`2Idig4o0>1kBW-khpH zz7ZZL3svvO#k=43Wj+=9o5ayx<)cBfO^c7p21*~iisae&eaDwdM&n~oyLwL@IIi6Y z$aDUzpP_cDaIji#FYnsh%zm%IXaHxDkiGxOk1Nw;*+=LCxvoHpin8b^I$G&$Q(w~1I_Ai-VG3^nMgdF&j**YcgitZL{DqJp# zS5kZj3YmUHDR+m+tAtl&oER9)xpn`Be@;ogjqOZaAlzKYEX`rG>w3pF5Xh+CkGi{0b zeDRh;xv!d?&k5eXVHA#5NV(g{)CN;}89lNTL1QMNOy>9Y@Q_h^3fU@t2$Q^fF&&(V z@leD0L~BqPLuNO?{uIh_;+ZD6kl1e8^8@r+JUPcpGSsM@e&s>U3={Mwfzmrj!J>6i z(XQ%=)$XqWL&xBibJ>R#VrTNtZYvv&s)En%UKH=A-6Jxsy`!kxQWV05V?g=_l+#$- zW=sKm1I!&l2V2X*Q)txO1}KQA7(d=$(;Scc{)Ny_4g9!CY26qO}rj`_!IdN zv2u#HkfbWY<>1aVPeMF*FKNExJ#bbi>xs>Dqa|%=_|2T}=vtA9xt`+I5x!)G>CVS| zbjSn`YzCMjL0|RVb;l=N9vd+G~I6k)}|liL(qt4R$XclRwApK z(?hAk*X50#`pI0h%_Biok^Jzx!YkQtM`a4sX)o}6Ixg5UzN-ZD^rlr?26ES{3y&ay zhdNuT7@n-c!sEw1_sxz@kzZk#>DH%4_j3Jd>eUAKBt{2VfR zo9AFEN~ihkH-R_`$ewtY7BptMsTSA~s7B(zn4_t%Y@n&dDlm+I9pQ~2@vGsGUZbFF z5&VB>c&WFG-JcumEKB4K75Vvrq=QIl8qBu)?e118rB8q7@TZ#7BzeH&H20yOnU(j7 zffjA8djG<3Cy2XhzN$OW)hxMkTH2i{_1@ktHjYD&eXHX&$`R)1U7rSU;p-q=Hugk4 zzV_XhfWztt??U(!=->%vseeIg<_G_>@}xL3u=hKnj;qJwX^!GwCMge zqBnl^Ym4Y8-y)ePfX*rTw?%jKfFio@DHil|ps=JS{e#mzT6!W5x#n*gyOO8FY$J)C zt1^FeLc~f=Ozd0D4uC7^NJYo5@Hj+d40vu%<}*4u$=pSJWp+^wAnqH}&SC5@0Z*;& z`JrCSyof__5oZqOJB0tE_3Zn}oJhv9^94A)Wl_7Us zdinNLkiq;n48xgSwxa)y*idjg(oF8HVr}N1Lza$;0xZ?|m1M$xS6(!0fEd%^JxG5w zbSqmx;Om3g!i^V^Qt}(n5eLxr19B3ISNS18diDuB2%+yz9ty>695y@A`u5~*Q2|VY z{CTe&90m+f))CsYKDF8XD~|BwbC!VN%EpzFYmYIv(@V3aHKiOZN<+91c8xLlf>2IW`FGNRtI{RX1vDwFk8AUSO@=_U ziV}xJZQdFo4-OXIVOt=6q`yIeWIcMxs9rX z-wbVLk_Ume=W(w4V7q@^^MV?p^iy?v*hF$Y{l=f9un)qQl0c2u2p(rZzwa`+pV_G> zs$n(}5oEUeSEGO>$($8+;^)G^OHjk44RJ;_ZW|DxI&TdNi)2e(NO>AtsO@U#ftU^o z#=8rEr5Ye+MTcUrIXF=K0oz)n%s1Iv9EE)86Jp!=AOYq#hXBKlo~TeoQUrb7KES_+tq!t zjUmHWOZ6M1Q}w6vg0a^#rkzV07uC~$Hb6Ed^NcRONyg39bF-C8jM%_r`j z)IDJ%oUk(*DD~*NS3^&Q3bA@}X__h+<>aHOGPAPx3CfGuw2=D-gZLKXP1!XI!QVnH z2K-doq>h@7+e_JnDr(S2MruQ>KcrUutU&+%m4Mp zC1|>~sWN?*vA#3{ayC&70?Yz+6f!%kHLraxwR` z)-G&HRBG#q8o_rDE!Uo+KtEMLMb$kzs`ZU1;{uG&3pk*l{$&dn8k7YzJx8U(QG>)Q z;6aRzpF( z_6>5}uF$yur#E-U(>C(+f{(mGb4mf}{Qg6k&xN0%{OM`qzta7YCu^U`UJ$mC^fiWC zw{Y19hbaHHRr&5Q4RS#*t~aMt5au=>)U!GZo}!QACGRW0 zHjDe{#~7>Lar*)C@hF>luQE-ta^nzvXxyyK%;9VGy1V)>vT=7A^_=f2;p@>?ROnUV zp>w}jxM%c}M2lX>-qh^1x&BDU#lDhAM{2j)H?c=rs}1#z2O_FUDpRkVDJfT1E|a!B z8|-!-uUGuU_xX$5O*)>go|)V~fWalgaRWK8Pp}-Wg05etVSOE-?%O+{%C9EDU3fcc z1cPh(unv^Xut(72K-;ZcHm`J^9!awEWQjK~qf227{>J*|&2;rQvc6(>;o`D6st~$s z(X-K)GofCGWZ$n|ZF~KD%76$KF|p|QEmUP@#%uV@b=tR3kYbm#haKGii~4c{Yj^&= z@yrT${rMHy!o>BCaqZ!wo{imVvDHCSUb8YK1T&=#Wysdpuczi*P*{ZKK9hLx4Cov@ zdg5^AyIWm3xo(xL7l54|G?uh5b9p+05I-9u9QOI{d;GNFzVBH^gVx2Dzg2V^;}24_ z*?5)DyUsIt%kg?7DUFUFZO^6g+jv~ZP+xHQoO3eSi1*rEFQt#_UJhH`!G@}SCW1nD zH|;L8-4`mC#2my<4o}_}Ud}&{JYQWB$j9d^n zd7*fy@o5vGPD9R)jyNmlZgt<*GB#8~s>FH1iu&G+_jM@hvBQdyyAAbwuJf+GR{~oE zOb=tm^LnG-gvB(7d&rT%!r(i@d>5`)7o4f5pTDtR#*!%omgI2)vi*6UaGlpr&7DOE z<4jNX)Q=oi_r~DEliB=AI`w64@g=Q9;UsX*y#HnBp$~<9m;L+ZqU^Qr&qOf<0uiZX zA^fU*%-%LoRWo79@M#z`RZd>YReq}P*cC#^8_YPCKVBN)=W&*801+L$c?oQOZ=lnT zRV3p1lq_s(bGK4#l_ausPo}?YW}{2UCE~HX!I$@o(wETvGa8uLD7jLyhb(yShmue4 z3C(|BAuzp(IGgSH0_*+OKR=`Virk0g@@)z%E5FR0NXE^Vg06ORM|RG+srmkV$D-20 ztQ?O?i@rui{{gyt$gK3{>j-KPW)Go};&m5)%?IKTOFF!{A@epKM$BKmw-1gopLxRF zIPZoxy_h6dqLP`r-IsbZmDup6#ZO!zL}=|$`nGRIKKl-nQ{EIZwG$}XxIv-DJ!h;m z&+P1|SgVoRa8kVQ?iyu#-!)@jdTCplO`p%cgo|_-FE3po)Tw`J!9{oigM(_9S^V@r z1d~B`=eLutM_k~EmlIp!*F)F#&ZjC@=OaF=*B4DAKD!MsFhA7M=)Q=CS!w!50?;hR1mUhlbbys9#Zbqv6!5d-sNhH;38 zBRG?ts%OqFXCAa|Unett2pW9ZQWX@@F6;R4c^tXikFaCTi}r?dUYP#7TT&QBy{nty zs|4&egCx?y{Y>kjeBZ{s0@R}zYtnT;ybon4!XZ-&;eQZKfu>BF1K9T%;W*wNCbrQEIK`QMLS zsdc2ed85l}6<7XX4e-EAG`m(em5VF4hS=dwY4x6PZ0OC94Tm<|LcFOq`;T+G8nikwA>b^jsasGCD@&uf68QLfvek%c{w?S>wBRTDa(Yg>}85vc@CR`EOoMDf%zP zFE%c><=|d(Nb!j5rj?Genb$oyUJxk^2v*E7!JtJ;l`Z_Iitp<65DXq2(d2}B56zqMOyHAIdOw<=@-MXt>mY?mjbrOIrTQB?7h7U$a}~;d95=uZ@bb zvy)?)P$W#Pek~X~Q|_zP0=wwwBms{gg8ksUz6^3^uFks5R6`Ad=9CBu2FQvPJe_Es zyGN2g_DV0j>F2*WTOtr45wZr~oI*MWjATU5MD{=>9>Wctmky3Bd9&>EUo|BKrF!wD z32%6t-q4k1RjNE!##6ia{w2X&Qx*7S?ApbkLh>x@YJZCFf9LsaG4VfNhs-x$l(>u#?@ak z2Sk9#t7&ada_ZxjcOd^^ zsTuK?cVN1b9*4wXrnQ-*GNIqhn>5z_5y!T0;cPNy=*tGZ7_nPykI?`l4cUW%v+E<( z?JJfszQ?zjywz$lc@c@C#CP@F;a@d>4A0e8t&qfFvPKc8A(Dpf4?c1nsejcqlzH=n z81-_3}$ANz#J zTYbV=85@755z|NNdGq9$;rw6QKa`r1ytuv|C1_is$jXYuO(^YZmdLs9^~oVcSH-yj z`@f6%*h~slgmdmqZmQ2#>40^6=KhMo=l_m#$N`Wta7kulm6AN>$~KqQY*7mvHE+FK zI_P?yS+s{^IT32RY3i?~L8tg|w+1~$+5eG7zvP@1#rF*Z!mgXhUR?sz^n_UK1S_`G zvrGG8z_LF(LCIf0kC^DaJ3XiJ%_m?>B(<#}ex3m~=+^(oR_S9?J3v;ya@`!MHlHC^ z3ZaFKJ&~3E`>ee(Jg9Vpt7_#Uq9U{ zxI9$IB2D0<$*R`*$=GzWH|{TB;B6_#x+?R*%lHKuQCGf59~I|fyHc^UUVJJ38_kkwq7uBc72|TA^m2#Z%os zEyZ=i=dy~f?G>ajOFH%epT~jFdvvH{Ln1%DtY!c8;w&IoZJ@d0RwZiZuhFy;Ec5I0 z(`Z#yp@cSiWmjr6b) zESwd!Z>kHwy{IXx`{RBX>f1YogNlABcAo+l`pHrRv+eanvo&N37(=^%;-D%kfD}EUvLFi8IbiTB6L$ayy#DI z=l_-k*^&LP+5}DNr08JtPSl$Fu84B|JEb1VAOshU zpgI#?MQtWLBKC-1_k&Thd_@Vn!%f`x=<-et^DH4WV(%Zdi&I?SBB2OyT=1OFM4Hzq z+mVf#i|g%}j)o)l5hwI_JlhFq7=k7>Ok)Rp?z}a~pu(qvO1zy$_HLii;}NOQ&8IaV z_mt4=rXE}>AAG@Pqz&31T-3Wo;|H-kJ!Uxj+1!g z#=635t5*YD({FlfI<77Yt(q|XDhd;-yr;{*kxl@$LFb9vh2A%rmsqRbl(9*t;Vj! zG;0a*sEyua-80!PxU*xo#S4G&L?+UPJOV|=>Oj0zY3gS|)p)lXYeu%b$tG$x9tgq* zDp6XQnF=+$MTnXevY}!KmU6?txRW#s!vE!rxNzO5sKS{nkJL4d;&fq&U=mVmQ|O5j zBjb+fN=uQ*!NxcA=<-pNNU|D4%_Y;go;|tc%sIVMEP9+(<@d&!nE8g{&T0RPziP-b zoXLWlBl5=yTCs}C{MMFAJ#0X0GXKsY^SMub8XsgI@6_9%!OC?5>~xp=u(tiHF3PV{ z*&P%$XaNY)@}rC6w>=9}%A0RbjYxaUt`i8+=#iSgw&~!DBWFp^9zS|>^rI)?d1eo~ z6g*HQyftBbiR|#={odpN=FS&ye%ftE%rsNwNIa8A3H;i2H3B9N?Ru^szS$A1x%&9J zeTwSdCZBJQ?c||u-Wt;Ahr~Q>YF(C@=QmH5jnb-dSx1R{X*k=K$E_dUpRU%ZS{kcA z1VV-k_oc)`S~W7a_B+SOBsxagy?JT2%_9-g4`V-Je;=j=7EAb7QR>sF(m7nRZQDsc z!@~WG_-)+5p=aBp#^0PgGS*iM!jBvb27DZiJBQI<(;p@yv^c&e7`aVAcUiY&b&T9! zLS8#fO&?O8k1c$gp59pa@F!b!Wt&HS!)8q1FAWDuXjmptxAOy!T9L48x%`7bqgSb# zf4_Cp59eb8YeF)w+Z*g~-rIL+f%F>YW%ZH}aq8o^I(E(?TjHQTG2xlS=W0)u#S9sl zt0Ng7^C380h8J?QW2%l2so`S~hQpok#Kr5Et&&?WGW3GRWX_Qe*TjWOzMX+ovv1Cs ze>@MgIj-L@&;5cDywBgpd(#}wU$Mwq1%5MLT&SFQd1fa0(G5z-S>uuH?H3k{{Q%N# zO&#c6NTPdWO6_U#5cUvlkOv+H_T)xSDDFk*Myk(gV_=2ovXtQg@77F1%5!XL>cA&5 zkkEpOQ$ELaV6FsxRj-b$gH;=e`4JV1qPFJbl)Hys<*y$LUD?gjPn4GfuLaqzzHy$! z6E1WqDld;UjCEcm>5R?zlB^#ZLLR<1oGBI`#Fce#kh2-L+j^y_fjqE7qhGDVy)57? z30>2xjaQF0wr;3j#QMGO*(_~qfX!a#_IQu$Pd%py6Bq(EDrjFJ?Rz(+G}FiJdh64k}19)YYu^7D!3_N9)y;obyDGV1yMLp%!2qC z1|ld)Cr;&mp7^zES1h2;7s15-Uo9LIfrM4~Yt}*SF{M0r!9i^w?NXH`b?(=C#1Z*V zd$%8K%XsI@2FOt-blpZ9fwZM#M@ez43gnZc(spp>Rte8Kw3f|Gx)=xC9EwDCE?=g< zNUNOQ?`Am@(8i^|IT`JvEz>Z76n_&T`>=!>M)Cf)n;e?Ljp7<%0GXK8rS>5cie>T@Zz_PJc8){*sfqip+U{wsogeeZB7OVl0+g@@b@9hVF)JbU+ zTT>6MRQ?s^2Pb8tS_j_cn|w1~JZOetF`=^oP~Ix|>T;KtP)1zQCBbsk$^&bB#^;8A zflZppql_m3?21_zK4R|Nv0~?C3{KS9lXeH{;N1^kGTtga5w?2_{{!^Yw1=qq%UMly z)@G8xK0L>V{!_OQ2*J9#vGEU%8K1&Pq<-?px|hqLbOMPctsGS&of@KN>egb(q!$A| zrF9wRr5b#w-y~h1`ijS}h))=#BOg6nTZQmLXEr)Nr>Sl#49~Aa#;!^A2P)#t> zn%#>~)JR92b`b-BuKW}qHInv9^L-)*n{VvVrZ?3!juk|T0ROo3(|f>Z69=QHtK9_P zd7kZJzq>{$-YYm9d^gN8zfp)7;ID-NsdkH3gHV?-kCvecEqRj+-+>PJ40I@g6@cKq z9`{Rpiy$v}08>oqxS2y^E&AzMda3%Yy+Z}2!>&>O`xfz-k!>bs^r#WjxO#Y&{@%-I zeR9EaZ@hHo<+$CC5fT1>s>P)FP==~icsn@DSe~8Ue}pa4X^n##IwUmz3B{)a;%vbC zyi7an$fUg+IzAk)uDhibx96yZE7DnVV=_024o}$^=-|>iZSYMJ8g-OqA6 z0vQnbW~mMa=xW#Pcs@mJTp~#3ZlDx}j>)?oSiAB8B zPlLj=Ql;l9Y67!VU~~xqh;+}}igY;0BQNqm)E$-WxdT3yo^Z`s(Eeto>RJ13@O*o& z1yX5vj5a4lzWeKcgQ;vU(v%QSf1V=cIc5Hs7{v@l0aytkV0l|#N@`(47c3&*0GccZ z5CZ0e{MF3}uGA`)@~otx|1(gaD{-^xwdx)#rx`wk5zSFwXYZMa&@f(%&c5naHS$%dn6or;!=)v)C;3cjz$V!jC613m{ z){h@=6X@hfRcoD>a?2LSAuI0pQTM;D=-ukZq0}l`i4Q8kM~^4v2|IO?{ZTjG7{tT!S)6^tlkd^YVqjKMIsA0I~ll z5FvbkA1&SgI#=7AtMBd&&q#hUWG`DU^XMxgp<3hZKnL7b0}u;Pd&m8|MNAgH1pMsp#gb*0QA?H#p^6yMK!G?_3tO;8$C=J7RD&! zOIK2CzBdfPNrt=C0jy0jpj1#muj_Xj8mRAq*l{Zu~&vP%y$YMtSH_Qi09?=8-u(R9F^SG6#0T@~$N{A|Hcz;4A8i={rPIl@9`Shh^q3p%Zt6 z@+n0a0Z&L++=5SI6|W^7(Vx=+xxo43ad=MN@(}9$uwPCQL&&IaMviI~&+uiSda6>l0OAISfsGll?if(}AL3#4wP-%&@D8dt!D4 zCGEL2-$D`Fo=d2?wr`~&M(H6yQ*khBFYA)Pm@)gs$4Y}@`Fh~LbpJYE4DN7%Z@?yR{ErZZ z&Lg?>Q7rCl-5)|-YwjrNMvQt7vu=twtW^wA0WMdA8`!SS$revL{W}b?i3tzo(#Ns5 zIpq!7Tr&B*qm@6QWR8jCN8Lf{Pp_$eic++n=MW55<_G0Zu0DH?8 zpAoQBi|(6iL?^MIK#n#n z;7ZC?=n#lD3=V;y-UI=p`X3)qastIWkpJ^RVyJGJB|Fa+Zs0}%fsCg8AX0l%w}A&9 zXmj%lHLTd!$3_;$-BWXk7Ugn2j<1KBjScDGMOe#Y4>sqMYakkSmGq&pI>jdu zdKE0}+Y=Cn_b5Lx!s9K2d>Q{dh!#-kIKsN#Y~jm%rtVvvw^HOp=IF z3ZSsjfuPy-jrA0PBVku`!HuBV&&`;lttG-@_h77d=gADoJOhuXZB%sLe)Ak)XqH^} zmx|t8w=m9cUY^XQl`<@~pg>j?{(3F*GZf2bEBE7;!t&%2*&mtYSfA;#%!4F=;0*ha z9Fm^YKDE-a-+WkX&AWW2AiNE_pX}Ze7wGOzVo^SKjPVW^aKm>FCz3QH8!(;Y@RvH+ z*?YnV%uHKr&tN=@t7CZ`wsVP^15NsTLuQeCm;q{VFHx9SN4@;I_dT)BLB2H#+INS} zcy@_FThZa9sS3U{9G+-SDM}Ni>=I$3qzY_Dv{SAXjwG&hq}^84+Z92Xyv_@oY7B#X zQW!s9Nta0nTC0BubTnIgDw_C6EjntrYOfxdsg`2z<=$g8=YEeT3_sT<0Gs*c_MCEu zEf6DM0OYP3jBQVotsF}S219CYOAQ$1s->6VZMR%pB(*2RSa6UqD0muS6Hiqp5PLxF zA{CuV9naLrgH-`jNDzpU;D%uK$Rp&3-Qgkx;9l)?{L(*yfu;iesqnvsyW%JyE(hYAu zJB(ExHmQBeMTN)mBFT&>ysO?-IhHb(f?YeQSZwiPHm+xE*H*=RhK`$`}CJ* zi-q*P?DN;{-R0K7kR`A1iTAX~icE1seW%B1qHA}Xx4iUu$@1f~&V#$#Z~u6F$@EL- z^1kHMQZ=)`208f;ou}MAC2gVW9nmXLDEj^W+;?LCzNbF??Z20u-|NHbZJTvGbc%ax z=GA_i+g{58N(wqPn@b=6`?)t)e$h$xj_Hw&J6|0BsPwL_>g~R&3VFSc#+C7>SCpLF z^PjK&uFUZwWp3T)x|UCSndFORwsL?Bm~zi#@tfW+7ub_N?vK_o(Os*`=@i20HaO?tV|)k>OjyC$3=ExBKUA ze%|xnMT|Clef`WxSt!}ntBA4grrY;#TnFV#eQkZ0U!J<(VwTdEQWu}c|E{Xrovb^y z=fakAcUQl;v!~|4>(H`!EBnH4R=-=iT**^^^XJbgov)XvI$f^L-y3Jd5SL6ee$?;Ww@xcq5NL1FAOZ^Nj$1r=cy`RfnMF>7X}KY#YMNlB%? z{?;0uyT#vMH7b2p`fYi7x15{)y*oZ9vnQl-*8%hI!FkO`Uaz_EMoe$ZPif!e$SU#c zFT3LPrhT~cK%-1&nDjas2OC z7#SFu=o%R68kmF_npznFk%hK_ft7)QjAOuc6b-rgDVb@NxHaU;yvPP>&;{9$nVf8u zoL^8`l$oAU!r%;JDL59DWTvH7C zGe3_3Lql< literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index 4d0bd8c0..b0acb763 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,6 +25,36 @@ deliver a complete documentation of all functions. Readers who are already famil jump to the examples or the API-documentation using the navigation on the left. +If you use this work in a scientific context, please cite the following thesis: + +.. code-block:: + + @phdthesis{handle:20.500.11811/9245, + 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} + } + + + + + .. toctree:: :hidden: :maxdepth: 1 diff --git a/docs/intro.rst b/docs/intro.rst index 8831afd9..8bf19739 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -2,95 +2,117 @@ Understanding wavelets ====================== This supplementary section summarizes key wavelet facts as a convenience for the hasty reader. -See, for example, \cite{strang1996wavelets,mallat1999wavelet} or \cite{jensen2001ripples} for excellent detailed introductions to the topic. - -The \acf{fwt} relies on convolution operations with filter pairs. -\begin{figure} -\centering -\includestandalone[scale=0.9]{./figures/supplementary/fwt} -\caption{Overview of the \acf{fwt} computation. $\mathbf{h}_\mathcal{L}$ denotes the analysis low-pass filter. -$\mathbf{h}_\mathcal{H}$ the analysis high pass filter. $\mathbf{f}_\mathcal{L}$ and $\mathbf{f}_\mathcal{H}$ -the synthesis filer pair. $\downarrow_2$ denotes downsampling with a factor of two, $\uparrow_2$ -means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. -The synthesis or inverse transform on the right works with stride two transposed convolutions. -$\mathbf{H}_{k}$ and $\mathbf{F}_{k}$ with $k \in [\mathcal{L}, \mathcal{H}]$ denote the corresponding convolution -operators.} -\label{fig:fwt} -\end{figure} -Figure~\ref{fig:fwt} illustrates the process. The forward or analysis transform -works with a low-pass $\mathbf{h}_\mathcal{L}$ and a high-pass filter $\mathbf{h}_\mathcal{H}$. -The analysis transform repeatedly convolves with both filters, -\begin{align} \label{eq:fwt} +See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. + +The fwt relies on convolution operations with filter pairs. + + +.. _fig-fwt: + +.. figure:: figures/fwt.png + :scale: 50 % + :alt: fast wavelet transform computation diagram. + :align: center + + Overview of the fwt computation. + + +:numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{L}` denotes the analysis low-pass filter. :math:`\mathbf{h}_\mathcal{H}` the analysis high pass filter. :math:`\mathbf{f}_\mathcal{L}` and :math:`\mathbf{f}_\mathcal{H}` the synthesis filer pair. :math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. The synthesis or inverse transform on the right works with stride two transposed convolutions. :math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{L}, \mathcal{H}]` denote the corresponding convolution operators. + + +.. math:: \mathbf{x}_s * \mathbf{h}_k = \mathbf{c}_{k, s+1} -\end{align} -with $k \in [\mathcal{L}, \mathcal{H}]$ and $s \in \mathbb{N}_0$ the set of natural numbers, where $\mathbf{x}_0$ is equal to -the original input signal $\mathbf{x}$. At higher scales, the \ac{fwt} uses the low-pass filtered result as input, -$\mathbf{x}_s = \mathbf{c}_{\mathcal{L}, s}$ if $s > 0$. -The dashed arrow indicates that we could continue to expand the \ac{fwt} tree here. - -The \acf{wpt} additionally expands the high-frequency part of the tree. -\begin{figure} -\centering -\includestandalone[scale=0.9]{./figures/supplementary/packets_1d} -\caption{Scematic drawing of the full \acf{wpt} in a single dimension. -Compared to figure~\ref{fig:fwt}, the high-pass filtered side of the tree is expanded, too.} -\label{fig:wpt} -\end{figure} -A comparison of figure~\ref{fig:fwt} and \ref{fig:wpt} illustrates this difference. -Whole expansion is not the only possible way to construct a wavelet packet tree. See \cite{jensen2001ripples} for a discussion of other options. -In both figures, capital letters denote convolution operators. These may be expressed as Toeplitz matrices \cite{strang1996wavelets}. + +with :math:`k \in [\mathcal{L}, \mathcal{H}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to +the original input signal :math:`\mathbf{x}`. At higher scales, the fwt uses the low-pass filtered result as input, +:math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{L}, s}` if :math:`s > 0`. +The dashed arrow indicates that we could continue to expand the fwt tree here. + +The wpt additionally expands the high-frequency part of the tree. + +.. _fig-wpt: + +.. figure:: figures/packets_1d.png + :scale: 50 % + :alt: wavelet packet transform computation diagram. + :align: center + + Scematic drawing of the full wpt in a single dimension. Compared to figure~\ref{fig:fwt}, the high-pass filtered side of the tree is expanded, too. + +A comparison of :numref:`fig-fwt` and :numref:`fig-wpt` illustrates this difference. +Whole expansion is not the only possible way to construct a wavelet packet tree. See :cite:`jensen2001ripples` for a discussion of other options. +In both figures, capital letters denote convolution operators. These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. The matrix nature of these operators explains the capital boldface notation. Coefficient subscripts record the path that leads to a particular coefficient. -We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products \cite{vyas2018multiscale}: -\begin{align} -\mathbf{h}_{a} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{L}^T, -\mathbf{h}_{h} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{H}^T, -\mathbf{h}_{v} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{L}^T, -\mathbf{h}_{d} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{H}^T -\end{align} -With $a$ for approximation, $h$ for horizontal, $v$ for vertical, and $d$ for diagonal \cite{lee2019pywavelets}. -We can construct a \ac{wpt}-tree for images with these two-dimensional filters. -\begin{figure} -\includestandalone[scale=0.9]{./figures/supplementary/packets_2d} -\caption{Two dimensional \acf{wpt} computation overview. $\mathbf{X}$ and $\hat{\mathbf{X}}$ denote input image and -reconstruction respectively.} -\label{fig:wpt2d} -\end{figure} +We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products :cite:`vyas2018multiscale`: + +.. math:: + \mathbf{h}_{a} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{L}^T, + \mathbf{h}_{h} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{H}^T, + \mathbf{h}_{v} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{L}^T, + \mathbf{h}_{d} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{H}^T + +With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. +We can construct a wpt-tree for images with these two-dimensional filters. + + +.. image:: figures/packets_2d.png + :scale: 45 % + :alt: 2d wavelet packet transform computation diagram. + :align: center + +Two dimensional \acf{wpt} computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and +reconstruction respectively. Figure~\ref{fig:wpt2d} illustrates the computation of a full two-dimensional wavelet packet tree. More formally, the process initially evaluates -\begin{align} -\mathbf{x}_0 *_2 \mathbf{h}_j = \mathbf{c}_{j, 1} -\end{align} -with $\mathbf{x}_0$ equal to an input image $\mathbf{X}$, $j \in [a,h,v,d]$, and $*_2$ for two-dimensional convolution. At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. We refer to the standard literature \cite{jensen2001ripples,strang1996wavelets} for an extended discussion. + +.. math:: + \mathbf{x}_0 *_2 \mathbf{h}_j = \mathbf{c}_{j, 1} + +with :math:`\mathbf{x}_0` equal to an input image :math:`\mathbf{X}`, :math:`j \in [a,h,v,d]`, and :math:`*_2` for two-dimensional convolution. At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. Compared to the \ac{fwt}, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. Synthesis transforms reconstruct the original input based on the results from the analysis transform. -\subsection{Common wavelets and their properties}\label{sec:db_and_sym} +Common wavelets and their properties +------------------------------------ + A key property of the wavelet transform is its invertibility. Additionally, we expect an alias-free representation. -Standard literature like \cite{strang1996wavelets} formulates the perfect reconstruction -and alias cancellation conditions to satisfy both requirements. For an analysis filter coefficient vector $\mathbf{h}$ the equations below use the polynomial $H(z) = \sum_n h(n)z^{-n}$. We construct $F(z)$ the same way using the synthesis filter coefficients in $\mathbf{f}$. To guarantee perfect reconstruction the filters must respect -\begin{align} -H_\mathcal{L}(z)F_\mathcal{L}(z) + H_\mathcal{H}(-z)F_\mathcal{H}(z) = 2z^{-l}. -\end{align} +Standard literature like :cite:`strang1996wavelets` formulates the perfect reconstruction +and alias cancellation conditions to satisfy both requirements. For an analysis filter coefficient vector :math:`\mathbf{h}` the equations below use the polynomial :math:`H(z) = \sum_n h(n)z^{-n}`. We construct :math:`F(z)` the same way using the synthesis filter coefficients in :math:`\mathbf{f}`. To guarantee perfect reconstruction the filters must respect + +.. math:: + H_\mathcal{L}(z)F_\mathcal{L}(z) + H_\mathcal{H}(-z)F_\mathcal{H}(z) = 2z^{-l}. + Similarly -\begin{align} \label{eq:alias_cancellation} + +.. math:: F_\mathcal{L}(z)H_\mathcal{L}(-z) + F_\mathcal{H}(z)H_\mathcal{H}(-z) = 0 -\end{align} + guarantees alias cancellation. Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Symlets appear in this paper. -\begin{figure} - \includestandalone{./figures/supplementary/sym6} - \caption{Visualization of the Symlet 6 filter coefficients.} - \label{fig:sym6_vis} -\end{figure} -\begin{figure} - \includestandalone{./figures/supplementary/db6} - \caption{Visualization of the Daubechies 6 filter coefficients.} -\label{fig:db6_vis} -\end{figure} + +.. figure:: figures/sym6.png + :scale: 45 % + :alt: sym6 filter values + :align: center + +Visualization of the Symlet 6 filter coefficients. + + +.. figure:: figures/db6.png + :scale: 45 % + :alt: 2d wavelet packet transform computation diagram. + :align: center + +Visualization of the Daubechies 6 filter coefficients. + Figures~\ref{fig:sym6_vis} and \ref{fig:db6_vis} visualize the Daubechies and Symlet filters of 6th degree. Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. Figure~\ref{fig:sym6_vis} illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in Figure~\ref{fig:db6_vis}. -Consider the sign patterns in Figure~\ref{fig:db6_vis}. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute $F_\mathcal{L}(z) = H_\mathcal{H}(-z)$ and $F_\mathcal{H} = -H_\mathcal{L}(-z)$ into equation~\ref{eq:alias_cancellation}\cite{strang1996wavelets}. $F_\mathcal{L}(z) = H_\mathcal{H}(-z)$ requires an opposing sign at even and equal signs at odd powers of the polynomial. \ No newline at end of file +Consider the sign patterns in Figure~\ref{fig:db6_vis}. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` and :math:`F_\mathcal{H} = -H_\mathcal{L}(-z)` into equation~\ref{eq:alias_cancellation} :cite:`strang1996wavelets`. :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. + + + +.. bibliography:: \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index cf5276bc..5da931ca 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1,3 @@ ptwt -sphinx-book-theme \ No newline at end of file +sphinx-book-theme +sphinxcontrib-bibtex \ No newline at end of file diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index 3dfdb128..f2f9a1db 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -274,7 +274,7 @@ def wavedec( .. math:: x_s * h_k = c_{k,s+1} - Where ... + Where ... ``TODO`` Args: data (torch.Tensor): The input time series, From 7b9906ac60776bc15e6b677d4ae61019d4df688c Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 17:15:04 +0100 Subject: [PATCH 05/39] docs update. --- docs/index.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index b0acb763..8c0c9cf9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -24,6 +24,9 @@ This documentation aims to explain the foundations of wavelet theory, introduce deliver a complete documentation of all functions. Readers who are already familiar with the theory should directly jump to the examples or the API-documentation using the navigation on the left. +``ptwt`` is build to be `PyWavelets `_ compatible. +It should be possible to switch back and forth with relative ease. + If you use this work in a scientific context, please cite the following thesis: From 643788bb3492f8a404a0bad239106d3fd17e862f Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 17:16:34 +0100 Subject: [PATCH 06/39] done for today. --- docs/examples.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/examples.rst b/docs/examples.rst index 0d8cff9f..b9fabde7 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,2 +1,4 @@ Wavelet transforms by example -============================= \ No newline at end of file +============================= + +TODO \ No newline at end of file From dc8def04f1dacd0827762ee070cd6e78feb9219b Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 4 Jan 2024 17:25:59 +0100 Subject: [PATCH 07/39] update literature list. --- docs/literature.bib | 438 -------------------------------------------- 1 file changed, 438 deletions(-) diff --git a/docs/literature.bib b/docs/literature.bib index 9dbec80c..0d3354f6 100644 --- a/docs/literature.bib +++ b/docs/literature.bib @@ -1,74 +1,3 @@ -@inproceedings{yoo2019photorealistic, - title={Photorealistic style transfer via wavelet transforms}, - author={Yoo, Jaejun and Uh, Youngjung and Chun, Sanghyuk and Kang, Byeongkyu and Ha, Jung-Woo}, - booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, - pages={9036--9045}, - year={2019} -} - -@inproceedings{liu2020wavelet, - title={Wavelet-based dual-branch network for image demoir{\'e}ing}, - author={Liu, Lin and Liu, Jianzhuang and Yuan, Shanxin and Slabaugh, Gregory and Leonardis, Ale{\v{s}} and Zhou, Wengang and Tian, Qi}, - booktitle={Computer Vision--ECCV 2020: 16th European Conference, Glasgow, UK, August 23--28, 2020, Proceedings, Part XIII 16}, - pages={86--102}, - year={2020}, - organization={Springer} -} - -@inproceedings{liu2019attribute, - title={Attribute-aware face aging with wavelet-based generative adversarial networks}, - author={Liu, Yunfan and Li, Qi and Sun, Zhenan}, - booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, - pages={11877--11886}, - year={2019} -} - -@inproceedings{wang2020multi, - title={Multi-level wavelet-based generative adversarial network for perceptual quality enhancement of compressed video}, - author={Wang, Jianyi and Deng, Xin and Xu, Mai and Chen, Congyong and Song, Yuhang}, - booktitle={European Conference on Computer Vision}, - pages={405--421}, - year={2020}, - organization={Springer} -} - -@inproceedings{durall2020watch, - title={Watch your up-convolution: Cnn based generative deep neural networks are failing to reproduce spectral distributions}, - author={Durall, Ricard and Keuper, Margret and Keuper, Janis}, - booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, - pages={7890--7899}, - year={2020} -} - - - -@inproceedings{huang2017wavelet, - title={Wavelet-srnet: A wavelet-based cnn for multi-scale face super resolution}, - author={Huang, Huaibo and He, Ran and Sun, Zhenan and Tan, Tieniu}, - booktitle={Proceedings of the IEEE international conference on computer vision}, - pages={1689--1697}, - year={2017} -} - - - -@inproceedings{hernandez2019human, - title={Human motion prediction via spatio-temporal inpainting}, - author={Hernandez, Alejandro and Gall, Jurgen and Moreno-Noguer, Francesc}, - booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision}, - pages={7134--7143}, - year={2019} -} - -@article{guth2022wavelet, - title={Wavelet score-based generative modeling}, - author={Guth, Florentin and Coste, Simon and De Bortoli, Valentin and Mallat, Stephane}, - journal={Advances in Neural Information Processing Systems}, - volume={35}, - pages={478--491}, - year={2022} -} - @article{wolter2022wavelet, title={Wavelet-packets for deepfake image analysis and detection}, author={Wolter, Moritz and Blanke, Felix and Heese, Raoul and Garcke, Jochen}, @@ -80,88 +9,6 @@ @article{wolter2022wavelet publisher={Springer} } -@article{heusel2017gans, - title={Gans trained by a two time-scale update rule converge to a local nash equilibrium}, - author={Heusel, Martin and Ramsauer, Hubert and Unterthiner, Thomas and Nessler, Bernhard and Hochreiter, Sepp}, - journal={Advances in neural information processing systems}, - volume={30}, - year={2017} -} - -@inproceedings{ho20ddpm, - author = {Jonathan Ho and Ajay Jain and Pieter Abbeel}, - editor = {Hugo Larochelle and Marc'Aurelio Ranzato and Raia Hadsell and Maria{-}Florina Balcan and Hsuan{-}Tien Lin}, - title = {Denoising Diffusion Probabilistic Models}, - booktitle = {Advances in Neural Information Processing Systems 33: Annual Conference - on Neural Information Processing Systems 2020, NeurIPS 2020, December - 6-12, 2020, virtual}, - year = {2020}, -} - -@inproceedings{song2021ddim, - author = {Jiaming Song and - Chenlin Meng and - Stefano Ermon}, - title = {Denoising Diffusion Implicit Models}, - booktitle = {9th International Conference on Learning Representations, {ICLR} 2021, - Virtual Event, Austria, May 3-7, 2021}, - year = {2021} -} - -@InProceedings{nichol2021improvdiff, - title = {Improved Denoising Diffusion Probabilistic Models}, - author = {Nichol, Alexander Quinn and Dhariwal, Prafulla}, - booktitle = {Proceedings of the 38th International Conference on Machine Learning}, - pages = {8162--8171}, - year = {2021}, - volume = {139}, - series = {Proceedings of Machine Learning Research}, - month = {18--24 Jul}, - publisher = {PMLR}, -} - -@article{Peebles2022DiT, - title={Scalable Diffusion Models with Transformers}, - author={William Peebles and Saining Xie}, - year={2022}, - journal={arXiv preprint arXiv:2212.09748}, -} - -@inproceedings{xiao2022tackling, - title={Tackling the Generative Learning Trilemma with Denoising Diffusion GANs}, - author={Zhisheng Xiao and Karsten Kreis and Arash Vahdat}, - booktitle={International Conference on Learning Representations}, - year={2022} -} - -@inproceedings{Phung23WaveDiff, - author = {Hao Phung and - Quan Dao and - Anh Tran}, - title = {Wavelet Diffusion Models are fast and scalable Image Generators}, - booktitle = {{IEEE/CVF} Conference on Computer Vision and Pattern Recognition, - {CVPR} 2023, Vancouver, BC, Canada, June 17-24, 2023}, - pages = {10199--10208}, - publisher = {{IEEE}}, - year = {2023}, - url = {https://doi.org/10.1109/CVPR52729.2023.00983}, - doi = {10.1109/CVPR52729.2023.00983}, - timestamp = {Sun, 03 Sep 2023 16:10:50 +0200}, - biburl = {https://dblp.org/rec/conf/cvpr/PhungDT23.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -} - -@inproceedings{goodfellow14adversarial, - author = {Ian J. Goodfellow and - Jonathon Shlens and - Christian Szegedy}, - editor = {Yoshua Bengio and - Yann LeCun}, - title = {Explaining and Harnessing Adversarial Examples}, - booktitle = {3rd International Conference on Learning Representations, {ICLR} 2015, - San Diego, CA, USA, May 7-9, 2015, Conference Track Proceedings}, - year = {2015}, -} @article{Mallat89Wavelet, author = {St{\'{e}}phane Mallat}, @@ -187,121 +34,6 @@ @article{gal2021swagan articleno = {134} } -@book{Daubechies92Ten, -author = {Daubechies, Ingrid}, -title = {Ten Lectures on Wavelets}, -publisher = {Society for Industrial and Applied Mathematics}, -year = {1992}, -} - -@inproceedings{williams2018wavelet, - title={Wavelet pooling for convolutional neural networks}, - author={Williams, Travis and Li, Robert}, - booktitle={International conference on learning representations}, - year={2018} -} - -@inproceedings{wolter2021adaptive, - title={Adaptive wavelet pooling for convolutional neural networks}, - author={Wolter, Moritz and Garcke, Jochen}, - booktitle={International Conference on Artificial Intelligence and Statistics}, - pages={1936--1944}, - year={2021}, - organization={PMLR} -} - -@inproceedings{rahaman2019spectral, - title={On the spectral bias of neural networks}, - author={Rahaman, Nasim and Baratin, Aristide and Arpit, Devansh and Draxler, Felix and Lin, Min and Hamprecht, Fred and Bengio, Yoshua and Courville, Aaron}, - booktitle={International Conference on Machine Learning}, - pages={5301--5310}, - year={2019}, - organization={PMLR} -} - -@article{li2022wavelet, - title={Wavelet transform-assisted adaptive generative modeling for colorization}, - author={Li, Jin and Li, Wanyun and Xu, Zichen and Wang, Yuhao and Liu, Qiegen}, - journal={IEEE Transactions on Multimedia}, - year={2022}, - publisher={IEEE} -} - -@inproceedings{saragadam2023wire, - title={Wire: Wavelet implicit neural representations}, - author={Saragadam, Vishwanath and LeJeune, Daniel and Tan, Jasper and Balakrishnan, Guha and Veeraraghavan, Ashok and Baraniuk, Richard G}, - booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, - pages={18507--18516}, - year={2023} -} - -@misc{HuggingfaceEval, - title = {Evaluating Diffusion Models}, - howpublished = {\url{https://huggingface.co/docs/diffusers/conceptual/evaluation}}, - note = {Accessed: 2023-10-24}, - year = {2023}, -} - -@misc{EarthOcean, - title = {Ocean world Earth}, - author = {NASA, Apollo 11}, - howpublished = {\url{https://commons.wikimedia.org/wiki/File:Ocean_world_Earth.jpg}}, - year = {1969}, - note = {Accessed: 2023-10-31}, - -} - -@misc{EinsteinChaplin, - title = {Albert Einstein and Charlie Chaplin City Lights premiere 1931}, - author = {Photoplay Publishing}, - howpublished = {\url{https://commons.wikimedia.org/wiki/File:Albert_Einstein_and_Charlie_Chaplin_City_Lights_premiere_1931.jpg}}, - year = {1931}, - note = {Accessed: 2023-11-09}, -} - -@inproceedings{karras2019style, - title={A style-based generator architecture for generative adversarial networks}, - author={Karras, Tero and Laine, Samuli and Aila, Timo}, - booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, - pages={4401--4410}, - year={2019} -} - -@inproceedings{karras2020analyzing, - title={Analyzing and improving the image quality of stylegan}, - author={Karras, Tero and Laine, Samuli and Aittala, Miika and Hellsten, Janne and Lehtinen, Jaakko and Aila, Timo}, - booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, - pages={8110--8119}, - year={2020} -} - -@article{karras2021alias, - title={Alias-free generative adversarial networks}, - author={Karras, Tero and Aittala, Miika and Laine, Samuli and H{\"a}rk{\"o}nen, Erik and Hellsten, Janne and Lehtinen, Jaakko and Aila, Timo}, - journal={Advances in Neural Information Processing Systems}, - volume={34}, - pages={852--863}, - year={2021} -} - - -@inproceedings{arjovsky2017wasserstein, - title={Wasserstein generative adversarial networks}, - author={Arjovsky, Martin and Chintala, Soumith and Bottou, L{\'e}on}, - booktitle={International conference on machine learning}, - pages={214--223}, - year={2017}, - organization={PMLR} -} - -@inproceedings{szegedy2016rethinking, - title={Rethinking the inception architecture for computer vision}, - author={Szegedy, Christian and Vanhoucke, Vincent and Ioffe, Sergey and Shlens, Jon and Wojna, Zbigniew}, - booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition}, - pages={2818--2826}, - year={2016} -} - @article{lee2019pywavelets, title={PyWavelets: A Python package for wavelet analysis}, author={Lee, Gregory and Gommers, Ralf and Waselewski, Filip and Wohlfahrt, Kai and O'Leary, Aaron}, @@ -329,32 +61,6 @@ @phdthesis{Wolter21Recurrent url = {https://hdl.handle.net/20.500.11811/9245} } -@inproceedings{liu2015faceattributes, - title = {Deep Learning Face Attributes in the Wild}, - author = {Liu, Ziwei and Luo, Ping and Wang, Xiaogang and Tang, Xiaoou}, - booktitle = {Proceedings of International Conference on Computer Vision (ICCV)}, - month = {December}, - year = {2015} -} - -@inproceedings{karras2018progGAN, - author = {Tero Karras and - Timo Aila and - Samuli Laine and - Jaakko Lehtinen}, - title = {Progressive Growing of GANs for Improved Quality, Stability, and Variation}, - booktitle = {6th International Conference on Learning Representations, {ICLR} 2018, - Vancouver, BC, Canada, April 30 - May 3, 2018, Conference Track Proceedings}, - year = {2018} -} - -@inproceedings{zhang2022styleswin, - title={Styleswin: Transformer-based gan for high-resolution image generation}, - author={Zhang, Bowen and Gu, Shuyang and Zhang, Bo and Bao, Jianmin and Chen, Dong and Wen, Fang and Wang, Yong and Guo, Baining}, - booktitle={Proceedings of the IEEE/CVF conference on computer vision and pattern recognition}, - pages={11304--11314}, - year={2022} -} @book{mallat1999wavelet, title={A wavelet tour of signal processing}, @@ -397,32 +103,6 @@ @article{imagenet15russakovsky pages={211-252} } -@article{Yu2015LSUNCO, - title={LSUN: Construction of a Large-scale Image Dataset using Deep Learning with Humans in the Loop}, - author={Fisher Yu and Yinda Zhang and Shuran Song and Ari Seff and Jianxiong Xiao}, - journal={ArXiv}, - year={2015}, - volume={abs/1506.03365}, - url={https://api.semanticscholar.org/CorpusID:8317437} -} - -@article{krizhevsky2009learning, - title={Learning multiple layers of features from tiny images}, - author={Krizhevsky, Alex and Hinton, Geoffrey and others}, - year={2009}, - publisher={Toronto, ON, Canada} -} - -@inproceedings{chong20fidbash, - author = {Min Jin Chong and - David A. Forsyth}, - title = {Effectively Unbiased {FID} and Inception Score and Where to Find Them}, - booktitle = {2020 {IEEE/CVF} Conference on Computer Vision and Pattern Recognition, - {CVPR} 2020, Seattle, WA, USA, June 13-19, 2020}, - pages = {6069--6078}, - publisher = {Computer Vision Foundation / {IEEE}}, - year = {2020} -} @article{huang2022anisotropic, title={Anisotropic multiresolution analyses for deep fake detection}, @@ -430,121 +110,3 @@ @article{huang2022anisotropic journal={arXiv preprint arXiv:2210.14874}, year={2022} } - -@inproceedings{parmar2022aliased, - title={On aliased resizing and surprising subtleties in gan evaluation}, - author={Parmar, Gaurav and Zhang, Richard and Zhu, Jun-Yan}, - booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition}, - pages={11410--11420}, - year={2022} -} - -@article{salimans2016improved, - title={Improved techniques for training gans}, - author={Salimans, Tim and Goodfellow, Ian and Zaremba, Wojciech and Cheung, Vicki and Radford, Alec and Chen, Xi}, - journal={Advances in neural information processing systems}, - volume={29}, - year={2016} -} - -@inproceedings{Luzi2023Evaluating, - author = {Lorenzo Luzi and - Carlos Ortiz Marrero and - Nile Wynar and - Richard G. Baraniuk and - Michael J. Henry}, - title = {Evaluating generative networks using Gaussian mixtures of image features}, - booktitle = {{IEEE/CVF} Winter Conference on Applications of Computer Vision, {WACV} - 2023, Waikoloa, HI, USA, January 2-7, 2023}, - pages = {279--288}, - publisher = {{IEEE}}, - year = {2023}, - url = {https://doi.org/10.1109/WACV56688.2023.00036}, - doi = {10.1109/WACV56688.2023.00036}, - timestamp = {Tue, 14 Feb 2023 22:26:55 +0100}, - biburl = {https://dblp.org/rec/conf/wacv/LuziMWBH23.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -} - -@inproceedings{Kynkaat2023TheRole, - author = {Tuomas Kynk{\"{a}}{\"{a}}nniemi and - Tero Karras and - Miika Aittala and - Timo Aila and - Jaakko Lehtinen}, - title = {The Role of ImageNet Classes in Fr{\'{e}}chet Inception Distance}, - booktitle = {The Eleventh International Conference on Learning Representations, - {ICLR} 2023, Kigali, Rwanda, May 1-5, 2023}, - publisher = {OpenReview.net}, - year = {2023}, - url = {https://openreview.net/pdf?id=4oXTQ6m\_ws8}, - timestamp = {Fri, 30 Jun 2023 14:55:53 +0200}, - biburl = {https://dblp.org/rec/conf/iclr/KynkaanniemiKAA23.bib}, - bibsource = {dblp computer science bibliography, https://dblp.org} -} - -@inproceedings{naeem2020reliable, - title={Reliable fidelity and diversity metrics for generative models}, - author={Naeem, Muhammad Ferjad and Oh, Seong Joon and Uh, Youngjung and Choi, Yunjey and Yoo, Jaejun}, - booktitle={International Conference on Machine Learning}, - pages={7176--7185}, - year={2020}, - organization={PMLR} -} - -@book{strang2006linear, - address = {Belmont, CA}, - author = {Strang, Gilbert}, - isbn = {0030105676 9780030105678 0534422004 9780534422004}, - publisher = {Thomson, Brooks/Cole}, - refid = {61231077}, - timestamp = {2014-09-12T13:40:38.000+0200}, - title = {Linear algebra and its applications}, - year = 2006 -} - -@article{dzanic2020fourier, - title={Fourier spectrum discrepancies in deep network generated images}, - author={Dzanic, Tarik and Shah, Karan and Witherden, Freddie}, - journal={Advances in neural information processing systems}, - volume={33}, - pages={3022--3032}, - year={2020} -} - -@article{wang2004image, - title={Image quality assessment: from error visibility to structural similarity}, - author={Wang, Zhou and Bovik, Alan C and Sheikh, Hamid R and Simoncelli, Eero P}, - journal={IEEE transactions on image processing}, - volume={13}, - number={4}, - pages={600--612}, - year={2004}, - publisher={IEEE} -} - -@article{scikit-image, - title = {scikit-image: image processing in {P}ython}, - author = {van der Walt, {S}t\'efan and {S}ch\"onberger, {J}ohannes {L}. and - {Nunez-Iglesias}, {J}uan and {B}oulogne, {F}ran\c{c}ois and {W}arner, - {J}oshua {D}. and {Y}ager, {N}eil and {G}ouillart, {E}mmanuelle and - {Y}u, {T}ony and the scikit-image contributors}, - year = {2014}, - month = {6}, - keywords = {Image processing, Reproducible research, Education, - Visualization, Open source, Python, Scientific programming}, - volume = {2}, - pages = {e453}, - journal = {PeerJ}, - issn = {2167-8359}, - url = {https://doi.org/10.7717/peerj.453}, - doi = {10.7717/peerj.453} -} - -@inproceedings{saharia2022palette, - title={Palette: Image-to-image diffusion models}, - author={Saharia, Chitwan and Chan, William and Chang, Huiwen and Lee, Chris and Ho, Jonathan and Salimans, Tim and Fleet, David and Norouzi, Mohammad}, - booktitle={ACM SIGGRAPH 2022 Conference Proceedings}, - pages={1--10}, - year={2022} -} From e1cacd5e23cfd7ecc717d484344667170681dd08 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 11 Jan 2024 15:23:52 +0100 Subject: [PATCH 08/39] wavelet intro update. --- docs/intro.rst | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index 8bf19739..7adb020f 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,8 +1,8 @@ Understanding wavelets ====================== -This supplementary section summarizes key wavelet facts as a convenience for the hasty reader. -See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. +This text summarizes key wavelet facts as a convenience for the hasty reader. +See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. This text is based on the supplementary material of :cite:`wolter2022wavelet`. The fwt relies on convolution operations with filter pairs. @@ -56,15 +56,18 @@ We construct filter quadruples from the original filter pairs to process two-dim With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. We can construct a wpt-tree for images with these two-dimensional filters. +.. _fig-wpt2d: -.. image:: figures/packets_2d.png +.. figure:: figures/packets_2d.png :scale: 45 % :alt: 2d wavelet packet transform computation diagram. :align: center -Two dimensional \acf{wpt} computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and + 2d wavelet packet transform computation diagram. + +Two dimensional wavelet packet computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and reconstruction respectively. -Figure~\ref{fig:wpt2d} illustrates the computation of a full two-dimensional wavelet packet tree. +:numref:`fig-wpt2d` illustrates the computation of a full two-dimensional wavelet packet tree. More formally, the process initially evaluates .. math:: @@ -87,6 +90,8 @@ and alias cancellation conditions to satisfy both requirements. For an analysis Similarly +.. _eq-alias: + .. math:: F_\mathcal{L}(z)H_\mathcal{L}(-z) + F_\mathcal{H}(z)H_\mathcal{H}(-z) = 0 @@ -94,24 +99,29 @@ guarantees alias cancellation. Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Symlets appear in this paper. +.. _fig-sym6: + .. figure:: figures/sym6.png :scale: 45 % :alt: sym6 filter values :align: center + + Visualization of the Symlet 6 filter coefficients. -Visualization of the Symlet 6 filter coefficients. +bla bla +.. _fig-db6: .. figure:: figures/db6.png :scale: 45 % :alt: 2d wavelet packet transform computation diagram. :align: center -Visualization of the Daubechies 6 filter coefficients. + Visualization of the Daubechies 6 filter coefficients. -Figures~\ref{fig:sym6_vis} and \ref{fig:db6_vis} visualize the Daubechies and Symlet filters of 6th degree. -Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. Figure~\ref{fig:sym6_vis} illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in Figure~\ref{fig:db6_vis}. -Consider the sign patterns in Figure~\ref{fig:db6_vis}. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` and :math:`F_\mathcal{H} = -H_\mathcal{L}(-z)` into equation~\ref{eq:alias_cancellation} :cite:`strang1996wavelets`. :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. +:numref:`fig-sym6` and :numref:`fig-db6` visualize the Daubechies and Symlet filters of 6th degree. +Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. :numref:`fig-sym6` illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in :numref:`fig-db6`. +Consider the sign patterns in :numref:`fig-db6`. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` and :math:`F_\mathcal{H} = -H_\mathcal{L}(-z)` into the perfect reconstruction condition :cite:`strang1996wavelets`. :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. From 700ee7a19b39ddc02ee26d87bb93ae7384041197 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 11 Jan 2024 15:49:56 +0100 Subject: [PATCH 09/39] intro update. --- docs/intro.rst | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index 7adb020f..f5de85cc 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -19,16 +19,15 @@ The fwt relies on convolution operations with filter pairs. :numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{L}` denotes the analysis low-pass filter. :math:`\mathbf{h}_\mathcal{H}` the analysis high pass filter. :math:`\mathbf{f}_\mathcal{L}` and :math:`\mathbf{f}_\mathcal{H}` the synthesis filer pair. :math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. The synthesis or inverse transform on the right works with stride two transposed convolutions. :math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{L}, \mathcal{H}]` denote the corresponding convolution operators. - .. math:: \mathbf{x}_s * \mathbf{h}_k = \mathbf{c}_{k, s+1} with :math:`k \in [\mathcal{L}, \mathcal{H}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to the original input signal :math:`\mathbf{x}`. At higher scales, the fwt uses the low-pass filtered result as input, :math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{L}, s}` if :math:`s > 0`. -The dashed arrow indicates that we could continue to expand the fwt tree here. +The dashed arrow indicates that we could continue to expand the fwt tree here. :py:meth:`ptwt.conv_transform.wavedec` implements this transformation. -The wpt additionally expands the high-frequency part of the tree. +The wavelet packet transform (pwt) additionally expands the high-frequency part of the tree. The figure below depicts the idea. .. _fig-wpt: @@ -39,12 +38,13 @@ The wpt additionally expands the high-frequency part of the tree. Scematic drawing of the full wpt in a single dimension. Compared to figure~\ref{fig:fwt}, the high-pass filtered side of the tree is expanded, too. -A comparison of :numref:`fig-fwt` and :numref:`fig-wpt` illustrates this difference. Whole expansion is not the only possible way to construct a wavelet packet tree. See :cite:`jensen2001ripples` for a discussion of other options. -In both figures, capital letters denote convolution operators. These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. -The matrix nature of these operators explains the capital boldface notation. -Coefficient subscripts record the path that leads to a particular coefficient. +In :numref:`fig-fwt` and :numref:`fig-wpt`, capital letters denote convolution operators. These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. +The matrix nature of these operators explains the capital boldface notation. Coefficient subscripts record the path that leads to a particular coefficient. +:py:meth:`ptwt.packets.WaveletPacket` provides this functionality for single dimensional inputs. + +This toolbox provides two dimensional input processing functionality. We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products :cite:`vyas2018multiscale`: .. math:: @@ -54,6 +54,10 @@ We construct filter quadruples from the original filter pairs to process two-dim \mathbf{h}_{d} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{H}^T With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. + +*TODO*: Describe the two dimensional fwt + + We can construct a wpt-tree for images with these two-dimensional filters. .. _fig-wpt2d: @@ -63,7 +67,7 @@ We can construct a wpt-tree for images with these two-dimensional filters. :alt: 2d wavelet packet transform computation diagram. :align: center - 2d wavelet packet transform computation diagram. + Two dimensional wavelet packet transform computation diagram. Two dimensional wavelet packet computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and reconstruction respectively. @@ -108,7 +112,6 @@ Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Visualization of the Symlet 6 filter coefficients. -bla bla .. _fig-db6: From a7556f69e1b503418e9937335cc2f9854a6f66bc Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Wed, 17 Jan 2024 19:15:05 +0100 Subject: [PATCH 10/39] source code comments. --- src/ptwt/continuous_transform.py | 1 + src/ptwt/conv_transform_2.py | 1 + src/ptwt/conv_transform_3.py | 1 + src/ptwt/matmul_transform_3.py | 2 ++ src/ptwt/separable_conv_transform.py | 1 + 5 files changed, 6 insertions(+) diff --git a/src/ptwt/continuous_transform.py b/src/ptwt/continuous_transform.py index 061795f9..d91ccb1f 100644 --- a/src/ptwt/continuous_transform.py +++ b/src/ptwt/continuous_transform.py @@ -2,6 +2,7 @@ This module is based on pywt's cwt implementation. """ +# Written by the Pytorch wavelet toolbox team in 2024 from typing import Any, Tuple, Union import numpy as np diff --git a/src/ptwt/conv_transform_2.py b/src/ptwt/conv_transform_2.py index 3b9f0bd6..b933f727 100644 --- a/src/ptwt/conv_transform_2.py +++ b/src/ptwt/conv_transform_2.py @@ -3,6 +3,7 @@ The implementation relies on torch.nn.functional.conv2d and torch.nn.functional.conv_transpose2d under the hood. """ +# Written by the Pytorch wavelet toolbox team in 2024 from functools import partial diff --git a/src/ptwt/conv_transform_3.py b/src/ptwt/conv_transform_3.py index 31d8061d..dc82cee4 100644 --- a/src/ptwt/conv_transform_3.py +++ b/src/ptwt/conv_transform_3.py @@ -2,6 +2,7 @@ The functions here are based on torch.nn.functional.conv3d and it's transpose. """ +# Written by the Pytorch wavelet toolbox team in 2024 from functools import partial from typing import Dict, List, Optional, Sequence, Tuple, Union, cast diff --git a/src/ptwt/matmul_transform_3.py b/src/ptwt/matmul_transform_3.py index f27f3dbb..cbf02de8 100644 --- a/src/ptwt/matmul_transform_3.py +++ b/src/ptwt/matmul_transform_3.py @@ -1,4 +1,6 @@ """Implement 3D separable boundary transforms.""" +# Written by the Pytorch wavelet toolbox team in 2024 + import sys from functools import partial from typing import Dict, List, NamedTuple, Optional, Tuple, Union diff --git a/src/ptwt/separable_conv_transform.py b/src/ptwt/separable_conv_transform.py index 5f82e77b..1cd1a322 100644 --- a/src/ptwt/separable_conv_transform.py +++ b/src/ptwt/separable_conv_transform.py @@ -6,6 +6,7 @@ Under the hood, code in this module transforms all dimensions using torch.nn.functional.conv1d and it's transpose. """ +# Written by the Pytorch wavelet toolbox team in 2024 from functools import partial from typing import Dict, List, Optional, Tuple, Union From 2520a9175f2de8a9911b9d5a5e92b4eba25b7192 Mon Sep 17 00:00:00 2001 From: "moritz@wolter.tech" Date: Tue, 23 Jan 2024 17:37:56 +0100 Subject: [PATCH 11/39] inverse swt alpha support. --- src/ptwt/_stationary_transform.py | 97 ++++++++++++++++++++++++++++--- src/ptwt/conv_transform.py | 2 +- tests/test_swt.py | 41 +++++++++++-- 3 files changed, 127 insertions(+), 13 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 1aa78e4c..9e3115ac 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -5,14 +5,15 @@ import pywt import torch -from src.ptwt._util import Wavelet -from src.ptwt.conv_transform import _get_filter_tensors +from src.ptwt._util import Wavelet, _as_wavelet +from src.ptwt.conv_transform import _get_filter_tensors, _preprocess_result_list_rec1d def _swt( data: torch.Tensor, wavelet: Union[Wavelet, str], level: Optional[int] = None, + axis: Optional[int] = -1, ) -> List[torch.Tensor]: """Compute a multilevel 1d stationary wavelet transform. @@ -24,7 +25,16 @@ def _swt( Returns: List[torch.Tensor]: Same as wavedec. Equivalent to pywt.swt with trim_approx=True. + + Raises: + ValueError: Is the axis argument is not an integer. """ + if axis != -1: + if isinstance(axis, int): + data = data.swapaxes(axis, -1) + else: + raise ValueError("swt transforms a single axis only.") + if data.dim() == 1: # assume time series data = data.unsqueeze(0).unsqueeze(0) @@ -41,7 +51,7 @@ def _swt( if level is None: level = pywt.swt_max_level(data.shape[-1]) - result_lst = [] + result_list = [] res_lo = data for current_level in range(level): dilation = 2**current_level @@ -50,7 +60,80 @@ def _swt( res = torch.nn.functional.conv1d(res_lo, filt, stride=1, dilation=dilation) res_lo, res_hi = torch.split(res, 1, 1) # Trim_approx == False - # result_lst.append((res_lo.squeeze(1), res_hi.squeeze(1))) - result_lst.append(res_hi.squeeze(1)) - result_lst.append(res_lo.squeeze(1)) - return result_lst[::-1] + # result_list.append((res_lo.squeeze(1), res_hi.squeeze(1))) + result_list.append(res_hi.squeeze(1)) + result_list.append(res_lo.squeeze(1)) + + if axis != -1: + result_list = [coeff.swapaxes(axis, -1) for coeff in result_list] + + return result_list[::-1] + + +def _conv_transpose_dedilate( + conv_res: torch.Tensor, + rec_filt: torch.Tensor, + dilation: int, + length: int, +) -> torch.Tensor: + """Undo the forward dilated convolution from the analysis transform. + + Args: + conv_res (torch.Tensor): The dilated coeffcients + of shape [batch, 2, length]. + rec_filt (torch.Tensor): The reconstruction filter pair + of shape [1, 2, filter_length]. + dilation (int): The dilation factor. + length (int): The signal length. + + Returns: + torch.Tensor: The deconvolution result. + """ + to_conv_t_list = [ + conv_res[..., fl : (fl + dilation * rec_filt.shape[-1]) : dilation] + for fl in range(length) + ] + to_conv_t = torch.cat(to_conv_t_list, 0) + rec = torch.nn.functional.conv1d( + to_conv_t, + rec_filt.swapaxes(0, 1), + stride=1, + ) + return rec.swapaxes(0, -1) / 2.0 + + +def _iswt(coeffs, wavelet, axis=-1): + if axis != -1: + swap = [] + if isinstance(axis, int): + for coeff in coeffs: + swap.append(coeff.swapaxes(axis, -1)) + coeffs = swap + else: + raise ValueError("iswt transforms a single axis only.") + + ds = None + length = coeffs[0].shape[-1] + if coeffs[0].ndim > 2: + coeffs, ds = _preprocess_result_list_rec1d(coeffs) + + wavelet = _as_wavelet(wavelet) + # unlike pytorch lax's transpose conv requires filter flips. + _, _, rec_lo, rec_hi = _get_filter_tensors( + wavelet, flip=True, dtype=coeffs[0].dtype, device=coeffs[0].device + ) + filt_len = rec_lo.shape[-1] + rec_filt = torch.stack([rec_lo, rec_hi], 0) + + res_lo = coeffs[0] + for c_pos, res_hi in enumerate(coeffs[1:]): + dilation = 2 ** (len(coeffs[1:]) - c_pos - 1) + res_lo = torch.stack([res_lo, res_hi], 1) + padl, padr = dilation * (filt_len // 2), dilation * (filt_len // 2 - 1) + res_lo = torch.nn.functional.pad(res_lo, (padl, padr), mode="circular") + res_lo = _conv_transpose_dedilate( + res_lo, rec_filt, dilation=dilation, length=length + ) + res_lo = res_lo.squeeze(1) + + return res_lo diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index f2f9a1db..475f3aa3 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -269,7 +269,7 @@ def wavedec( """Compute the analysis (forward) 1d fast wavelet transform. The transformation relies on convolution operations with filter - pairs. + pairs. .. math:: x_s * h_k = c_{k,s+1} diff --git a/tests/test_swt.py b/tests/test_swt.py index 1266f781..f1f08e27 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -5,19 +5,50 @@ import pywt import torch -from src.ptwt._stationary_transform import _swt +from src.ptwt._stationary_transform import _iswt, _swt -@pytest.mark.slow -@pytest.mark.parametrize("size", [32, 64]) -@pytest.mark.parametrize("wavelet", ["db1", "db2"]) # TODO: explore lonnger wavelets. @pytest.mark.parametrize("level", [1, 2, None]) +@pytest.mark.parametrize("size", [32, 64]) +@pytest.mark.parametrize("wavelet", ["db1", "db2"]) def test_swt_1d(level, size, wavelet): """Test the 1d swt.""" - signal = np.expand_dims(np.arange(size).astype(np.float64), 0) + # signal = np.expand_dims(np.arange(size).astype(np.float64), 0) + signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) pywt_coeff = pywt.swt(signal, wavelet, level, trim_approx=True, norm=False) test_list = [] for a, b in zip(ptwt_coeff, pywt_coeff): test_list.extend([np.allclose(ael.numpy(), bel) for ael, bel in zip(a, b)]) assert all(test_list) + + +@pytest.mark.parametrize("level", [1, 2, None]) +@pytest.mark.parametrize("size", [32, 64]) +@pytest.mark.parametrize("wavelet", ["db1", "db2"]) +def test_iswt_1d(level, size, wavelet): + """Ensure iswt inverts swt.""" + signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) + ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) + rec = _iswt(ptwt_coeff, wavelet) + assert np.allclose(rec.numpy(), signal) + + +@pytest.mark.parametrize("size", [64, 128, 256]) +@pytest.mark.parametrize("wavelet", ["db1", "db2", "sym5"]) +@pytest.mark.parametrize("level", [1, 2, 3]) # TODO: None +@pytest.mark.parametrize("axis", [1, -1]) +def test_swt_1d_slow(level, size, wavelet, axis): + """Test the 1d swt.""" + # signal = np.expand_dims(np.arange(size).astype(np.float64), 0) + signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) + ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level, axis=axis) + pywt_coeff = pywt.swt( + signal, wavelet, level, trim_approx=True, norm=False, axis=axis + ) + test_list = [] + for a, b in zip(ptwt_coeff, pywt_coeff): + test_list.extend([np.allclose(ael.numpy(), bel) for ael, bel in zip(a, b)]) + assert all(test_list) + rec = _iswt(ptwt_coeff, wavelet, axis=axis) + assert np.allclose(rec.numpy(), signal) From c942401b29d51f12939eaa76a7fea14f4a3f4c3b Mon Sep 17 00:00:00 2001 From: "moritz@wolter.tech" Date: Tue, 23 Jan 2024 18:01:31 +0100 Subject: [PATCH 12/39] fix types. --- src/ptwt/_stationary_transform.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 9e3115ac..cf87bd14 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -102,7 +102,9 @@ def _conv_transpose_dedilate( return rec.swapaxes(0, -1) / 2.0 -def _iswt(coeffs, wavelet, axis=-1): +def _iswt(coeffs: List[torch.Tensor], + wavelet: Union[pywt.Wavelet, str], + axis: int=-1) -> torch.Tensor: if axis != -1: swap = [] if isinstance(axis, int): @@ -118,7 +120,6 @@ def _iswt(coeffs, wavelet, axis=-1): coeffs, ds = _preprocess_result_list_rec1d(coeffs) wavelet = _as_wavelet(wavelet) - # unlike pytorch lax's transpose conv requires filter flips. _, _, rec_lo, rec_hi = _get_filter_tensors( wavelet, flip=True, dtype=coeffs[0].dtype, device=coeffs[0].device ) From 2541bddb3b5dc45144ee47301e53722a1765cbac Mon Sep 17 00:00:00 2001 From: "moritz@wolter.tech" Date: Tue, 23 Jan 2024 18:05:26 +0100 Subject: [PATCH 13/39] improve formatting. --- src/ptwt/_stationary_transform.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index cf87bd14..8141fe6e 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -102,9 +102,9 @@ def _conv_transpose_dedilate( return rec.swapaxes(0, -1) / 2.0 -def _iswt(coeffs: List[torch.Tensor], - wavelet: Union[pywt.Wavelet, str], - axis: int=-1) -> torch.Tensor: +def _iswt( + coeffs: List[torch.Tensor], wavelet: Union[pywt.Wavelet, str], axis: int = -1 +) -> torch.Tensor: if axis != -1: swap = [] if isinstance(axis, int): From 8a562eb7c86841007c87f4110ab9eb17479dc77b Mon Sep 17 00:00:00 2001 From: "moritz@wolter.tech" Date: Tue, 23 Jan 2024 18:10:01 +0100 Subject: [PATCH 14/39] authorship. --- src/ptwt/_stationary_transform.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 8141fe6e..5d2028b7 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -1,4 +1,5 @@ """This module implements stationary wavelet transforms.""" +# Created by moritz wolter, in 2024 from typing import List, Optional, Union From c456d36f0ada7267117be82eba0ec910e875c6ee Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Wed, 24 Jan 2024 17:12:05 +0100 Subject: [PATCH 15/39] docs update. --- docs/figures/fwt.pdf | Bin 51901 -> 51762 bytes docs/figures/fwt.png | Bin 9928 -> 9894 bytes docs/figures/fwt_2d.pdf | Bin 0 -> 46871 bytes docs/figures/fwt_2d.png | Bin 0 -> 19526 bytes docs/figures/packets_1d.pdf | Bin 52905 -> 52754 bytes docs/figures/packets_1d.png | Bin 15459 -> 15412 bytes docs/figures/packets_2d.pdf | Bin 46536 -> 46879 bytes docs/figures/packets_2d.png | Bin 18305 -> 19760 bytes docs/intro.rst | 24 ++++++++++++------------ src/ptwt/_stationary_transform.py | 2 +- src/ptwt/conv_transform.py | 6 +++++- 11 files changed, 18 insertions(+), 14 deletions(-) create mode 100644 docs/figures/fwt_2d.pdf create mode 100644 docs/figures/fwt_2d.png diff --git a/docs/figures/fwt.pdf b/docs/figures/fwt.pdf index ab8b6ea1ba32cf76f4fc0e5b1221fce839edb001..cf7182c285531ef6d62bb02708830b8f0c7116a8 100644 GIT binary patch delta 9904 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 NxR7XRWz=Mm{s&2le53#X diff --git a/docs/figures/fwt.png b/docs/figures/fwt.png index eb41f970e2c2036802ac6620975328a412272e06..00da4255d2a8b7075b653c69f345c3847d196de4 100644 GIT binary patch literal 9894 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

Z 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 IP7LP%0IfyGApigX literal 0 HcmV?d00001 diff --git a/docs/figures/fwt_2d.png b/docs/figures/fwt_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..8bad1392c92818486831b41baa3b7ea99627a056 GIT binary patch literal 19526 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 literal 15459 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 diff --git a/docs/figures/packets_2d.pdf b/docs/figures/packets_2d.pdf index 1855126660228b081c916db96019b04f888e1269..a5e928ec3f102280e132551a04715634fd6a12f4 100644 GIT binary patch delta 21694 zcmV)1K+V6%>jIzd0+1sEG%z=lVJ;|t-JHvg+%^`5_x%)vXOmfo;r)W_0>lZjGt!Fz z3=a^vXT}KPAj!gc{rrczks?)MRW&?n8@9Wx{)^)Ic*JulmIeDC6YTp3aqv~*Z^0z< zJXpz`;m%0*{^P?R43h6z(me>SW3cQmMwjt>@Z4Ex0~;LoI%vbBG(d5oj07XkRg^I>t$@ku zNM@VpLTs2zM2ulUacgcgS7|PPqh*6Mo=e=MY4IeQHOc57$mp+MD;UZn7Kn5KukaWP z6E>sj=Sk(V(LA>Si@1vZF^Xi&hB7<`RSc!JlsB^~K@Ss~VTH58mT*MnB2$9f7_=kU zF$CCh8MgGADT^1|n_**>*$@TYWtTN+CdozAuHf^bi8|^Y((;gWHm4eYG;tXc7*~0< z^Aawh9T(9mOQfxh_~yW^1HDM_p#9CL73>?d=0WIP)TEgtS9tZOwpTxoPiIqVxHPz| zSaQ%3zu*wqU5!y9xwP?8`2)~~wo4oF1nJvBlT{eX`hCujjEXBTKQ%EMsh$b+GN+m| zVOgn+oQVVOp}mdl#%HSh{;9K@Csh=>P zAMxiGvIe^y;-|!(WrV~Oa0w3;JVNl8_)Pb}KVS>uNC@M#_v!Cp{?YQfVSeE<_%M(D zp8dq$usyp~z~<`0WHw$3*UPT$T3ss7ZuGFRdMM2{B05uC+_iguBYkm(TgP40ZuWEJ zB~F)D_f6ku&ulv^@Q!2Cw9E%?wZ|?Xk+mut3}u}{IAnD7KI$VjUC)B%9vjY0+i0M? zFHjy9u=$wwMmmXRP1@OhZ)~Lw+l#I9uzdg947J$-CxeF7q9xRL%cBKag(S*oBvCSO z>4G}~L{JqnHKA^Q1|(_yqU1hpm~B3!nIt`UY?eE1@MI&^bjX@vHRnz4K3*UV8ngkQ z7?T5e9sQC2M2r{VlJaIe+EDpI5hd>8AYL|DFSLm3PS?bV%XW% zX4NdZqM@*V*Sqo0&{5bU$fQFG!8AhVxA!>L7e!EJ<3=Cr&<|*`FS+-O;0KY#O~MJgYyA~o7IjE4Ez ztx^x%WA_ch6Dbfw>^pKQ6cGV_YHtM540WsUt!(VJyayCYCaMP@CJ;vQ0e6k+J?AY(6p!cIPEu5zfSCZ~0<1}3s; zNJeE3oFYkBc8sanO*rq@>H5{u7qR5X zgAm@aqvva$KjLH;UhO)b`&xSPevzWLezh=p!wA)O2$T-&7j{b0p{a0R!$>KVkTKQ` zqoNd>RYk+-Re$}v$(tx+E*eI!8%a}tidL83ui8#)lQYeLnhhg@E^QP=#|Sx=7EvBi zH{RdZF`|iU73z*rMV(Yd$LLjm5xh&?c2VDZ8*DqR26Y0|Y#Ak2r#fft89^kF$RBz- zmgTN9ZHiv3>Yh=B+@^S&^^88dqkn24&!^RL^eCG>BO-3FR9VwVaE~YAkT@-W(>+b2 zH0j{#rcq6tj{fCMqtEW-Pfg<4v>L>TPpfJ4mZipX(9733+B`^FAnk%Ji#3HO#d%bB z9VuNyd*<-gg~W?MP2;?nBQvd#rYpy5iC;Vv6SXhXKr+)y+x6~mL;LcHn1~>qmxIYl zi}5?s!iM(zM3f73%2sRw=3#1o=w&*KaaX|f5z{*in3L-N8!+q4a5Js#_C4`w22AJE zNpPK=1n$Fhz@f>Hg1_oN?fN{pKeTYKlWM>wGOfel$-kYa zcNo{x;5`{3Eg-!YeAjVsIP6!PN%|Uek!~t zA;gf>lezC$cse8(x97rZ-q2(R!#_LjrzY-YQVrUKW_vUo6(?oh-fxn<&w*PdD)94U$iIh>s?4^qv2XqTlNnv07HvF5mYPb=@BS8gjej0s}1?a_@zR?@88A`m{0Zb}?v;|aL+tMwJ z26qS+pwR%qA-KB-hu{q~&`39QHx@iVa18_t?oO~kAXtFl8rCQpL5DaV$ zga9;v2z!w8({Bt<~UM}8$m-{FCPa!bmuVkRLHPqP!2=M|#>;Sf4ClKJ3 zqB{ zX5{`;=JA>pAU1MPXJ-%u0muH+pF9`_vVOdGFYbSq>j;5*K)nBD*@7W9wtvR3adY9; zhk#w(Kq~V8U>;rA|MA&@5P+9FJUl{z!T^vf0OVD|8RiyAAzs|{=1eY z^pUwB0PBBmpueRn3w5&j-!T;g@KFnYG7vkbe_taQt_b!7*=T_g*7kqX z9Bn|Jf3X{uX9#a61!}$Vip)l+}8x`UKa4Y_C{cZ6* z(&*oRmas5@+vwjGFYjZ}C(=dgN(|Z>7)$Il!BZ;l*x7V$b`o6XoWqfdKA^7mzGyJ@h0o^k3)Z~5H2`WOT{qBbG7sWNA~x(VZJ z<&s=^bSZh(c9+f%zMIAQq0QEK!ruHlk>vWitf%S+cfaN(|Ev9z} zbFq@``%1>XVvCGtVE^lTMjG7&BV?NwUpr{q503QP*nJXWDMWdrw}+i+FC<9TS~L6v z@2;P4mjTC=)X|e{k(LN#*<&$`rV!HT$rGjd1&25?(^~xBRrr&-^fWbtyE2g^Y3yU#Khl#p1 zY{bKBceUAEy00KpH_TM^6K&TRaf1XEnW+$}y=xI*3x>tgbCx|t`OhLsj0VjG*V68e z5q*e8E`?`4Z_3(?bHV9inVO$)U#Zb?3*S&OoM4U-mMF{23AIj1NivjwW#(m&BMv_F zd5E!(ZH76$#A(A(RK$}t+_>Ql(WRw-=tjxsW3NA;e)40;k~&IQ)F|#t;4dfrGAfM5 zV3pi6DHD$}6somBYb+MyZObCcv68ITrD|NbjWS5FF!}k@Mt1nt4&L}^pq`D$4_V+! zek9@BkU5i>L0~-72fG@7-sU@70u0lgBn+NiETKbMpw5Un5o_9=I=KT8;{d(0#}Z#N zV>4s`w#wua`Fl){_)r}q@x9rocbQR<rfD?ZshyM;QBQ!B@I z#p+BPoIuU;B3lQs7#k_ZI46b|f(K%@Nsg?`0uUXxf{ zlnf-)J&lpXuV)LsBd#2V55FhU2u{Vi zV$tUO=JIy?c{oc%ss>AqP#sYd(FcU_@-3PvjK<&RWs*jJQR7R7+PCbjRRnD`2XlMk z)ltJq@-b1h9L?&dwhk{6;}7~0 z*{H-Tuw!um9NMsm}Dhb#|e%K9j~2os|tN>Lb*6WsyN%V-_PaZk}&)W zCFn}j)}PjY%i}pfs#F-fNR2|NaTnwpe6Cnpa>BlyJ4)_=Gg>-l4+xP+Nj$5g_N|)S zI;E%!-;I4r=ml`39vd{lGv2f(-EGQP+avYRcD zyJ9d}{GWF8}Ij?o2!fhde7GopP>>^^AJpFIJaUhbCNqQ-w;~y+}j=m}BF%U68Kkxlpc6!UMa_|bXRaR$ygDfA4gy<4iV zt}K*~<08#NO1piukqPk8-9x=kXeU zTRtqI$ckY+SH(00@L(=4hEWTd-i8n(PF_|nQ1VA7O3=l88*ZVT`GQ7XOwc*yW1^F` z`bqL-ph`4JaA^kY^Es|3p?#&j7yY`U!GLaWrBJ8}&Xt~hFHrCOIq4#Fzc27IIEJ+n z*U$#8uW}`EY<4q|N~qy8fu0s`qk3h3`npsHzf8$1fZ(%$4J+ZYX6*X2MsJ3vPS>Up z05iwlN?`-+)GOrU6PaTPiIFSVIly4U-2Z}o)7kT!6?9qt?3aXTPk%N2^+WbI*@jFj z;egSmF(bUGRE?7AuXRxs#4|-}#9(Zfn3a@Bw(qdx65MRRjYZzmG@Q=q*fb1(aWQ`z zjw9TbDT0nSVIzKl|9SLsBOT3TRsC^~zM?Q04NDldFqMiiL=1@chH#5DMdQ{pZ0S6!a9-@J z%t~jgyeJ_}SBNo%^&0Zxc1(;VKobi_NszqOr^091WCtToOk1Vr>;iXxqefJvoB;~1 zuCs~3XTk#JQ)B&W1Z`vTSq;yCcOpW#>-mlCquv#LMd`$4#`JX-mYlFTr`cHc<7QXn zx9Jp_8_#CH%tYiMaM9G|knP5?MIlzISYbEnU%FglsS>}#wjExYcZr~uYU&u&suFBh z2!Y5}e#Jp*m=9J*s!3jd_awRXBBuO5(9WZUkqh)RMy`vyG8iIcO~rC#im%Yk?(*`` zX=~1@Z7KRZyu5srNprmS-s$^26?bYI1U_i|q(M)?MQRNoI)cwnH_faNSd6uF-40Jm zDh@|>B}cd?XovPW5M(_NQK2N{kgYbr`r)c=yvvkL`${iXfXI`dzJLy~pmN`)%#24-+|;z}|ay z=?S>hJT~|$Y{UhBsm`i<%@l?eErKso_HD&j{M!9RY5$Wdb-9h^q~RCEH1onJv7{fK zU3*1xdCHB?_GGcVZPPDK@|`tR*`x}C(Pi}C^pmUFQR8N`uZnKX%S%yEmGlD=Fj&)n zQ4w`;eK??b8EvG4Yso!-^R?I;L&UODc!i80Hgc_NPLWuDo<;rbppV7m16N;pc7i)_ zZ$)=ASxiWudC*Y|bzL1-R@U+e;h67>rO>%aP#<6#rmTb4GsK{nx_4+qSRLxK;5BmW z=C`R$WMAgk<}P4>F_E8*Otwp`X82_|L-=QLqJJkpNeuEW(d6qp^O<E7le^**wC%MHKTzaL=R| zSDkR`h!EP?LH$_|_tyeuNseN8VvVFk3*pZh;gg1c2&TBqESt?p7DgVrG3Zqy!p)>^ zLVIZNRzd$e{WFU00aLoAI5>%i!tc|o@~YVb!7pWo)6qEZNVJ8q@D6LmahW}xSOTew zu&2%{2#@?^?bjq$6zg)A8Td?_%s4juCq7BTK&-|1PKw*?-4U;a?q;LsW-Rk@KDp>h zF*kyLeFh@05k5#Jn3qqj#ILD^G$gJ+jth~)`$i%4RBuNK8^%gK_ym>+r$gFpxUG)l z{Y==Zt}*NcigNgO?iZC{BB!kp#HN3upq_GJsmSl@p0enpg0oaoc#@%enP;x!#sHnj7kJBY9(b7MzI zoxrPKZ%*i!xWfGL+C#f*xS^k1UGBB>YsyoJZO}TG4f74|7LVlbLa}9%w%E^~nKpiZ znh&F7OLDya$VH=gyO5ZVoR-CmoT&7T{0pf=D+deG(NlevVcqgl9)i78>Zr05-HIW* zR@3#y&fAF8{lzh~7xuzjp``SEMRii~zXg2JUvv-lo#mt)+sF-0<%nJE(<*hfR_6ue z_jDUG%G4!LnH-!?u3m^kEhCFyGE)k3xOsSl zEqf~|OkfH327iH<5xEokrR+n~XL2$XIwR{0t;-p|@Xx$}yj@J-ueTfK1>FLF_hfy7 zG!uzz4m7U{=YV8@E+C#c)ayRlJiBb1MTBHIIs6=R`+FI4ZkxEc$6B$3qg3KB>imO) zbh(z#Gslak{sMW54+rnyzU)T#-)7Vb9g0#@*J8r`7%P^ zGAAL62x$(VFun1MGw#L&m}c9 zg)}A7l2K(VpmV`jdK@!m)YLSHhv~scOJJe%h8oj&(2dP?b;TQSLvn$Cj>&Jou6wYY zzO6;JLL}eco#6R|O&D|HpbPUo^Hg%@W}LQ}_z!5;pzUa+-;`~-gzLwDub)X(yUNPt z>5b=GC)MPs`^K$1F85eB#dD1)zQ<8;W$e(6D(^Po@hd+K`;HV+q8fYNiK-=Zm5{_Z zKpU&`qS0D^wTwnjZxxv}lZ~$7PC?DwW}dmOo#EGmZX}mlcWD-jkC1Dq$E4Cd&%0b^SGdYE1#*#JO7pBs4ojhLv0873}Mnhezq>`Y#d}wp&eDBS~|2J ztGq%bn^S6aZ`c*YD3-7LhbV|Fq0Devl0F?N7UrkqULE9NrACIy8V0k~zH%i)*K|Vz z8Fp;M*r z4@04k1|19?h}C(Tj~@jsXa=PWrtX%K&@20>c?IOOBN3fR|6?J(+%Rs>wsT_O_P`~ z?$2c%wq z=m^oi)hw^|$jm<9eeq0K+RIB@ci*j_=s0o2=*>f>^X@Fa=k!@PSdBiq0`3+$nqU)I zJ1YUBko#mLb?Vd-lr(7IZ)oGSIR8?WAg*?7$8lkQpJ#vU3P<-#v%T)3TGK`}TO%2I z0BykZO(|7)QoU27)hhgiy86Kzd0$k;yUvmYpzHE5`2)8GIX5M~^7WEk5vrs}$>rz} zfN%jeWJ@0;nm0}6u>!%Tn-e2wN&@Uk%iO48rAgVvbfRg-yT02?MiW4)5hi5oiq$I^ z!s@nvMrtQsEKbqUZ5mPQ9}?Yn6v#UzUC_n+;5#eEFaBYEufJY=FBzb#Z;mn?84Gne zBdq&v%kWZKCK4-m>!+0~=^nD#vx`>4DRzTbv9uZ$h`A{a-4i0+;wMj z>Q-e${=1RWHfzVTIu&B`O6gKkK-F&sdIYNvUgkUV6~8~*M&^F{5fj)wU} zqK|rS$f#N;YwKL)lU&CuyY7*q z=-;GdL1W~JK=hC{hEi92^G{Y&C)KUXv%OgC>v#T?4+pTzgV~=xm7=1b2@TLS<78iT z=)b}5TTr$-0V-9=E8|xkG6^yXAkItha!OWHzW#ONjaFl>i3MyWsmsMR>cBk^RYp{u zTSJ5JE*=5@ipz&PVIp}~j`uySELV#JCj1(>XRGihU5F`el9AGmMm=1y?W2U-1_C)T zvP3g^`A=>B%snNE2r6indA$8mwxyvaa)_Q0m#5{mI4d0MbLA#-l-aY{3v8UE@>gt z0j=#JP}<`559uxB%MuQ0UUxr{%^oD`oH4TW*Xl5TvI#H(cRb96crTOPIJgi}K2@gS zDAp~wd;KzWp7T;QT2kT0RNb{QY=Dk%bkR-SVytduaraYE4#u;=q@O%a6!>30SBMd$ z!#z>OLteAv3M6NXKc&Qf|62Arp&!q0C{_|RdH2Znm6^k3=^RU7CFROmQ8})vN)(X( za0c*eW!5YZ14=-c|dJssY= zOlh&K&{x$x=y@Z0amgQWiIcx4STMEX8$8dWl<&YNdX6Tw?qp-{%_2N9z0GztoU%jHlTSG>~Lz4-sAwUW~bB;&rfq z3Mw%5Mni1kr}v9QcVQwDoz@GV-C+r(Gqff$?yuYyPO4w(8BR6=Kqf3FQbn7Spd&3smgLRxwTH{RQoRB%}0 z(ofD^AN%$}BPMiTDG4*Rm&=#Mi6^mpo)6j)hfAoP!GR z<$e?-2OSK55ujDM9}rPEf7ezoTf_D+G8FF-cGvLJp$3qLKP2EsPF`xJUMvo?lVBm z`3{}xA#)e)^$Iq(ZyT(Jk}iUk)|xcW5qx1t*1DT2{Z&lQ2*Ffvlz3NbE@muv&O&BX zGyky*o0@fm8(FcBT=wqQP~nT$Gw%zMG85$8cf~Ik@^|&QCI6RT8W9s9(Pw)J0^xtX7ti-%(9-9;Y3D zl4bBbE!0VM9T<4>)RO1uI_Q|6DOsC1q$>7Y*q^`a*D*xHp~*cJ8kUWosM#vzK2x{f1Q79UL5}J*=!M7 zI_V2gT(HR;1REgbV$)S{ND_BLVZ7z0d2>i;e>?=s61=P%E18noO4{ z?z8eB_q*Dk-l91BPQoqCE;B)Y=W|Pm0{Mh3*;9TjcG-q+lSl2Vd@{aLu|to9yYdSa z+glD%n%^IR%jX37;5n>dP3G-%SQoHN_tmR{2xNuCC{sqQMP9z!ESu}-@X~cV-RGm# zk@6g&3?6fE*{7Ppj*h377v(TTu z)J4h-=kCW6o|p6>U8bgeGSZ0W<(G{qsnk0uZC3^ea#$r1A*C`V)T&|DPp|w1jc^b* zc0h!Jt)~4wuwsg0-ZtJu~+*JWi=PSan1ek zX-Ql39wJ4O>MZ&dQfe(x<7d&l_B4eh-Y3Q<Maq_1F0>kJ{>)Zb3fj20GI@5PSWU=uE$3`z)$9~~}70|QW4UzS4cW4G0{*12UwIn+mS|2Vu9T0Y@YCke4?sOk@arcVDr=i)2 zD$kuiZx*5uaKNr{gCxocJ8p~Q;T{fJNcESh&iCph_)7a%8cq{3J@E;t|vq@d|0TVOJsc!;W+O-jLA&$z_B8VBB>NPw%6g=R==*SF-BTwZWWCYSlC~h%_r#PoyBd69o^#pZL^Z(#$ zy{zz+;z@kBNBNvN@Zd8I!`gCBziYx8_dS6+ z!S~uQG#-lnPr4;7FjrUtHbxyBt5x(P-|+azoR*?y2w!~7z~x))$rSytlM73dx_R|4 zF4*foW2jE_MmsG|Xr|C$1t|UJGvNY&+DVj){T3l2#H)&Bu^Iy+$2lFv^TFIuW81glIuTC!%-J zOLRg+PxMaI2!ec*!&CIsaGb3yM2g*XHBkx)1c<@=8k?2-;Bl&d%&pSQO+ zFT}-z7wK+)FU`RX@P?xt0D3SFn7bFu7Vv9efEL6B_GdC)0wBP^0q*e!*GJl+ydmx| z02*+HLtzLHbcQFw7Um8>Zw}B`)c|O_!VrIgHU0!}1O7T20GJp2?{a@-|0)DW{7!~I zp-2~32*MYRum{+|onZiNWer}G4~iQALD>EZggASDAkp~{F9_TjVuKF&-8lrHET;>A zpa=YGJP)Wl+!f`)>j8KEH6q`yGU!uQLf9%GU0h%Yln24D{uJTvFev)iefj>}tP=w1 zjqv}=u!AFP?S2hm>*>m8h=99!!c-Oi3PD2ze`EGA6hH_hDk31t4}iG=U_MX>zF*}H zd|hFGzn$P;FnWSOe^;a{zz#hGED&x7L;n%@dqBKk0F=8YEYSZy9sjflz+iwa9Et+i z!0h1&g1@VyVVKa3=MmSR ziT~}Bmq+>l{CU6t9)2MZ01OrZ14Ph^z<*YM(SgAK>H_q4sw%<`2>^rsbc;Twe|7Bj z7XjG+5(fw1pT)G0Xx732?0=Ko93%vSqCepOGu3~m{QnsKtIGdI^8ao~+0)tix10U9 z|Nn7AT;R^We+8gP>xn`OKog0U0phd}@Ez#ohjs4dLrH?skJya*%; zodQ7590;&Ox)c1mW-$=}ALJMG+Y%Cg1Ms1x?D9AAt4BWD|1bpsd=7t`U{L^{*KhM5 zT|qtF-O+9TCKI~lf7!pE1{ll-1|^uCLP8}%9jilI&MW2Uym{6~C2=r!KO35uu~ zblG^e;h87V^~7=a%~ht{=g?XPVG`F&Yu(}Z>tAcCPJ$QIP8oj=Qey|-YKbowIFx;L ze=q-7r3FM^;oMV73@}`wm(ssPfW=Q=-kxUkGvtqBdOJN>L9jmD#L$O-S+GYcyl}v} zZ^C5z!tBlCm~Q)|&y^Dw1<|SYyN_-RY^h{w139UqR>BX8mp6Vt)X(raM6<9uY7SH*K`YY{?x`|b5&nUY~I-F1)EIMrjj&x~2S zoR^N@$;&RD6TOalY~9R%?)2P4c8eYVWrC?n{Z>g`WSjqXiFAj@z^6u`4Q3Dy5x&SlQ-?c=@ehHhzXy zpTFu43@E_JjB@a+o;jf)m1%6b>Ou@x6?p*BB7hw%AET?sihSD`8f5$Sjd}Xhx10tkDCPBKmvDa|zzykBnx78#Z zj%hg)x-Hv(&#p=)z3X1)Fu|IlVkBztW|Vcvg;lCG@t(Ond}Q)dOxFv`*6n6fM8T{? zus`#au?2IkO%gad6RLF;t$NJ|lFG>{`>2 zfexm25)IxqVx?u6Rj$ITes}1JD)StRkgId}1LBr{way3@E7~OBTh2f zOiP|eDh?J27uS)R-L_+_mELy9r)zbOYOH+H>$P+1KAt~B8YL|Q;nSji*00DV`@&no z$@G_~`VRfs9mjap^-N>GwO>)Nc!qyXZt7ZnQJ9L*8~rr(BC>B78@-@{bkIB%{GbEKW^zp~!UdRG=6M21ZUgbOJc({bd+riK&* zUmiz}Obe%b1)h=@3i8WGN)u!C7EcVHxV;4)JzkY8EAtrud0c8}&bSF|VV&1l_! zn$Du4*{bVSx#ptm1o9Lng{QtdGs>E9Cypt}G3KAkjN+sR4BG>Ncj6+Sd4V1#vVMh6~ zje(k1E+ENWh8=ByI&7V-2woN#b3m)cAfTh2qWwx<07;Sce#h9x?I)KIvCn6JEMG&) zSr2JB@4s$3pU!3W9xm8Yd1247 zchK8Rx<@>zzO1!;Miwo0-UthS(cI&RWVu<2FT2;ZHhH|mRqEogA^v6~6btmy(2xqd zwJ(gGw<$3?U|!C$89^C_DTJtbKGfq8ssdRweV;(!1KO6v8B@=n2=lUjKlz$$t}Q z6-K?wiTP-~)Ntj*DPyT`Bh`qNNSV7*utiE&@b1Qmn?p4B9^=Qp!3o06T5l_b23#7g zc=3r1)5lRjTL1=|{29sF-SD~fOfqoIQ{jV?@^i6ay~>X=nR}nS+&u4)2go%{H~BU9 zX>BN0k_%DLS&|q3I2%!aZ3@A9`1q4pOWu_gE;Z$30go?tlO3oc45g1* z+XX$^n_+oplOA*FTIEh-FA(Z@Un})KTQIp~yF`jX*4#=@65Z2RJmV&XsOz99Wv1A$ zHjFs}ncG9TX8err1G#u~?lAuNw!Nn@FQ&Y4|2_7KozdsG@A++l?+12?0Im8W~qmNW~(@(T$Tgb6Ag(IZnce>_B=PVoEVTM;OZz)yRU4UL_G#ff?g(u`TdsPg=&o9Jp3OzFxhVkYJ`PpXSl{d#>>XOw~yugPx#>50Dpbh2YG zmR&7BxelnZo8?hdbg^3I-YEH7E% zjK@@S!htlM9g_w9%(NQm>xqvFcOPC?dQvxUf6}FloA6bLZz(tSn5A4L>aJX2jj9e- zHJ~F^9(kgFw%-ODIw9G5#>!I-dtmf>%n3+UeY&RBXK_fdBYlqPX1Q*icpQ9L-GxEA@tCb9 zD-hfIMBoOebNhIbePaz=IyKMuxNF;QQqNJ&``ojC93sks(i*IE%Q?UuCoT%fe{dJ` zOY&3l=la^2AG9fQcVwTJwa3)Gqg(SOW$*{@EBBTTsK$H#L6%`q z(2rzs4&3%)RZ-vpmJKV zlZBgq{9{Jef~Vw><=3xXm^bJc7@G&OH472H-?_i)P1 z-$EYY)rv8Np3lgT`-G0Ct|-;LsJmNc){fb|lKASZQB9h4i8)F> zp<~gZ3iIfh({XAGE225LP>t4rM@j6bOKGL1w!iLnmO z2%OcBmkaUFnDmLdUyTH9TL^E0IhCleQn2$POq@aqpU?N%-m>QLFkY>FZoQ3TJ`uxz z_WovjXup+dMY;CVc)DGcsC?s;-E3ITLJ>O$MomRJv+lDcpv|}}b*~#&qNPrQu-u0= zPsTSrflD}{I^qx6ac~`<&Z%&!1wxpu_2wq6vg=U91HH`;F;3|-3-NdTH5Wx06*;T* zxX;&sJf%0~qb=+?y`>kAusY2BtDAQfd0e#zB;&@L!@@oXrhibU|Jkq0YDk#B*56Ng zi;uABlZ0=6a^7{%IE>a$StHFC_~LXkR^#BpzFccA>s6BHwI9Vj|L(3`-+!cM&d!qe+ErX9(N^0dCII4CeY0J&0sA6a~%=1_i=Th{&n$K>4 zbn2&ZRp9>F!vT?rxA+>6Qj53F(yXrKP*OK{^+f z^!HqxxI6cAJ@Y-!_s+O)vZI;+-cf^^1a5!F#=Cbd|H6oeeI6P6R3$_1&Vj~yU>GMR zD0j6N{>xY&rVov>Bxt^)NMw3uf^0g$0nViHyd@+z3y-}=%X{Nz`oPqW{8F#G7(X1} zxiB|e%Ez4Lo4w@tlZL^tI^C%_V3qVkxsG9a~!>n7i>n&onqwjFTv1|KE>i30>4fNg7| zQPlO{?c`#Q(&~gb6#**ovr$t*BU4y}fk$Qg1O0D_Pb4!TXBg{HE}Y4WL4prVm! zbhO(Qx|&g!eN#5o{yO3FWzL9Dvej-_u<_3BRcWeW!*ueY^C5EEuNR7U2_$^tuj<)Y z#((=+hPdzor}zyfnLnREl3e`8@*bZ=_|FeaPg~~XbX|`|{m}JO(pp)*NsIHPrRbhk z#FM@#qi|%Om}r9iH)5(gw_i80WWB2fH;|#Da`*(L=33{K=R_vC{oCO`Xs64#;?qVf z4&^1WEQx#V9XGL=r%|j#W}{~I=XU)$MbQHM<^}l`rB{kbfl@<|hHmQ`npN*D=>=Cs8!=b?=(IHy;Q&&w7P2y;mF4t4 z(?^+IZALb};p94mI49$QD>`Dy?1ZKXC&_#UBve|EGapy-;K&_y1?(F!gLIw)fkODL z_;%MX?CQ3Tsolr#;srsG%dNlaP`He6FsyH8Pe&4#2fJL3c~N|AHZV*idwd(|LXaA$0n;p6EvUwMKhg-NHwk42JYMVEB{Ohr|X+=T)~oDgOFgYCm5Xp zO-jVvxQd!%^NrrY9~|{IY8|Zk)*R{O{^lBU3{=okQS>+x@;Yho+Q;?#48pc%%US=@e;kPP1V3r&lA|jWIr#aq}btR%%Gr`EXj$18py=v!L3E{!UwMw9F<*g zJ9A+SHSzh2Mjp$Vjd!`M!EM|^-c7~tgFxr$53X#G2-Hye*!# zsJP1$!W>zz;>{YV{%#FnaG$FTK=`(Sp<=TjRyE1mFu$$A6n#HI2`$bf>FkgI06Lg- zE5S>+L^V>_(S}DnwtCY#8>mOr)!zx5h+Ta|+*M#-9cA-BVCmUN=`0+?LwlW&Mc4NXH+{H#rx!_S79bfN7U5GbQkWG2 zxiiH+_o7J@d{YVMxp;~!obRA;q;2RirxT-o*vCY1U+^(a4MiGwB+=LS+C5H|qXr&i zXe8V0c{Q%lGDeh}+yUwTNtVl-amn#@{GbVmBhXM>wA1r_T{XgRTYte9xMl z%_da*+`L(7QIvi!P9l0^RGSM-U>6mIxH##gxlPgz8{>Aw6$qrLbKJMR)xvz(+*9FK z6$l(w>RK+2H2H{w^vH7hXr8ll51r0;3Rab0;~tu}XiDne(VphgQpu8!79fo|J&J-T zfe~zr>|L$|`PU8S$yZq1?YXIP=}X0iF2%?xYI!zb=dD8iKPzk`bEaSPbZ&u97zbIh z_>1BC1fOy^<}-i{p#+#tDyUm!wm%xqm9{5F*1km~5lYg}wRwr5SFjD!?|7?l1ySVW z(qebGli6i=l59%tttnIIt=if*SFKJc(0O#FxkF?&{BT zhy`RGIE{NT`@gE0+$1Y4DO_#wv)`vgPcxy8T7 z3?_jGH!0ldt%ui!2k?I?B|!>~mhAA>a2sei)%kRnAx$xA1-4jqd`mD!zKRM4vW(GJ ziFo5G?OHe!;XzApMGLRTWPRixtga@fKa8RDPjk5CxmKeZAip4<`X%dgku^-EN{sWs zZ!AzUukKb=dGH|y^@=0*b0(yz9dc4EJsnJzvs~AfVpm2BtvNC);P|u|5o9`KprYFJ zTF40SQ*D_rJ?j`fxBWEtnWd^y(K(J`tg+`)#240gib5-zzKbRac{zC?qG}4K{C=D89xVL8NBzGZ zYtc-=^}7?49Kkpg?^y_}%KK})p4dNXFZ0jby*>5^=ST9o|yt*IM&lbTS#S5x{7hTuQ=)TWrl?OYZdOllcc@m zSn+u)#q6SX7KL~?|7^bW2O3}C#U!zZ^9a99t3*I7dPz!VB^!h`v$0*{B`}kVm%_VF z>+_-+W7VAFb2$G8Bds|ozSx&*zPxm0xc=jlaF4tm61CHGSVwA|2%vu6OUeIQ5!Jvh zGgn#8X~$)aG(MODd07%UBF9@$gWXr!39~+OizK--$wyWy5ox8+&+!*z1a0Yw2dnAV#)(kxDWe}ibE&hHJs6e_3UPeS-K&#$l zK8hyp89i}hP(5wATEuiX&w@n$6<1r)t22FXWU#YHo1fAOxz-#0#wJ9 zG}*5XAZZdj`1@}~g{vZe^%3Z1mL2WU_~3r(s-^#N`axH1CIT&mH<1s+h#ieGB>j(` z15k3madQ+0eQRiLL1Z}JN%hbA4#mCSMdZ8`{rB^rUir19Yfq z<$hReX;w3{wq08H{ZYKE2q~q1!nx*#{jz~%>%+GDE6POSJ}Tjla~oA$OHqjOv&1s-V9a7~%HP+HZd(?9DT^Ru)>jeH;4kK4P3=|$ z9+Up}Fl}PkOpBy@!B)R(y@Rcd#t?kE=Qfx@R8F&cn+`vbzu48#(0bGJkzV&TM)HN0 zjc}c}b^lDTm@2K$w({m}YS~m}_3wm-14!7;T1TZ+RlruK(}2$zDaM4kp0$}`MQlB%V(_~AI>mps8d1hRhz=TUxPl0pJa5%mub{-GePOn_ zUItVH#o8Z^?uf+>HgvB9GTw)LYa;D*!}g%-$je0@pBWq=<%>JjTFkg+!qnIBL%eKJ;6fLsaj{aU>qiFv}9x2)qerbi|9r5wTj3( z06sz9WU5kTh?cVR4ku3Mp{@^h>Iz_hf;I@9Y8fq2z`-!pu2EM`i62j14K?ER2}Xur zsUwP`{9|*h;|jz5{=`#wTD!R!A2zg{CF-3HZAd=7KPOmU-#7BLbr2RYG+ee55f!gp zgt9byncOeaZ#KX#w}!HsM8M3#b%FFGPwLGE$Cw3 zv}>S{6_&X%rwkLs0aD$57ZoKt(F#~_O!dUH5|Ev(z~UoMB|mODt}$EsI73aPubtip zi~C`@%MKV`oxCy0Qug~(u%D#7xwh^5M_hheiYMTRWp(ikrTuTgSdIfn$?Wtect8+8JnPSt)+S;^{US11noW3 zQ{Rv>dHUp)nh;p9n-Yv~5(+>nk6HqtArzwKnz^^)G*ILU zN0IaC0bf0AQS(UA9SPrOvmkI64$g&5QnEtc3d;~@&`u?OP5dJBCR~QN6SdEF%u@RO z1S7%?XSQS;&{Uvg0@3&VM4rs=K9>xnJg2@^Ly8)2K8l+5=jM}|3719*(uj9Vf^BX` zSAu57wx&3f{v9%>Y*SNPNsPrpiw}(HPU>>y`Z!<{CrN)N#=DJ!$f66ymfHY#P|PhP zzMYrEaYFCqdThRvR~(C}uLvF_fsbTSEjcjTe%8 z?=UD3rh!*K7#1JI(2x7ZN1-z`I6UQxJhG$hxnN60%JJm~__G~@%XsI_u z1LUq-R(R3wR=P^Cu@GjUE&20|@1@}A&{n!WQWux&O$?OvG3j#hH&NSJ?DfpOQ_fU* z0dEkpdh=b=xXL=3{_Rg*0d}K~PJ(Gj`*!ek{Xk(lIy(<1kc$V%$1BLq&B6&};N)ar zLg!F+wvaaUu%u*^7UJUM`ahE7=$Zj6p8sJrfSmtejsF_rtI}C@T9v^GIMf|8kLg__ zyMOy0(Lb4-Rs~bBEa&|f6IvM}lbAQ32PZb~-!U!YITop{rthDgf+jMyS#9MtWTum; zbC72WtEfVF6Gr4@Wk-?{GgD}O(lV*a?BWg~Crd=X{UM-}A&sQ*yEm@$!w=M*92)8P z9^76Qa#M7a8i-tN$P7W^_^~uqMGOfE+;=zWpX)_^%T=E|!NjFFEO^rZoRv+6X@KXZ0R*NN{0onqv9Ta}%&jbKEZcIA zh*(?jn3#8+a@#e&KhLM!cB%J^eq_J@bpTiyIz7(K=?Z%O{w;cRwvQ^JtyTl8w(a|h zY5h+fb0sCru+mvMzNK%cDN2OMWWJvC$bp2K9q9DtacE@>HT82Es8t)qSc&9Mq#l?* z68$-UX+r9F6G^mski{e(1Wo&0UGS>G%t-EHiU41VgapeDCOqtK7h4A+WLK^-8MCOh zP-aVkyX(Y8NrIAJ8hw4i$#i7g3l^D`u&rJePJm9{I~-mSUe;`jPSvQ583Py_@&AM%n7r$a3PpO5;D9JEzG~Dh_y9K4|?eH<#$31 z7jiL5S|u=>yNRgmqX&z$%Oz)>R^~(8x|Qlq7c5TBGz`uiL2nxssFpPrK&0mLGe76q zUr4Kx&-L*gZB{mXsw*SxX-2qRL98go~bQ$>q)evL-o z1Zfm-DE6EbTA5871bBxx`*;uZnDzHXKOuzVPEJN2?GdeR;q} zQ}aV9AvwsctJpm7vvs_FLujzUuKAo0Bo`Dr^7I6X9jJoWPAF6u>E#592tVAQSF$&I zqTTx`DvrR7ZA86?2dWBXX64f%7&wn0%L^a;b?yty+2JaF&c-cYm%988xmsUxD$1{2L1GgSgCkS( z%mzpn*^ZchMHU+i?j@%&!T8|qJYB6i`b^zR_kHnvffYf^6W$fj*lDUu8l*f3I}84+ zNIEO|;QKEO%)6u7`;KCLP~y%DYFz=!K9albHnD5u%GNx>Hg)WzPDk9N8oR_4@a^92_3Qw-93^l>tN%)epmaQ@q%zts3w zrb6H;WhsjmTi+D(f)V+dw#paRS4>LfYp-PK1_yO6eqLz-K5l+~UP(cI9)4~h7Z=|@ zTM`tM27cn?mXs2s6#0K8M*nL|K*40hMiz)LdaoKm=ynDfFLupA5t&?W4ie~J|HOqV z7)K5l52>oM9;rD|fpuPRU=W)dArNaro)RPft6Y9@k~~w`UI$&%g#{A}8eP)&D+}Y^ zM|-1sUwzSd=acZm5YN$3w2qCQJ2WruCEcbA!NBgpui~nOcwhc|8q3rX-7>kd5f7ag N$cauz_gPg2{XZNjU*G@$ delta 21365 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 diff --git a/docs/figures/packets_2d.png b/docs/figures/packets_2d.png index fa303a8ddefd1eadc37d54ac66cce4c41efa7d24..d711f35fe76be0dd55d6b8d80eb7c7570ab6468e 100644 GIT binary patch literal 19760 zcmdSB2UHZ<+Wy;s!U!UxB*_XQl1IrIC4Z-kW?W+BIpZ9q?OjSjWn2?$f1OgE& z$V;n%KsOvgAl$8AZU9>}b+WyIf4C+}a?+s7km#Wf;N2|;d0l7V|LOH_pCGvx@Pfca zL0N`i3+Mi?IC!|i`M`&j1{9>9Yk17T@g2ia=qd-s|#a0KkXLZ`u$sMWlMh-k`V$3 z4BgtIRwBbLjl4vBvWtv6{?OC~xiA}^X`aCbGD^x33!lSoD$aBZN@b&Nu4XgxbA$?R z-A!^owQMEwm-?Y9Mo8MQD?P>9(qN(UBp?)TDe89;SK+6ySY`ZQ9YI-%efOV_#Z?(f zZu&gG3k(J09pKMh0uTt;6$Fy(#sPsIto*sXbJfI<7W09w_4}8daBv^0p9-+Ib_)GEK`!_6ou92zLZy+kt}7Xz&rOjOZ}3H7nS|) z2+T7;Crt}NB<<3l>leyrC|XUu)+>L?a;C=@Po}#wKt%FnT7P@}$+Gf@YWXCi8JXbR z7Y9=imPNC9Pb!q$>T@(I=d3W0P$8Rw;+4Ezl}`2}a6jJyR5@M|*-i`eIBVVj)vE}* ze8T6js_Fl3kWVLi_8UiTn%*tJK$E;!H5qNf*rM)V_<)hajJ(C>#x=m>eyg)_P1R3|y18vv3t#c~;C@ zc00y9ktXTSGWF7(4m7uBeYY20BHV&$wiIe82D~=O5kplE9_w}HI=Tc`JY=^K?bITq zfh(rX6*6g*=CG5u%r5V(5c1JWsOVtt3(~X+ZiR>Wh}eLNn~G^}&W&pkQqy)0+zU7w z5N*z6JxLi@3P@_2Sohc=Q;NBRC;fCp9g6^0>S#x1xFD`J|sf^b%o*jbQ49t&K_jZhX_%%w^ zV(l}`sg0YfZ5!&xOB||&p7YJ`(W&Of(4-a=<&NT`dlDz;&%eta@HOlQf2oeq+j;p6 zoNbaH78DvZ%wr67{hV}4-gAuJhS68jGRk-v8T$5{FjLP};e7I6hz)_Sm6VZfWls9E zx@R#w@NLpcFbn5(Xj)UGv8i&;4uF~Yj_1Jqs!euW+Amx2j+$14=jKZwbj0w4RV_B} zE;bu!loQPpb@O)dEn}mmM6I4QHJ-tvrm^$Qr`TYdZL}+#P5>g%#%jAP{!APSwB-FE61TwcO5k?$ICpbtNu8>YtUIMjz!U9`#v6^3;-V zrZjf>$RNejl4V5-P)@S6+Jwgg_{$#Fe<K!9$W|>M4=Uv6!fVX)^{A8REu`?saT(>VKgi)AN10;rzGd7UBh~Xw-`^@01GMVWz3^iy;rZy99z4 z34$8A`w6%ztA~zmTwG1}6!hHe4;qQdt=5M1exec2j8MFh7dy2d%^;KCau^ItCBe#* zdB~~p4CwXe8P!nZ>_<{*;tZRUt0?*L!W{jg?fZJWd@Uy>MeEfsGkTFi%yJBfFQIYu z_oVbn^7hbgfLlG;^db`N`zGV0F&8a<_%C)^%Q+{K< z_7ZZ1D1`rkPg(0ZrT&-OhmHnCRlO9fuPlR< zzg4}AS@=C;Pb|>Of66Qs9q(nkZ>dvzOEK8_<-9tzCIKG~tvCw#>*ZT;w@!@Z2 z@>a$Xjr(!zcg1js@zd&UtUAnFvt^7`Z*+#W5w#F+-n#0D1u-*miAAGM{>r)y95)!l z%{%#o;9&cfCC5^&zS5b%DlyPZ6)#Hj=GWp;>{<~8nnu=7)pLj78~MSB@$ORZKNDmX z1xz?`w%L;40gp81jP=>cd#MA?-~n)2G*3)%zOuf7qpvliiaK;-CL#U>9?qt49j03B z_RJR@+NIi!gU=^|<(1WJD~+`stB~)%xn8o>#Z%b>Go&F>C_w@id*B*L@LP)+H{*3z z=?~@aH(q+3zNA{(e@X!?&A{pd0)+|!e}FaSzbx4pg1BBB_=jMU{ijXh_kckPh#O+X zz1j(JprcK<68;9bri~B*5ADS=#t7X0}EP9*c)z8t)Mej=4A{QAJw&9s|Iyeoju_w^3M#?~X zq>Blc3K1^Qt3oOo`aFxb->w!vkSgr!?Yn%kULcat<=+2>SbtsCEQwFNQASlkuq|C> zV{tcsrp)CUd^%lLN<#$rnSk|@=I1#|wd6+TygQ6{9Fmth6Vd_B68M7La(y>S7Xzhk z9Q|5(>^ez!*AbWlTs2Mn*g-zKv~(wlQC|uLLYmN{Ro74cO&WbmP@Fyo-@IzcKe5W* z1P`Dvf(PzRZW@I2_N~UC^Z&y=L8Q{vfPcwGRCG55oK!wcE8;k@h46iRIe$aL)avrX|ag@V8iUTyV&PLTDpia zxw=F+Z?6ID{$sr_AJ|;JswVrky2P^UQLsZ^vvb0rt7cG0VKpVx8dy{0q!xF-H}jUO zuCBXuHTQMi-0FEQu*Nn*lm4cBM>eqD*6&xBP19_`v9@y?_&U!LWsv(ji$MNbfx|5^EsK!>vn>N%+5*;EM zYtCe>@Sp(ct)FWtPrlN&Hg6I)_9u~INWBSxL%b#gsQvrFPKr^j$m2d|6ih?q%dCHu zy3YQ*Jkbd<(^SaU?~*QF^vC;4MGI}81YN|o z8(&6TxRlAswV1kd7}(FRnB7hQK%;uEj@8vCUinFp;6Cp+ESpkGF=dV)^qY-%OR3LV z^?`dr<~VLJ+mZh1SP5**X79}+^6Nd2#YuxT$_lgMusW^At-{oI|Dbl%f;fF{ujiGj zZ>g^Wca(_`=R#{=OJ9{@)R889``E~yIhfDeQGAe9ed&?^yxh}-hQn{*7UsOd-swyf z1n;I(3jJPBvcz|Bime)PR#guL?%{3MTGWEu3BB7aeZK%ln_y=;57_ynx%Zxl9kh3r zDqx#1PT0e-E2&Jw+ioSysYh=nU&0jNIzbwu^$y_`5^D@3czoFA_SE*QCWU2r9)7v) zlG<%pQBGSj`u%ashd{_TvaM}4=a{)qkvyKhD{tBu?PkA}xj5Z+1?WwSC23$_<2Q-> z#>J^V=qaA}o+E(Cdb5~?f}9SI_3&b{!ol7)BhA%d)Rrqn{`OE$Y%0KJSepKXL^6rNoe|tiBo4J5L zU!6hXEJky?Lp*`cK;r8}W!wbD7djXEaBpgC0{h$2ufPIw3-VbneKxVx&}nF++E4#|r%ayB1?^4EBHTMb(tsvw1Q)>TY@ zo@yjkOj#96r|+^_+MTpgyJD6WYFi}sL@e5AfTugzu3@II==OysgJiRFx2KCk2|M5P z3?nn4oyg;^XEKT(*sw0rz-r{ZDWaYZ}iahV?rWZEPSc@%=OroR-np29cotzVSHa~5D0sAQ#+Z`ZG?Es zr-1bXrxE8*|H`*SV!D;L_#m&poML((zZO^EX2C;@XSfkSo4eXIvhqwh5$d=qWx{%< z_SO#9&}3$eq8#dVRHCtTja--ix-)B>*grqyS5?_SZ2!=zDZPYr^2z+?(@oc+(+VkQ z>SiM5UfO*Jz0#bvR5U)Y>(I<5}~(B8RE4|=4Rm3&@9=6qJLT(yb8k)vGa zEGTs17lDl*9WitM!NPOh^!Tl>Iqs--RN0#ItMmxcCLO!NiBaRW60HU~QO_2y2-EFh zLEx-l)NeuF6`Lc`tsyuxX@$7|igbS`p#Xy3WFW*-@d=$E&=JV>yW?Fr=pSbr_ax8eQg9VTbr1mQ^PC%^Uy)rH=!pQ zj$F?oT{};R&(BWlFKW+_SD^WQ=IQ3h&L+kJBfxyFd`{&%ajuI+v?t&I>>9xJKCPqN zc#K5p^v!wrS(SL=6=4QI-ls8)U2<(>;nA2w^rZtgLpS4z*b{V^e)WW5HvdU@p>pR! z#$C2uOLcL-O3oOAy|Rm#i{gvrqXl$(eK$gymbj%E*%liiyG`xWGx_*6cxF~?^$X*0 zLc`Z+tgDhwW6p@0r~$JWU-wbA#d1dbLHM0Z*T8%HPlumv!HwgecyxjhJrrnEeYcoQ z+W5NRg;A9_Mh!7VDW8Olb6vI%<@HGeBZWzCH#ZpToP1qB2h=4}<8D6?r->{% z7Z{b@bZCESr6A$k&ps+~+=)Moy3CI!zA4HGJgh$alw~p&l@-JR0t-v9V`|YmihBU& zYYM))`EO&5rGSu6uUvoNnw02@{-p%6DG8{i22daII_KaUf5?Iag~}vuyVT#} zri}-h2APRqmwIfQ9vw#q(T{?OyHEFpM@Jeus9J@V?w51J?_0_?HPq92wJ__Pl60Oc zxJ3(bYCHnx)t;u*8fGxk%kxLwef2`=~w^!>I}W{c!S*t`(Vj@K08(aT_|2uucNy` zxev|z!6ckHu7*I017@>&7a``Ufj0`JE=QT<+P7khOk@iYU);8q5?_xC&MlaY?tQ5S_Z)`&t`PaR%LvI;XiyQ#6?Eod_5`jdWzIsT;I7xqZieU+~%Fr$Xxz0O3B522=+ zABOwo5O)+uX#DBN-z5WaHc~KjSytE8yRGqRFJyoJ`Y% zhs zvL}~VU9koP#cuzMhE0pLUjWP#Nn^FkVByYbo7F^d?87a$T3#9R?1VpyAK@EBW9i_g za5671>P@cC7zv*dRb~$67bJ7yP+#t?SFOLeUG<*2_$$$^=CGULP@A=`6v}CJi&#%W z@8+4snhj-6{r*Ht&K29FHR~?5OP#Qrr&<0dIx-e9jA9khc&30Vy8lK`Vz$bv{8G|i zrX#n*za(crTId7B0`S+TgFuWl-6lpO7!s^THk!`5>sF?#7j~tudSl+9-Kh) z-!AbpwbwsW3-0S!V-Hc-JVQGz%~!4LK&MO}6yv(Ddvjw`6-wxlF)i>&+oEpV^Eu+3 z?Tba7E07mxCJ-BV8+7^H-(Yr~)XuAsInm;#lzXpozb;tB=S)iIJby!O(fw@I6PxKB zr{0JaF(&d9xg1`rZL}^zjO=08<694tLXZrxZO`C8w>sDgMyQ4RCkzgYt1Eo=U=7CN z$E_h1%5MmEpbY^2i};&r?9Zp)n^0AmE%9=##PB9`_$6!)A4;Uxp&!>V=aV+T_UC>)ck z=ARXKu^mJga)*4^phh!Ao-oS%@VWZB8-sxIBPfP6l0LG}%Z;Z$ftp>^hu286__Q!N zSL0HsZac~bYR-Nhl#-{;Rx^a#@1r!m&O3p6Qu)@+g&^A4!60GNb_t^SgiCK7jv&H#yD2sGU%`FZC_hL%!ufBGL@^N-{PngrE zk5a4(UmZ@c6)8uiu!&l+EAxJ=2p00yGmdp$$}q-_3O+C~w1^z%+u~3ILe>zlqTn^pV;!<=N#9=i3w;tC&K5-Td#9Wou4l<*&HO$rmZ?k^N)s z5;Ozee61cH7fYKVza_!sYrOKj=BB9ZDW0e=rxe;~|LnDFTyL$OKVEqhn^8gLaF0`? zF;G^Kck1VX8Ped?Ixrsy6eQyMpxU4N!+4gd#i$q0q_Y_#D}Hr&#)**p;>H)I^HoVZ zaSLqM{Fc25zE04=nJB_HVSIGnRzvaf`wrC`Glw0OWER4dZGlD=F*{R|7SgZ*^DfL$ z`_mMNkoQzXPIfPfEy8^&)826d=^g$ka*`oNG2Q1y;daixK&GYV&I+D|?KaQms%okp zT(KwB{o{eQ`k+~IYa2SnWRq%D1zqwLrXA9P_VS7p+cozUd?ONq+4D86ML4;&QChg9 z*F908TYgjJTb*m2?0LvhFVi!X{LGWONhNc{fA#2AzCK+fTCw6D;d@2cxpED3KYkoL zeU#1L_H4{~f_vLs50WAo(V$+R18s;14mUEibRf_Dx|igEYHm|J&;jISx1H^N@0lEj z;NB1}s6&$e%0X3(FS@5_-q5ap{R#xy@S!1O=H9lHT^LcH>^;XFqGO5)Lgb?V z=`SSO)}>W4ie&8uS+Dv0w_JJZE_|gdn$L!zyNH~9??UB*k-lvH^rJelMb@L4l_|Ya zboV?95r1|sF~>|~Yx!gxrnzBAnYZfuelr4Xel}TF(05!f6~fk*vhS9uzfxTlBb}z6 z(*8vTP^-JXUa8fGQ|lm(2~~2XF8#;$JS;;mIO!8<02Q-Mwjzq$%t9;%r> z>P02}yr679IV%tj6`Y!5f!cryY+>vNLeNJ1PTh9ygEg8`iZ5eu3YyElsNSt~IwcBtDpjV&&R;f)S zTsvQCl#`Ls7E;BG%DX!Kgc+0QpMi!}I(58qVqJxJ!QW$6uDH!r-3E|v-a5XN-NX-*x zPS!Y&D*s&14bmcIj~g}mSf+dSs5c^_-)7_)hl9hYviP&XNAX`!wjpIeh}aRF&C4#@nl(oI35&mWU6w_&T{F zBmBu9n)$Q4UnnHOj4H1WRg&t!t}Vsg%|5t;-ajS2a5hbDak_l>K7I;*gl`+>CqoO) z4)F8e!?9cSPNb+1Ks{b*#G%29oXR(lWd(VA_v)A`E_2m)Pqk-rsO86`VrtTKDS@a$ z<(aVr)3!xvLEGF_T+)2sK~&i+_JYA|f4lwq ze1MkmZ`<+D?eI1dGMwhV7f|o-7IzGW>w6WvWj{B@`RkzYZ4Ch~W@x$&nOh2uGZ*S5Z%ilzVfMH$x+-c#B0dh5P4oB350c>bhqetTs~KQxpF;B@{R4{ zh?_B<-nx31mgVz%++(fk>;Sp$TwuWd*^Ivr(%@B>u-O>L4S8dY;|+8 zx&krzAZ>HAy3yf6Z}x~H$rx9FAu}*{mN9XjUz}mZuCn?55-4hg z5Z&NP;xM?hDN0*CpB|KmCFB1U*@u+8bSjFvGDIwUt#2(ooNfZ#79cLn&a)gKO<16& z$M-4GW~jeiin=XLQpyQ zY>$HVbfh2F^_T?5iZa7I1O#5OIgK)CUg=1P!f$6-+| z)le(mQhfd_;eIwC$pl;^?`Fh1t@EEcc;!R}@Jt%;2qeba5zN)RNPSb} z$8#>oU)SVYJwjG`@;6_^Hg}CBi#U1gSTr7RI6vogH!nvXWwdmY&ymlM>YMeWEH}Lt z3`zQwF^{YunRXB!jt6t>Tfh{;d}sIi(;T6~6uIIR1-4*{A}$+Ncwiiyfk;9@ zC+)Nw12cGS9tP~Teohsl=$0k|(k$io*{XkzE0lW_mQ79;MM^?B_dNU=+YBS~*|wl} zDwI~kH}IBjA?fifawrK5pN=KtsX{doPev2#)#B7+QuT0ugX>r1>6_8(`EWDz-U9-U zn?XH}#DF%>1Rw7m;1F6>RI^&QHyxascncr`87t4nU$69Ewg9heR$v=Wp19RiO(%#nrOZ ziV_Kwr#_E(1?cm_R_vYxr#RyX8%^EM@=QP?KwTl5c!5Z$f_|@PkjYUCKZUIZU$%qy z71*#SdHvJ}A$I%RmTb6@HO6_Rw=68Ri^2%wAE)lL=G!2V;eI*Hw7QBu-f{gJz9_5r zZPBxBgfMC^h{Ru{I>F6a7Qpi0*7QYl?)BoO87+~$F_jdCMyAphGwY6>pXbeu&Pvv3 zrPK}=wgP)?|DF1sZEx?m4cGY?Q}0h3r+19=&eCw4S+-rNb=r4av8R2CL@o4S?Z*kS=X&n*Z+L$=aprGW4kGgve`&%5Ai{u_V=mCF}fNgZKQs_&Isgj zlbY#GG!|FK7LeG5Sxqx~>MOS|(Buj`=0W*lGtt!<|swXC{CfTZXmTG3geLLb#!4(Xwrv8WkDz^QpyYjUj*o;x(xdeiGat<@1-UP7lcHzJRPw zE!aLzq%gQAInAVW-tq!WVQUgjqw}CGKAZjMQCr%tK9^&KR1Vft>H>l%3EqO&J_YeK zF@`=)yR50B1SaAmjVVzb08Q`1UT_-PQ|=0%6Kb`rHyPJ&bQt~IJ(pXx?6j)LIEM7n z%ym1ME@>njI$HB~puZrw4i4{b`^;ZYN(EO>npz$9!nDOSLG9 zc5*6T_6&Ba5|NF!jOygjek)+fstTBZi0!R@5C9fA?wecWataaCrh;kVD5#l0dyaFa8#VH4ykh`pKH}(RT)*Bp&Or`Sw31aD9Ctr-8EV0 zdfuTUTkmpX?N~_}UQ+5_ND^{V{dz9K`8PB!43JH~Q;EKy^Y@z+yX^sZEB^C3eZ78r zye^HvTXHjrV7+n09ENI6NA|#rC6|m~!wV$+CDYdIN?9>gJgI1FaLMU z6#w0z`4^Y`Kg2J1Bnfu^DTl^P#DP)st%N(E)6xk}Ba{>4uzvQ6(d4cHFmhWBkOmLw zG{qqA0l%_GSRrqIkfhUezt%7Uw)utwP~W$*09NA~-V1D{VIWzz1tjFV1j71 z>)p*}`0I43h9s<)?@6^O77z5@g9D%{hemNDhTIMVLa*=nOm7;EUhs{62*sO3$Y{eV z^yr?i{Yhc1`i7rDqlMYI-_+cfaSKx4P;kp#+Izis%A;UK8sXe?94!YvP^}sxnlQfe zsmm#nYV`()oFKI7g+j)?$T@!jfv3ifFs_iVAJ}Ty0Y|ENPXT&xcfUOoZAH?bjZjWdMd8 zbQ`dP3{QvCriEwMN=9qW#@mvc_Xq_>c<*)D?E++#19 zU6-IL8;VzU3L*jA&bksI-QcV@fa{4_25rr_n*;hUZ{4O6<$+D^UeOrQ zB4lv(B$TPC3qQr?%?OKlMRm#W9s6pvqW6TU42y51df1pxHmvd;)itpX-Davh2RIrF z4+zfg%4I(~bpW~SiPQkXF4WH9tiCV#ZAO!|$vo@je6PK8jNp@fDXDd5MIWx{?Ml0@Dxc=nLP1hBOI}S!0+BNgtJfuhMW) zSgI)J8X0Shy2o18JOjAHI52I4(q}jvT%e;8A%I>cYdvH;R1*Jsjv(u|dU!drnCEbI zrSS&03grFJomJ`g7e8R#P@a;7z#AQHjzoAyS$wq$b5RXiJa!}AWozDxS-?4+6!ln} z7RS(Ohpnkx=N1_ofG1$|EYlwH=evyx%MRqn%uRAT@7&2M% zqL~WaH%$HHm7fV&@)PaSU_0EAmo;taVxz+!gowHcg+R@3xVD=DDbQYaU>Z&fW5y^M zLcZqlw@7E;5QFXOsr|^9Tr>N}(JX97K2FI1>ggX%#)s5Ts_asQ&uW629dtfDvE2B0 z5pD-2;@osa97s>8_P9RF224X&hK458q|HxZh7H!($xKp?>~ZIUZ!PfksS$)esYM~I zrVO<76tDzSoaWBkc$bekxe2X&P(j~pd=Qqw+y2$$?5)C-$^3?{ZA5s94Pa1pIu|M$ zAO59S+rp3YV@0yQVxo?HuOQA=Zp_>^j#b6pcIUTm`sEM<=TAEqJ2#QKSfuN%C`1L& zmzQf+g)`$YU-B!da3XaB@hsTOO>D>Ba{G5U(vHXAd{C5_q0E~MG;Fo6qF%8lG^0qb zQ?a$17#HfSRYR%ucJLIN`Lz9O0=128%)MZ4%1@OqW5&-(c@z0uqw26m_N>Mw6B=Q^ z2!gVB<}+5y*7nh>A+%H{pu2su&p(lZo3$YEV;kI)XREh~HcnnQ(YRYWcScRWzJty_sR9^yXL zNg%Zb4<8=L0Z|`vi-Ypyf0Wl=SVq0LQiw)5d8({`1r(v6a?hsw0Ec1URRQupl*sGyUYv&C}*{O)L|4w%ldgh4T5U^CX~@0tA9nVHW|1f&k!92-2*G^i}RCXBZbi zV4KiaiT6&XzBGo3#c6E}GPZrR0?B@Q3u{^+nn|h&0xgM44KG$-N=cMS?oEyzScAi;+cKMqDb=KOOOC%_pOyeb+v zpa5hjS>{nI8kTld?1P$>UMFAZQJ21w;$S?^o@e$Z*^F027I5eEwM80YJahEYclwY} zApaZCGjhhLE}l#(H4mUcM!pYOUELySf{6hpqq@3WSCZrvWdAG8(T92RH(VpCFu4P- zc2>=cJ6Bf_Zr>TxKDnFrQR?dCSZaqv>c;U%-m%HniHytPgkDZn4aYCe;NVpGSY~hR z2`X6`u*y*XrnxLz!ho1bOhFc9hcba*t)nN7F7e9M0pQeo<}{e(-x#)DAax++ ztj~tHD4t9j=GP{2$Fn$93(gH|UlY~I+~t;ZvZV85%X1$9{TDk?-FyzQTD7}Wwgv17{XnKR((w6HVE!uc zO7w3_wF$V964eJq^LRVu<-TlxTq1xETp`KTxU`*$2%c&4*2s#N)jD63`VD|V+O+YD zRo@F;Rcv!1Am)7a8L5}D1{L)GIDWHscY-X|;ACUrA^3&tTLg`+gt=Yia!#bO+sle6XrFY^2KB?AS zC7tagFl}j3>O2G-859|kM#LhN{;MO0M(fUFuY}TjL^HR6qdHP5I~CJ84#70W53Tu| zm5yTb@5cc1i`sqmQNd}Opt`3bLMdr%u%FHNB?HhS;uhOjb!ez*816dcC!22D2iqvy zZ||>8&}uLvKGyVr2~_~!Ku@er@tT9?tS;my`qI+!No8^ zLbCQ#nEvv@D$rG~28n*wN$bk03h6qoweQ1WYyu9)$HzNz%F33Ks0|O*ohGk&I9Icd}0C31(@9Ms%^!J0@11K5OwtV z)ot-F0b$Di^YPKfW-=gj(&_FW@t7t-8pAGq4r&heihl=&Vox^BnJd+5aXfRyDHUjk z-*q8?%daI@cPH}JE*tvA^<5ipfQ-Dl^_GMmTPQo7-aI!xjlO=b(v+82Al`RTevu3O zd_GH7&+G?E<3J7tyM0FtTbFU_CK7%-&f7hI+2}BQLxhn1DW@-jDwqVg>%s(#Cn}K9NcW?)cAE~SCWe`FxJTfyZt(r{tpX_!jlQWul9DDXvl12p1+z1&krHqgj|%s`GD8# zk5dq9z9HdHe6E%}J61!#hz34$W)O(&Dg6GwO~!QMkUY)V`QGJJLgYu+a=C)NEDdBY zp+}{nYB`=*_`DYciwoL5`^ft=sbV*>o;>kt!!u7=}5-bD&h<^vA=0lnNN= z6M`0={!xS}LO3nOX%uy_h`GJ4$f-76x5BiNW!MkF76yl}6~$}GkpT&cCoG^sQRxrl ziU;wQlNT*bVJG1*Um-fcGk+Z$zx{h`+{>2_dM)u+Z0rrh#(qF-EZleVpRqCBb!=S7 zxhkxF6-VFZgAGM8uT!&%h&nfZK_jo~1v)(+x3J_HG)0P2$>4$JJyz#6)S>(nJqT&0 z9)9~xhtbdJKQ!d0v;ERiWod~D2cla^jeg!sbvzS42TBtz)2SxCT>;RoP~c^$M%%Y+s!r;4U)D zmwjY(u z4%XfOhL>5rgD(0RpWqLkDk#11w)RmJs8UN7-xfLb**h*+sd&Oy^RpU!&`VM`IpEvj zcbQg@E&%_5m0#UpAAju}$(&@(SdoNm@lidWcxf*OxAj8s`|?Ybsd#(NQ)v}7w&DeF zS-oC+6So)5PSg0!;>^$Za-~%Q{UP<9P=Prle699l#mPR*=VZV2Y~9UG?faVuA_>XWks-f9Iu^25As>A54Gg`qgqp#{3fuD)FEaC3?Rze>d@GfTJP zXg&w0FY(FvR<2swb>!ML_>w0Hy_YYQAW}gsD$T+MqCFeFonSRCAK{*Nyt!ZC53i?W ziAlMy>*vB_rq>+!Zm($o@YD1`8^`l15-q|Xah~yb!hL!a!DYK#0EAInW&!C(nx?iN zCQ_broUm+jA3ofz0BI$@YKKMFxlDe&VVjn{+@pyic$TM(E?yG1w zE#tg#9`_OKso6V34k?i)#*R%qAc_zJ@5Snh?2Yj04Id-wDL4D`v^|ot)%stYq+Wou z*?jFOKK2~<#}*I1OtGlqv~6~mdkkiR<*2i9!PIS*b7qA26>fqIzvtN$fSc2gH`fvm z=@A~Tt0`7a_J;3{hR%+{@#IhvzP}=+Gv0>-3*X?|Diej824wA()4tq-MMIC8F@s&J zaZW9f)xFgFb^vz--Z@#brG&)3Y1u5VBKLPCDTe_2Q<{0fA$;-ORj2x+xPtFJ;@ zb(=)i(axvnf@JPMxUAyKSf6P=`~W7L0;4nMQgXy47pfZ*9TF-CahN?vJ}+&7u7CgW zo5i0d{c?FJVz&2v<_G)}8Jv@`Mj>rX!AW$i^&WM$KhD<6!-C~xcR`@Vin@6Q_v!8o zXFV0hVa_zZP*>mN(U)qu*%@q!$HR}XPQIM7QM>GqI2+=qZ0=|>Er2@50w&zf4!=)G zh+_)Hckh^#2|11=9G3>?W{(d9sJFT->t>CL)y%iCetBvJ0&(6*L)J=I)TUuqBQhr6 z8_e@W7Z97c_E^W{g%h;{Ih3p1z^^PtK&bJHAk5N#7$St00ed-eQFjZ!s_poh))RhA zuK++zEuBO8=xmoEWr(zc)KImnoNdv7fCywE~Zff5uD; za=@$6&t&je+h$-Wl&HJM1DwI$|5LY9AU9y__*d|v2EHJG_iN2}ezejU-nI8xqlyeb zYH3>0+Ib`2M9qk6i8_!y2oHoJ22$rhJc`idjuPVk1(Ze5rBd(VKAqz)aW`b23>4t^ z08(9VNA-qypFG$Y zMEh7Jm1hm$NG`h8_q5b#p&*P=j6LZUQ%(50bD&XgL%V%cX~LO7-B?t!*zjb$?FnwrBbQL;U%6aBE zY6OZBGF%~%KB0SDwllxB{4yTs_&*iEUQ^J(9i!9ENF>~U|IB|nfXEUTRKD>VYMx2MC%BSd7c>8B zGGM=%I|RrxeB8~zslUz|6i-Y7S%YuHpadXmFh1q4)!0wI@Jth47E=J&Oy*l&Hj72m zvX4sxHI&#_c;vA!I5|Fl1T86dQdyTL(y>z z6?c574DtvQXjlHP6_V}joO5B|;J0);eGgZby#9en=-ZApMbN!C-~8_&4CBI$f3;w2 zVd>cx!UR3{$X!AO<@n7^q}VV)sP`Gld*gI(c=*QrH)q~{HfXg27IFhz1?nylSFzv@kzxIthN%f zyGby07qB@HYOrZ~_$UGCfcC}18bj?9D5RyM*Xd|>ySO5609!7o$YXprGZx%muzObE z!W0MiKw7lz{n~+|gABbsrlJ(JxgZ+>Oo3KLW^b^i58$^9hVz(<+m*^ha`F{=?vykyXxUXc?#T=hB#6anqPq&#)DKv_ zFIk}z8pi5gZz9}P&YaT|4>OVWwU~uX;u}q_lmP&pO>dtmwh0odDE*$mD(rVA9uh_2 zb}{bR&}>fz7(EWst&dj(Wym{xeR-e7s~;Cx|TKXqU5OV1TlM&8N zXU?ZhQOI~U7>kmnaBW*w4 z4;o&mphx)mlezut@;FFAqV*bkwBrqv7in`&3pv1{3~It^*Y?Jx>r=j{mufu~bi3?d z6?uHXt6^I-j>w-e>4`N@*=0rmu%)d%?_|clU+dvK#6%u@Qnx7%>TL6~sekq)2VkYj z1RpCFtn2HyYk%;TlggX(Gcd#AvSK7(y?oe<`8x%5*WYDvgvKML4Kks*)m9JR4W+Pe zFv-1Th6f`52XXnYt9wS6XGBsu)a3S?<;6iGPrz{=d=GeNmqQI6;#rn`)UcZYYPXm`0mz`PpXXmsjf{MUO zcE;ULe-13}@A>2KcjeR>j0`*Kejiqu#*OpDsTIIon^iyysL>FnF(tJ)xhS)sBr`vc0YgJ^kh_zDr?ay{Kv8~L wW=^Uw4AYFQgP(rWLLAru83B7~> zO7BRE1cA5XImdg>@1Fa{8{_@qV7aqb|JGXbo8MeJR82(|OhiKj0)fEta!;Tj&?Q*rIXxHPFXq?3o(Gg(K!VU!URj!O4d)W+ z&8u|m-1#7o46Xc=$C@u^woyhAKj(bs(L*|CSE^$5!Ek=%yZqN0R8k-C-U=1xcMtrw zOK^)nhKmN4Tt@WJKJe1))0&`2iLbCg?wQ-5o zz~ca>jNO$7Z;oz)saVvDh;^WhKx;vk->O@r~JgO$N0Zh>7q_@IVVVIve)N!Hp0FP5(=`1wkO|j_g9C zu$zia3z#d|;)n1;fS14aOo3Vyfk|Au4@nd9)-4g zjaG!8&$a=N8!{G`@VQPTN^Y?(PVvYTIyi+s{=JdhW-ozLl&If}r+w zqrTDibyJ5BNC(e#TF}B+Pf)1jvVC^=jLGPIH=HUQ&>j!}o3MHtf!SsXzWXag*ePhZ zLE~ejAUyxY%ux|#~1Ee0)WbO6S$^v z`FaQMcA!yFyk_MaGQfIx9tC!KUwEeM67i+*dT@B-zgpIBqx+AEF@FL~ zY)>!{LV<&wV6jeFk0h*J2FMZ(>ig8kzIqLm`+8YnSrbR&W4zp-h6%j-hlTzl0RlP- z!cO=9NPvK`0b!^AUlRYm6#k{b|ETfTD#1Sa*BWI8MGf>0*M>in9TbwN%w6Cra`+rt z+Fq%(YJq4|iOz^1$hPaBya+uZr9a^G{E&4|5XK&;orns$bg-qsj!!{Qmdsu~-V$A5 z17WPG8`LN)@sg{Qm}KO4y))wWh)Fk(U3%M&{3F4K&j~v%UnmQSNT}BITg~lP6pCNR zq1!q$tg=6syPt8#9nKl4r6n3LdRXYQwMIHptt-%GG~(A}I6u)=aG~t~ z>c@nq;!je{^|RtrSLANLeApd^i+T}G+uVu`28HO=+N@)vn@AX1K9=b0y`SFG{<8}7 zqsrHbKSVG(M?#dkNPp|$RhY?B!qJZxiRZA9iTcYjv;-d(zfhoq+ht0{7=0U~| zVpNC|l+89RYMw99j(omojkvc{CaH1R^(N;qv5Pd`4^EA;0tDH|;K#J5qIkKXrzPo~ z95-?y7-tSu#lw7vZarXPTcLo>{*TS|mqqx zz7^rEvZPx&1_-i63naDWC++M@&3=Z|wSHFS4vm%^%{@~Y7D@5_* z=NSq_5Bfll-nql*f=9_d64aDT+$p*8fL|t}jual$Zl14{+%kX63eXiU{F!BBGTj~fn)JQIjf3nZj))7WXpZBh! zF%RnDHgCyg+>en3ZzDRN8|F*E6WN$f!p0C+GU{tDRpF>kKLxESmTOwKn&2zA4)5h( zlOJroCj%Ki-6k2xYs`}aTK35Pd8VZ2zO`(<4WutkpA#6$+x&9Xs2)%2q|~gXjALtH zNEcWY<+|80yeKCti zY+m`ee`sR)Qc4j)!i|jLq(IjNKa%lQnIwx4jNr?hNy8wdQ%$eJFx3|J}X!lfqU0+40Ni%2sxVhq7 zCdS?sG9<5(9jEQAu=MErKtegi)^{OcNR6wix3PO_tB$uy!>NZHsptm?jdl3a&h@gT zrQIWg?P)UadMW5GX^U;h-bt&op@`9519OW>4%99N(<%_#5K#2nCIXn@_-1na%j4Y5K3+ zr$&$S-uXA#eM2PP7F?*ZBW&qUBeeZeKGwJryApk`2IY?E+&16PhrR1BN9^_7dQ_>` zzj18h9WAgmN>O~oBGgYe>~x;c#U>XQz#)%@c?qb0ev5Njmn^GQw%8`zD>rc zYLsWjF0G%^d^VEs;Bnxo@5lN|qT;}y@u<>N9`o#NrvYhF(cza}IHur=+DqGxYG)Q~ z%dAK)jP1e3D<#&NM$hefz$&AgrzD9fiCpbegoxbAT_|J8%)G$~@DU9U%jzGY56QMT z9F1#`toO#PPeNliyr=!DZPx;sAI=%IKHuqx<9sY~>sH&Bn)m{Cmz8*y3S2{2f6EO& z>-Ugka&a5=^%>>*?u?P){rq3|&5wg9SF8pB4 zFf&g)KOKP>&b(du@uzHbH|fy(T(}+Mc#s(Lx{H1dEe&u;MHV#fDA(N|;x!7(z@Gt= z+=xB*$j}In`Vr=8Hr#UCsqD!e_&Udfyx58Dtja|u{HHsqv>AG(A0-FtvLC1Ta6YJy zAc%U_^;*oeHQ#}y?kp>-2`pf5t6EuS$X>>Q@S>%Ox60M?wisi6ul!^m?YA#J48RLI zXZ#=o{(TYQnJX0@agEwDEC}umZ{TQ5?uojG(aQPphI>eM#!7$7;>h#t21clMcpzac z?<A4jz5c)#O=Yz_tci!7X9U?_pEwI`dfa|) zk9T~PL|+cmz;zki9{>9Fd3oOMMmmBA@FtWpx6>qu0c4}G+&W|tKutaHv|W550^?uq zuPlCd{`f33Rtju_*9{R_Xv`X3MbDF~>p#1lgQvRja|vf?P$0McBSD1X+z)8W0bZ05 z=(d~eJ>cI{X{p|Y&G60pp}m?6%TKpp&T2j=uV5JJlStI}=}-rhHNUYC5c z=G|UPyr<8f)~@6hK%v>`22(J&kx2*9@}ns{(Fdt5w3q88<`!j#n-X_VfRnesIbs|9 z)g15Wv+c=mJm4Tv!cjQk{LIAuG;#d0X=!uvwSHuz6l{?5PN~c*p+01mg$&T6j^|}Z zuR}zOU#YmqvwN~FvA)xs>HHozzVY%kWS=RBs=-8PqSDF6dUV5mfmNGH6HPrT zs`8TinbD0YX^nh?6g7`VOOJ*Lh#8E&ycY8qZTz-9oB`$3YKSyDEmJU$+BoX7ZC{1? zeoAdbnijhqbx>M8uCBAxqg$4#YXON&1Ygh6Mt8UJdd5!dd^^6MgjCXNCUili=gEEY z?4A6H#N@S3^og7yh*7Ru+b|7I60xM&35N>---Mn0uxAUz0;l>-&4E)UXq{~7@|v2a z+aeP|()*!yoCaD2Z*P#!K(Zulb@|Z8Da46#&5g~^*Dew zTq94WuAeq~*J56pZPqfqNJhK&LE0_;hJi`zi|jIr%^V^U_I_KlH-yg=>{T^*CJ=RV z92K&*?FX_{aC0r!w{CVSNwHrHvr{HwMT5c~nBgc{SG;3SY9QQ+H^nP?@@;vcat!)j zBC`*vxL~M`LJ+kd9urj~-57_9YsusvHS8r16KqxIvKW4e!j*7a2skeB^QH^8AmuKw z_Z&z9+zN?{ZS%BohME^1R_2P|0Y4rV!ts8<{zeWdNA^bWwE;=Up3R&arbnm}U!NZ#xjCTfU+m17A z)&sNUwcimS~sA<~UxP2~QD!|E!&l;rU!~Jf@ z{_PnXal-oQtxXFhDs18HnbdY5L^gR@_Rtp1)dc?>yPT?^f>1E1i9!Q+VXnt}sQwCY zc9rK5Dt{h4>?hn-O9>14s&~uLrA~FT;4tZs9cVGR)095u9;zX|`1u&}i4%hA&Y8j~ z^3s2AaM;G4-lmRHJuX>jB zz$TlS$eMk*T?M8@_r&VoxeV$+k9ZKMk~^uturvPt3{cc>tRdVnO91NP(U89$kRi!O z3Do#9w!a8R4aunB_FmZ$;OG9E``{s>O09k){0mfI3wowj)j`%=v)5soZKSV6K3mcY zFB|aIY##8j)+qTr%NtHFx`OQEDjLi!<9b;$ZYEeD2=bz*)nrlA7H2SLH`{O4{aQRJ zn7WCv*Kx=+Vx0&c|4x5+&&q7tsQta1PO6QR6}_FC&QX9FyV;1^=8N90%F9Za_V)U` zI4On6nIvszeb#u5!i01(=2m*G-pK@e3f4Fc7%hq=k4<%qbtJNUsh3rqsX&Qd%Tp6l zF|$GT@J!FlIgIe<$$OhhFPOQit^#AnpUQK zW(tRCv0RYBTX%U?$60G7Q+VaY3w4W{VfR!ui^hTy!j8gY&tFN_34?m9k1{E^1dOZl zhO9bvHcyON2IJTHVnrpph~3z>3{&zL)Kx5BW~&e%P{==V11VdcC=k^nh7>WL^?8Tf z^mj8iMPk2P0dr5VPD+l{yQ*+LEgcOy&&i zFkJEWh2`e%%h?@vO`#iM=W3g~$(zY{M?49?7l+R=Ez254E_jTkH5HOqJ&)+i#fZyX zqs`OYRKJKkkcrwcCtm|!akDNG=e*~*{@u`!>!Ct<^2fPr+}*(=%cke#X*bsxJR*w~ z62^+)=bCEFpstVKM*bv?Q;(v^K-9PvW1vF2>y5(G_kh*<+qD0ahNm6(c-s;~~Q8@b9)BATMfKfcG%X!SWtM zaY6x0D7S=Q^&+vcP_{^mW;{gO)Iu>bAsP9|B*e#`rjX1nM*)Q`SqbI}<2C0WFP@RGNWPl?Bbx<`M~o zXF9O)~@*0_pTg|z$bm3lOY2EseekS?s#7Go#ejAc5;QUi? zfybi>Ow`;;n3lr+;HW;a&T&y5p;pnD{Ee!07dU1lO~wcg4g5Jg#(KjEztCa6QFzJ# z>}da5I?Q!PaD0bvc$UDsO{{)m=Dh}f$bGG_^TYgeH+y-FMIqGW`f=1P5K}MZ#)~xS z*#wFe_7U6WgV1!Zu8!LfIhxj z4;k;#bsE#c&D~U`VlBNVNd@NWnKA`6Z1hTqCyepgcL3GNm4Z z5OuBMKX?+Y>0dla$n@B0oM#_J;TSZC$vB2aIFbh_(LtoWmu~Y38Li4QZ{Gm!MrhGV z7$wWFbXRk)ob|DQNbK5~JG1SGAv7;uVOy+*s;;H_gN}&bQ+D+oD$VuBmhX1T9p$#6 z2XP-pb?ZcKebM2l`f%u);cVXp9g*4GFvgN5^?YI5Gh_!@Gs=3lI_@WHwCtWu)Y3af zVh@~&3&&pPqU<7?n$vj_(ff?`aU~<}w%HAnamUo*DTnTau*TtFRO4c^Y@J1NiA!&V z?>uMCyMcPOzz^2@WBrOldHei2wu+pa%zPZ$99Cz0Kako)ZaWhh^k3=p;2B-P-h?_u z1RFJ)Osd&ITonWgqdEk=1={dRDugU54dm)YUGQk_N6mIrK{NWHJZl|^=Mn6BOKAYmDLJn9&O`k8}S+M zRgmrtzE9X6o_L>WGq0(7lpO`L1r1&NbkZtrO%uh~WudxHTTtJ}hq!}Ik62n|ka#NN zIQ)~5>Gu5Mhg}Hy)^b;fs!FzYlczOvNdlLHhZT`A2K3O*))EGFhyq9IY`m$;j#2Pz znx0T-P1p9mFkC!a*90DA9(GS5+O~Iw*_#$I%*G#suh%`9IzP>{x0hm6^+KxUBQ3Sd z9^YW~+PJ4$7Ync{5(23kM~kDyns$CtrK|S){L5^V-szX~R6tSAO;eR9Pn7a!VN1eA zg$x@mt8>fZ1@~301{8-qF@*|RvNBZ5S`YP;9l9Z?xxT(JWpBW@TX~vMiNaaq610uR z=N?QNsFn*YPFv8mt3U1}DV^ftIrxDqV!%4mH@lrw9@XsJrnq9Di(lN{X>DPs>{X38 z7Pe29fzw9_-QtQDG++1T0L4YrzWGj}jO(7PltNP!D+|ycfH9 zVq6BzNiHJ+?{rOX+>5~O?fXt<5hEZEgEto0o>+XNpZ|stBog?ZOXVfmzfv;omp=eK z3Gi(+EM?)d0^)4{L1+OgJoPy3JOi50OV0`rrQzN&KoM7Q>%Zad*j3ipvC#a=+BCtTIaf@b9aH|Ppqbb8veQc{ou7M-j`|dsuFHju605t zd|`{@AEP4WzNb@5-Wuy%@td+tzE2hFVT_>Q`!ny>`rdoV@yzoYg$`h5?|+kpa9#$h z1_#Tfpu{b9^>S>?##ZE4F^PFu%>1ASPZc)>8(hNU*JjKC(zuT)BO1-IIb1#NuYHjd zcGnnAy&6!XXqWpW#i+p*U`$vM(A-BErX4Y()EB{ik{8P{EmmDuX+fM^=p`t74K%-v zW1V!f!aDareK$Du!T#C8=d3KNyj)7I`V_J(Rl@Y$}A63_&kjHMDuO!ZDRWv_ld#F(zrs7fUB5leAIP=d(6h^Yf#S2o{ zW!j>X-G0nH=2l_u?vu6!*`I_Z*bG!Xc7_|RwIwaNiUpp`nkDtL#p#Y%WJ?5!6@_1U z6ReV?E$EH_v2hv)tP}aFkKA~u7E0Wz4LC8|EL{lT>pfRfea*F?dw^1Ob93T}^2=?VRdLz*CD&4c&X) zd!~4xXRi#0*R>w4-9qR69WrG+vj=<%$5LVZvHG_k(h{cLf?LdDR>m&~ z*lxwWL-;T#x_VcCcUfOzGy2(7<#V~bd3>9%0y5$374dmsl zgMeaOj?`3C$)>?8Fb4>kdX;f9m!; z=?^+a_=jF{lg?>qzft+&@if55*n1lf1}Q$2#sMi?oij;4rDNDp5p0O0Bw`9$*$qxa zdru@s=g#w2cfGRa3@IA8G+mO_FlKTRi(7(^Wooh%UOdPX*VFw}73r)(guC{#rej%H z=X_yc5(u-1Z|U8g>t${lRtUsRAfi}@3e|a?T#5{GFH;JX{M0m7E4^4TI(N2o%-D&s z8#ncAcDjtwpycAHqBR3hh+3(Q0ocO3dVtJ*x*hdA&y32o%2e!!Vs?7$Yrk*Bn5?}i z3s%oH<11q8oaW%2_O0ZT`P-pU$E~)n$Wy zPkY}BdtTR~jHq>DJu8~X(jFJ4LUX0Nz>|517C@1zp*31=ACj!UcjlG0WD00=)w@Wu z?a+beGpgoA52|#Llsk7VXP+++pWa3>>*fSmRr`$m)e=mS|OEX0>Mag!3QX=pFb=j z&!q0F6-t~xEuhKwJU@Z?eG^R7zHbVb=r6)A)4`DU7iP24az3mTFjF3~+e3Sei7#06 zG=^vG4@BjAk7g`$*~gDIRV>n<_2!CX-?U$(;>ebA~DK z0>=f!EVG?u50O5a4#nGF+@+2-StA9u#Y(r0CgX*BA;nq5B?+3J3 zwogi{c9wuaZCtg$YboOL<=Np0LR1?2GYW#%Ol=+E=Hp+)CTbr7G7gs@bA82q3bxp` z`Dz&h7jt+1nY5j=C*_8zQ@)z$P1X8E9;sGKA&bZ>uzbzAPm#N{ZJ^NveQQ>|+p5dk z`grAqRIrC@dUpj*Qs|V?`QGC9tJ{?~yUZ%iYtnc&^nNUSIDF=nxu}va;Tz7<)Y!Zm zqJk!D{CR{z`wh{ggbr;zFmjl&Q#dRrz>Mz1tDc2$PDg5AGsJPdNxN72XlTmdMT*(@ z(4|B>2mSrST$p&vM3!MuinDySnP3uAnnC_cp*;qd5*A?N5u<;&>)k!4(;)Kdkb*59 zy@h>S81G|(eLis+<;F<*!?K#;Y5ST^9TrBG03G0r&e&Q*r(9IMwDw#An5i?Xwwt%P zw7f1-64}~LSpiUT=;1L`PLpw1fZ;<0hx0jIKA>c^=qOnK#)J=g=HL1abII^GiSaAM zuD>_I8uM6I=cP;F6!l(-Y zp6A$DUGHyo&&qv(-SO*Ca>FNe-wr0uXg_>FpM&LNlJ6yY3)2lXiNBDQI4Bq}EJd!;M$B0LJfmbM=mmng1 ziK}oTU1aAR`*?jvoJQGfy*0dEH~>R`M0t-qH)c+k>`p->Ys_Dc_9uBFP*>$rgs@um zx_KH92co{Tf&roH-bMmAWky`S>T5DiBz++7BVv&LD8^Ds=j8IOKwMDNr~e3Mf~{B{ zSVVW*#+T$>wS0x2cvGl3%bC=13?P$sLu3k-6wN7>Z{z|#`d^Zld!HqVe>u{k#DjMM zfzl{1Akmq+5?}P11?6SSGf#G4<-k9dMMhkN3yKgF{H()af|p7b4p5YLqyAP5zyk!I zzmLEd9oBVF7`X37G3eOHH}RGU3&noT7#2p>Y|%jgh{6-j{GM8sfC>wODYY5y~V8voKTuBXk}5Qq(WOZUXe(Z(4%qaiZ>%U(}m{i5Ql8qq0%C9zbVYm4A(v zqjCUuh8BEO5OG%xMD1kzu0V}GNLH$oYeevmHvhr7@t9EQ%26WJ9QHZ+Rlqqn;m#Ac zAc8P|GBXMsaA+Z zuWkX;MZ|eOOBi;YmNP+vzyuFtUY^VdyOV8lofdJq-icV&_V4k?_PnLpPvnKH2_?1{ zc6t!9_S+BaA*29`k<73q-;Ne^jgRJ;xvOS>1q>>)@~z1(@wpTwfdlF>vHzQ73wC!! z?{jKy+zw6@4G466hPa$ywN9mJQv83%1N1WLVgE1Vlysp|xh~9d&I*EaD#w( z`%W3QnS{8k!&X3~(GAc?e>gnx+yAecZI(BFjU_UkO51zn|3Kx~O+e-VJS9&0_mf=G^ZPKd`*2Iv*%p7fmc zV~{Lh9;bemZ~AIpXb-z$g_M7-jP^@$KKqll zkd;`TxK#G>jc#B^`&}{li%@AzoGH8Ot&kORK>KJ_wE}E4-zjZ~ zs<7-itYuiuzwZGqe!%q}0#Bl4^_ToiTa0#izZ}m$x2wD6fkB!$;G=uF`d#m1oz|)$w3;(n|oJ_6*AqZWSF32bb?( z2WkY}3LpNbxIki1k}oVEI4`vb2JE9jD;(J*qo44TA1zPy<~GjNe5J<)rFQ&fH^AN$ zaOHgj--d);_+^f2k{#QAEJuG0iVN%3V5vB(xAU#(kaX!@iO$E6yENfE8~BG)9WaG3 zrE>a0A9<9IAUi0+qp2E(J~X>62y<8oW5uN*W1|925l7m3$B)4J1Say&%t{Jh0HaBT zHufFQCu%X`Tz$2uy^lTf$9e^a&n=~7PcG*^!d*^8fDoy`UhsQ2UHQAc2%BUEl|B?+ zr(Y<<0X>^1jZ{lXw0{iA5Bopk0SZ`6u8v>>HFGlZTYSA_@){s}Wnbr3fkPgmum%Z} zNWmqF4t^1awHXdUUCZxX_X!R-c1!}`lRaOm1{oev>304YXbJm~C`xZy`T6oSG&^to zk73hHh>R^E0zCy&3oYMhW>4GHzp_X|I^brd2PhwN*axL;3yCS#o6ch_TaB#X58<9_ z1s}_I?c8F@DZ@vFK^S`4SxE~vH#cul%NVZO;S__BOX!Wmr#Fb=?V{m>)d?n?M{`a| zJzfbD!WzXNwY40GTp`AM_BKbBCEgX#>FvvjpY&NLfBEMQ<1=(TsBUw8D|j2%dNt+> zeCO4^xO%}Dky+nX+i-!VbvbboG(lF2&FwiYIP54r_#sC=6& z9}uC?ViOqkfSl3X1%sl{_DT9P`$C6tnD@9gHU-nVWPEMoMK8olhFBb`j1+YEH49*$ zuB2a-oztDAf1ujbGes<uhU=hrYiPZhp$dTB54`Wl5lb%wB@R};V8!iw3Y#*>o{6-1b z#F=?3WcJNFU=_EE`Fv9Hg8U6fwCCws;%I@~f6+tRZQNA=z4JnW1-Fu%MT1Zsg9=9&Ro2S@QkkTcH_jqT=8Dy?U1;BuL< zq8=?8OMhHM&}4buo|ff0y;0OM(I5xnCsT9Mj7`(gZ7zJ9Hia&ru^SEv!O(&f1)PTP zAAFQ8;b87NYg;%<=&@?ZA~s)v(i3P;j5H2ZW|KpHDcOH2UK ze#HGSNL7q}UBU0@qAJ~1!K@6ZDRjW?8;vdkuCwWm>{@Dhf+aPY2UbJ3qdKSNQn~@XkDIWgN73sM}0bSZ;B% zJ1xKGnf`O?9gTXyQ*Eo+vn$MNzJX?CW%^;mnR&_Vg(w|W1qgok6L#w-8HHrs-Lzdr zY9EYTG#G7~IdrD#Tw1oLECgq)HGmoJVvB4AX4uG94q~@+ZiQr;*&E?lVJ(8s8a6_O z(wB|(i-ub!ql@8zL~t&+O6}wTz5g?PsPEMquN!1wpXOe~NaAa$etSV6VQcwK+OTN3 zg^*F6cJfg4STQK}3u;DmFo9)k)?Dfe3Fr9Qj@%)%h>J-&)y9lQ!O;?~667-oNoXqR zlW{rGpAe5&S6*S&fI$^0V|}EJ%D+Dg6~rTIZ!fC9Y#alf#E5NP>VK3{AU7ht$o-*Z zuRqDKXw2smQGEJ>?~LV+#`v0c4jM^%J#HnI5k6*x&Ti&W%@*~n&0Vb}TkZmamzpg_ zMBowI8*e#PS`r%9}gEV77Kxg08>D6*@Vys|ukjH_3JawkVxTQ`B zp=>6Oo0nrvrZ&S94+i;6AS%>BEpxl5VKPY&m&YnHT5w7s`wNO)sB1byzSVo_*yo^n zH4!CA-0MS3`MD(DAM7l)yKY^>7ZwzyqF?Zbvh~EivVz(nVNSCE2-M&#P*inj6In~8 z4iVEwl7A4kf7WUew6EoUpMx)gW;XE7U);5eNAO( zjau4jf%PrFj-Eo!BZXF+4^29eS2{ z53OypxgXtfpkC0GqSbPSoBxuT8rc0QGrbQbxJEnofjB%X*#fbrGVr&M$vD`b+)RpE z#x7ST%)R+2ugUarP9El|U_|5Xva$8A-w&NFO~H0ry_CYE&`f~v(#ZKhq#MZfiH;{g z-r79jvl*?d4btPj@yzzpJZS;KZp_j+y)v{8~?t&AqGO0+kk0@L3^r?(BFqLYbhUUdtU&{!-J5wt(rJCQE7MlnN;aCKGb|4mAV$U~O-mJy=`nr8=gZok{OQU@Bn0tM3PKsFRUXh`9_h@v^KDh*ova;he+s@*O=h>0W0NF>BfU)yZs4KuCl7>a#> zHY%riFxI3A8o-BzYrSOUE_=VfqWJnfRWFDdcIEjvK#p;);?H>)tAf|otcIFUtIXh>uF~JT(gs3Bh$W#YZk_W zhsCIWQ4GHlq$$7Q;~ngehXAPkKZm|V7B(Ig&_bDNCG|@`^Pw-Huc$Nrx2q&k4FqeR zQ75LW6Iu(RY=J8=pw|mjzjO(-|1a8?6$6tyZdfmNPZ;YqVZAggV()nWIo)h!-rLrG z(p}0<-#&CI9T36nO+^~11D9w_%)Z2WDJENlJ~XI3qOF`I514Zx@3bkDIU@#7=p$d1bwJU;FNv6pYY0C9cSQfpc-{i-?UiLXdBr2^U6gq&4~kXqNx zy7?5=7(9!ZmAhx7Q}>VB&=4YhpXLj_Hq)DrDhWBiyPX}_)xAjrTc&;1_ie7&RIS5A z5$o{G@c5jw+<5w(qOZWoo7?iJYr_CT@@Q{5(b7eHPx-8E>uct)eVbJ?L{x@W#zaof zXXqn6TdomdHns6Ctu^T_D@CR-!ejP|o`+WGa>y?hz#HIA{}aUfZ@txj;9@#OxT0!s zS!#nfOxnAmA+rgrMF^ zw3||^zRi2dZ*r)%Mvk3`1Q3%y?odUNplSfISwW1QX;7>v#O_0yVr_i!8)7d8pe+&> z+Xx>(+@Ft-$NQwOpwITcFrnU1VH|OD&G%4DAJ?c(stYSm_h-&vAD!W3T5dx0>B}{g zYkpBDz&3(&*jI!f1vJ9RL;Vk=2N(N=^f*L&o26@&VecXqul}kD1`)Oj83nGNJb#<9 zOYHrK{ZFumdG;sR;}I3qG2F~MnVTeUJ5KT$5rd5rPRPoRo?2efH-T+CzE50G2)lzp z9y2sB_#NrB5^3#K)}Y zNU@*1DqqQ?Wtw7*&-^(GXz{&U^^a=3KbBmS1U}vO zM>IwH1u;*h@|m6O`u34roKp6&-c(s+qh0iC@0FL2tC)~f+?saC+>Alhydi6x^mBpK zx4E1$vnt%zY>3_+MYrxp><;fHj@C!_)nf7Gq_l_P0i_ij?LdRW%BeGDse1A{wzbS3 z(|6DcTw66dF1DDDD#py7=DYbQDk8`TEguOseCs%C+^gF;GCM15EmK{epKSB{*grtY zQsUO98G}n~$Us2j|2R||gTknyjB{ILi-vy9sAZ@HPyO@c?5_n!xtONZ6tbJM#BL*L zlUyEr7LhUo6>A!psMvevj<5nRB-V6ZC9VOgZ<@U-v~n6)#R4XN_-)C$OxB6i;Kud-RTU zp}tS3P6rnXAT+koa@nt}Z5}v&10wNnTRGM>B5w^P>CbuJj;*osk=TM}=eg7is=7dk z1nQ^fI=;GKq|bCrmV<|_iqI&!uHTxZOCj0@Isdr2MF`<^!q|0+nh|MQ7fHretW^ro zzXeMjUODq9cz_X9jmZn|Hhw9>+4C2c-8vQ9DLEGKeI>)t9Cy@e5IX1J(RObTBF!jR zGe!32Wv-q&;4;@uE6aLFG2-^1yAxBb;vm`|e?{=>aF%n{qu$N(rS)%@!oP7q?A#Sg zR%%(Q=1EpVj#e!Xhefn@kw=|`J+`IhQ_hMFNT=ZD<+moDjQlkyGGtZIx4C0S#7iI` zhUc2P9Bm6%Tir=OW^8?tnS12y{bhgpAkIEJ=tXM~(UR7v_s^XRlf$)!jTbErAtks? z4x#_Kw6$yeDGouTHkCM{mcEHEt$4 z!r@_%Pkkj-!4QF6M<6V*P{_4`;^H;Q7TlR8_3+p$rWKr20Hn^dw%LqqQSM$0UK3=^ z-wEs}Slw>PTy;zXqTMgpdoy;+ZQss$CG7E$d5&zpwu7NFVCZZePIWAxjSv7fS>*MI zyE~(jwy^MW%?6aA5iy0JPn{F;(e4N@1F>ZVI@^J>s??slTUQFmRojkIem@|x^^u?| zkc-C3Z0A@}Cvr$^ieB9?l{>{ECU#py*Eak5oi$(PZC|X|XB-gw2pKBhsYW#LnR}lG zhAe`CTF1!B$CTirW>j*qgC)egaKy^#R$M4}bSLLK`N7rHojhVrO%_D$Lln!Hr<>yB zlbb^P`RI%~H0#VZ8M)cGf82)m&1zeH+t3i%X2ourChIFYYf6fqO}rK=q5Eu|_)W8` zoiFmAsH7Uy#r&w>HEFFus(&arw#-G_ai6!KFORZ`%#e;nxr=w(y>GI+qGRo?=hI+B z+4)n73dJa>)YF6vXLwi#LkA{K(d~|q_*#biM>2h`6dME(Gu2q7XE~jK9a9I9U z2>*BDH}&fXEhT%1yHbcFOg3^lMY@nVWdhKrwz(f_(HJpb*?HUV+*0$k-WGxGr}LFw z&(b)*{}OR$pNg|OG(uX7c58k_L2xKT=m(c(#jhQ?+MYe2 zGxiN>XQ(iU<;1i1DeHgOH@*b})wRRm`t|!_H{k>TY7H)T^`vz$)uegU`4^`CAI<&; zZixu=Ow^O0!*=BZ4Irnv*755qJbm_K;nCCu?5hj4h)Up2(T-#h*I@2F>U#id4Jz;` z>NK*wm;`P>EA6rp0euK4Fl-n^i5pr!1im4F#l|Y-^fZ|mq2H6tqYOlX0%Y`Ha?80P zk0`kkm=x)Khdfrtu+W!Ual61Btb+Xb zfbfue`i8N8YJbK}tydv#y`6(tKcCb)1(W^;wVj{n?nH;ok^eFg&cRx z4H^Ia!w*hVl$6Jcn1*w5ee8E3s9*Ujj&M&gqy5fL?4zV~vxc7qk|i`bE+0)KYAs+BWHDz%Y4Hc2Pn| z`Ga1bp^|wmFlxufBx>aK7u*k@MmUeB>_v@wE6%IjSE<<5zs@n#ET7f+F)VkJo0lJ% z_1&~<$DxZSgGpuW^zMH5^p$DLz0kdw&Rhh;Gd7DcJ+ow=*xc6Gz-`658$)Xs!>T1) z(%|!Kzi^UiV(C){dE556TSD`Xle~s6w)!y~Lh1{HG9wMzSnK@FMCjtQu>&7`jYh19VX}U{ zL1qyJPj<-E-D=Ir8s1(1RHKGn3l%@uG4I6C-O)ea*O|YtbucuXIg|D^!T|?z-3RWk zA0G%EIibhv&k8-8r@^tVRu(&UakLl3=ls|gfIA1LbesO;zQ=>&KCG(!!1pPV9DdTZ zemlR#iGvM0B}0f3nuEBk!RBT*$WoAtXS zVqRjv3JI_(j^+?O@y(T?=K4n<BS$@T?K$urR_&zT?505Yp zk6`O%?5Ae_lflm6g_XJI|IQ%0SlJC^;KbHoWojyH>fq?`BdgZ?Xn3shF}w!Ddna|vh&>URJ?gXE=Eo|H>Id-eYS6$<*T diff --git a/docs/intro.rst b/docs/intro.rst index f5de85cc..c50063ca 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -17,14 +17,14 @@ The fwt relies on convolution operations with filter pairs. Overview of the fwt computation. -:numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{L}` denotes the analysis low-pass filter. :math:`\mathbf{h}_\mathcal{H}` the analysis high pass filter. :math:`\mathbf{f}_\mathcal{L}` and :math:`\mathbf{f}_\mathcal{H}` the synthesis filer pair. :math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. The synthesis or inverse transform on the right works with stride two transposed convolutions. :math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{L}, \mathcal{H}]` denote the corresponding convolution operators. +:numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{A}` denotes the analysis low-pass filter. :math:`\mathbf{h}_\mathcal{D}` the analysis high pass filter. :math:`\mathbf{f}_\mathcal{A}` and :math:`\mathbf{f}_\mathcal{D}` the synthesis filer pair. :math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. The synthesis or inverse transform on the right works with stride two transposed convolutions. :math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{A}, \mathcal{D}]` denote the corresponding convolution operators. .. math:: \mathbf{x}_s * \mathbf{h}_k = \mathbf{c}_{k, s+1} -with :math:`k \in [\mathcal{L}, \mathcal{H}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to +with :math:`k \in [\mathcal{A}, \mathcal{D}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to the original input signal :math:`\mathbf{x}`. At higher scales, the fwt uses the low-pass filtered result as input, -:math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{L}, s}` if :math:`s > 0`. +:math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{A}, s}` if :math:`s > 0`. The dashed arrow indicates that we could continue to expand the fwt tree here. :py:meth:`ptwt.conv_transform.wavedec` implements this transformation. The wavelet packet transform (pwt) additionally expands the high-frequency part of the tree. The figure below depicts the idea. @@ -36,7 +36,7 @@ The wavelet packet transform (pwt) additionally expands the high-frequency part :alt: wavelet packet transform computation diagram. :align: center - Scematic drawing of the full wpt in a single dimension. Compared to figure~\ref{fig:fwt}, the high-pass filtered side of the tree is expanded, too. + Scematic drawing of the full wpt in a single dimension. Compared to :numref:`fig-fwt`, the high-pass filtered side of the tree is expanded, too. Whole expansion is not the only possible way to construct a wavelet packet tree. See :cite:`jensen2001ripples` for a discussion of other options. In :numref:`fig-fwt` and :numref:`fig-wpt`, capital letters denote convolution operators. These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. @@ -48,10 +48,10 @@ This toolbox provides two dimensional input processing functionality. We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products :cite:`vyas2018multiscale`: .. math:: - \mathbf{h}_{a} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{L}^T, - \mathbf{h}_{h} = \mathbf{h}_\mathcal{L}\mathbf{h}_\mathcal{H}^T, - \mathbf{h}_{v} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{L}^T, - \mathbf{h}_{d} = \mathbf{h}_\mathcal{H}\mathbf{h}_\mathcal{H}^T + \mathbf{h}_{a} = \mathbf{h}_\mathcal{A}\mathbf{h}_\mathcal{A}^T, + \mathbf{h}_{h} = \mathbf{h}_\mathcal{A}\mathbf{h}_\mathcal{D}^T, + \mathbf{h}_{v} = \mathbf{h}_\mathcal{D}\mathbf{h}_\mathcal{A}^T, + \mathbf{h}_{d} = \mathbf{h}_\mathcal{D}\mathbf{h}_\mathcal{D}^T With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. @@ -67,7 +67,7 @@ We can construct a wpt-tree for images with these two-dimensional filters. :alt: 2d wavelet packet transform computation diagram. :align: center - Two dimensional wavelet packet transform computation diagram. + Two-dimensional wavelet packet transform computation diagram. Two dimensional wavelet packet computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and reconstruction respectively. @@ -90,14 +90,14 @@ Standard literature like :cite:`strang1996wavelets` formulates the perfect recon and alias cancellation conditions to satisfy both requirements. For an analysis filter coefficient vector :math:`\mathbf{h}` the equations below use the polynomial :math:`H(z) = \sum_n h(n)z^{-n}`. We construct :math:`F(z)` the same way using the synthesis filter coefficients in :math:`\mathbf{f}`. To guarantee perfect reconstruction the filters must respect .. math:: - H_\mathcal{L}(z)F_\mathcal{L}(z) + H_\mathcal{H}(-z)F_\mathcal{H}(z) = 2z^{-l}. + H_\mathcal{A}(z)F_\mathcal{A}(z) + H_\mathcal{D}(-z)F_\mathcal{D}(z) = 2z^{-l}. Similarly .. _eq-alias: .. math:: - F_\mathcal{L}(z)H_\mathcal{L}(-z) + F_\mathcal{H}(z)H_\mathcal{H}(-z) = 0 + F_\mathcal{A}(z)H_\mathcal{A}(-z) + F_\mathcal{D}(z)H_\mathcal{D}(-z) = 0 guarantees alias cancellation. @@ -124,7 +124,7 @@ Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and :numref:`fig-sym6` and :numref:`fig-db6` visualize the Daubechies and Symlet filters of 6th degree. Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. :numref:`fig-sym6` illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in :numref:`fig-db6`. -Consider the sign patterns in :numref:`fig-db6`. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` and :math:`F_\mathcal{H} = -H_\mathcal{L}(-z)` into the perfect reconstruction condition :cite:`strang1996wavelets`. :math:`F_\mathcal{L}(z) = H_\mathcal{H}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. +Consider the sign patterns in :numref:`fig-db6`. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` and :math:`F_\mathcal{D} = -H_\mathcal{A}(-z)` into the perfect reconstruction condition :cite:`strang1996wavelets`. :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 5d2028b7..e87574dc 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -1,5 +1,5 @@ """This module implements stationary wavelet transforms.""" -# Created by moritz wolter, in 2024 +# Created by the pytorch wavelet toolbox team, in 2024 from typing import List, Optional, Union diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index 475f3aa3..2e1d7d51 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -274,7 +274,11 @@ def wavedec( .. math:: x_s * h_k = c_{k,s+1} - Where ... ``TODO`` + Where :math:`x_s` denotes the input at scale :math:`s`, with + :math:`x_0` equal to the original input. :math:`h_k` denotes + the convolution filter, with :math:`k \in {A, D}`, where :math:`A` for approximation and + :math:`D` for detail. The processes uses approximation coefficients + as inputs for higher scales. Args: data (torch.Tensor): The input time series, From 72090f8de9c3f6c7eea191f640ee5315bb88ceb6 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Wed, 24 Jan 2024 17:19:08 +0100 Subject: [PATCH 16/39] update docs. --- docs/intro.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index c50063ca..37d225fc 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,8 +1,9 @@ -Understanding wavelets -====================== +Introduction to discrete wavelet transforms +=========================================== This text summarizes key wavelet facts as a convenience for the hasty reader. -See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. This text is based on the supplementary material of :cite:`wolter2022wavelet`. +See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. +This text is based on the supplementary material of :cite:`wolter2022wavelet`. The fwt relies on convolution operations with filter pairs. From 73a47e564a8a295d86411d895491359285b3c010 Mon Sep 17 00:00:00 2001 From: Konstantin Gasenzer <22873395+kgasenzer@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:38:50 +0100 Subject: [PATCH 17/39] cwt intro --- docs/index.rst | 1 + docs/intro.rst | 2 +- docs/intro_cwt.rst | 92 +++++++++++++++++++++++++++++++++++++++++++++ docs/literature.bib | 30 +++++++++++++++ 4 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 docs/intro_cwt.rst diff --git a/docs/index.rst b/docs/index.rst index 8c0c9cf9..1f9bf149 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -64,6 +64,7 @@ If you use the boundary wavelet support, please additionally cite: :caption: Getting Started intro + intro_cwt examples diff --git a/docs/intro.rst b/docs/intro.rst index 37d225fc..dfe3ef4c 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -80,7 +80,7 @@ More formally, the process initially evaluates with :math:`\mathbf{x}_0` equal to an input image :math:`\mathbf{X}`, :math:`j \in [a,h,v,d]`, and :math:`*_2` for two-dimensional convolution. At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. -Compared to the \ac{fwt}, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. +Compared to the FWT, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. Synthesis transforms reconstruct the original input based on the results from the analysis transform. Common wavelets and their properties diff --git a/docs/intro_cwt.rst b/docs/intro_cwt.rst new file mode 100644 index 00000000..f37d28ce --- /dev/null +++ b/docs/intro_cwt.rst @@ -0,0 +1,92 @@ +Introduction to continuous wavelet transforms +============================================= + +This page provides documentation, focusing on the Continuous Wavelet Transform (CWT) and its application in signal analysis. See, for example, :cite:`strang1996wavelets,mallat1999wavelet,daubechies1992lectures` or :cite:`kaiser1994guidetowavelets` for excellent detailed introductions to the topic. + +The implementation in :py:meth:`ptwt.continuous_transform.cwt` uses https://github.com/PyWavelets/pywt/blob/master/pywt/_cwt.py and efficiently utilizes PyTorch for computation and supports various wavelet functions for flexible signal analysis. + +Definition of CWT +------------------ +The Continuous Wavelet Transform (CWT) is a mathematical tool used for analyzing signals in both time and frequency domains simultaneously. It is based on a wavelet function, which is a small, localized wave-like function, that is stretched or compressed and shifted across the signal. The shifted and stretched version of a mother wavelet function :math:`\psi \in \mathcal{L}_2(\mathbb{R})` is defined by :math:`\psi^{a,b}(t)`, where :math:`a\in\mathbb{R}\setminus\{0\}` and :math:`b\in\mathbb{R}` and :math:`\mathcal{L}_2` is a Hilbert space (complete linear space with scalar product), as: + +.. math:: + \psi^{a,b}(t) := |a|^{-\frac{1}{2}}\,\psi\left(\frac{t-b}{a}\right) + +The CWT of a signal :math:`x\in\mathcal{L}_2(\mathbb{R})` is defined as: + +.. math:: + \mathcal{W}_x(a,b) = \langle x,\psi^{a,b} \rangle = |a|^{-\frac{1}{2}}\int_{-\infty}^{\infty} x(t) \, \psi^*\left(\frac{t-b}{a}\right)\,dt + +where :math:`\psi^*` denotes the complex conjugate of :math:`\psi` and :math:`\langle\cdot,\cdot\rangle` the scalar product of two functions. The CWT essentially provides a time-scale representation of the signal, revealing information about its frequency content at different time points. + +According to :cite:`mertins2020signaltheorie`, the Fourier transform :math:`\Psi_{a,b}` of the wavelet :math:`\psi_{a,b}` shifted in time and frequency can serve as an alternative definition of the CWT. The Fourier transform is directly derived from the properties of the Fourier Transform regarding time shifting and amplitude modulation: + +.. math:: + \Psi_{a,b}(\omega) = |a|^{\frac{1}{2}}\,\text{e}^{-\text{i}\omega b}\,\Psi(\omega)\, + +where :math:`\Psi` denotes the Fourier transform of the mother wavelet :math:`\psi`, :math:`\text{i}` denotes the imaginary unit and :math:`\omega` the frequency of the signal. Consequently, the CWT :math:\mathcal{W}_x` of a signal :math:`x` can be defined as the inverse Fourier transformation, as described in :cite:`mertins2020signaltheorie`: + +.. math:: + \mathcal{W}_x(a,b)=\frac{1}{2\pi}\langle X,\Psi_{a,b}\rangle=\frac{|a|^\frac{1}{2}}{2\pi}\int_{-\infty}^{\infty}X(\omega)\Psi^*(a\omega)\,\text{e}^{\text{i}\omega b}\,\text{d}\omega + +where :math:`X` denotes the Fourier transform of the signal :math:`x`. This mathematical representation can be used for implementing the CWT. + +Time-Scale Analysis with the CWT +-------------------------------- +The CWT introduces the concept of scale alongside time, allowing for a scalable analysis of the signal. By varying the scale parameter :math:`a`, the CWT provides information about frequency characteristics around :math:`t=b`. This property makes the CWT particularly suitable for analyzing high-frequency components of signals concerning time. Additionally, the resolution in time and frequency is dependent on the scale parameter :math:`a`, with smaller :math:`|a|` yielding finer time resolution and larger :math:`|a|` providing better frequency resolution. + +In digital signal processing, signals are discrete, necessitating considerations for implementing the CWT. The CWT is inherently continuous, but numerical approximations are employed for computation. Unlike the Discrete Wavelet Transform, which operates on discrete time steps and scales, CWT offers a near-continuous analysis. This is achieved using methods like the FFT for efficient computation in the frequency domain. + +To use continuous wavelets effectively for audio signal analysis, certain criteria must be met. Wavelets should be mean-free and satisfy admissibility conditions ensuring signal energy normalization and invertibility. Commonly used wavelets such as the Morlet and Mexican-Hat wavelets are preferred for their properties in time-frequency representation. The choice of wavelet impacts the trade-off between time and frequency resolution, with different wavelets offering advantages in specific applications. + +**Key Points**: + +* The CWT is based on a wavelet function, denoted as :math:`\psi(t)`. This function is scaled and shifted to create a family of wavelets :math:`\psi^{a,b}`, where :math:`a` represents the scale parameter and :math:`b` represents the translation parameter. + +* CWT Formula: The CWT of a signal :math:`x(t)` with respect to a wavelet :math:`\psi^{a,b}` is given by the inner product of the signal and the translated/scaled wavelet. + +* Interpretation: The CWT represents the coefficients of a series expansion of the signal in terms of wavelets. This allows the signal to be reconstructed from a weighted superposition of the wavelets. + +* Properties: The wavelet function :math:`\psi` must satisfy certain conditions, such as being admissible, which ensures that the CWT can accurately represent the signal without loss of information. + +* Time-Scale Analysis: One significant aspect of CWT is its ability to analyze signals in both time and scale (or frequency) domains simultaneously. By varying the scale parameter, the CWT can provide information about frequency content at different time points in the signal. + +* Implementation Considerations: Implementing CWT requires discretizing the scales and performing convolutions. Efficient algorithms, such as Fast Fourier Transform (FFT), are often utilized for numerical computations. + +Example Usage +-------------- +The provided function :py:meth:`ptwt.continuous_transform.cwt` implements the Continuous Wavelet Transform (CWT) for analyzing signals for usage in PyTorch. It computes the CWT matrix for a given input signal using specified wavelet scales and wavelet functions. + +Inputs: + +* ``data``: Input signal tensor. + +* ``scales``: Array of desired wavelet scales. + +* ``wavelet``: Continuous wavelet function or string representing a wavelet. + +* ``sampling_period``: Sampling period for frequency output (optional). This must be given to obtain the correct corresponding frequency array (see outputs). + +Outputs: + +* ``cwtmatr``: A tensor containing the transformation matrix. + +* ``freqs``: An array with information about the frequencies corresponding to the scales in ``cwtmatr``. + +Example Usage: + +.. code-block:: + + import torch + import ptwt + import numpy as np + import scipy.signal as signal + + t = np.linspace(-2, 2, 800, endpoint=False) + sig = signal.chirp(t, f0=1, f1=12, t1=2, method="linear") + widths = np.arange(1, 31) + cwtmatr, freqs = ptwt.cwt( + torch.from_numpy(sig), widths, "mexh", sampling_period=(4 / 800) * np.pi + ) + +This code snippet demonstrates how to compute the CWT of a chirp signal using the Mexican-Hat wavelet ("mexh"), specifying the scales and sampling period. The resulting ``cwtmatr`` contains the transformed coefficients, and ``freqs`` provides information about the frequencies corresponding to the scales in ``cwtmatr``. diff --git a/docs/literature.bib b/docs/literature.bib index 0d3354f6..d4a480ea 100644 --- a/docs/literature.bib +++ b/docs/literature.bib @@ -110,3 +110,33 @@ @article{huang2022anisotropic journal={arXiv preprint arXiv:2210.14874}, year={2022} } + + +@book{mertins2020signaltheorie, + title={Signaltheorie}, + author={Mertins, Alfred}, + year={2020}, + publisher={Springer}, + edition={4}, + doi={10.1007/978-3-658-29648-3} +} + +@book{daubechies1992lectures, + author={Daubechies, Ingrid}, + title={Ten Lectures on Wavelets}, + year={1992}, + publisher={Society for Industrial and Applied Mathematics (SIAM)}, + address={Philadelphia, Pennsylvania}, + edition={9}, + doi={10.1063/1.4823127} +} + +@book{kaiser1994guidetowavelets, + title={A friendly guide to wavelets}, + author={Kaiser, Gerald}, + year={1994}, + publisher={Birkh{\"a}user}, + address={Boston}, + edition={1}, + doi={10.1007/978-0-8176-8111-1} +} From 41b055d267aadb92d4a30eb084e25abd767f02c8 Mon Sep 17 00:00:00 2001 From: Konstantin Gasenzer <22873395+kgasenzer@users.noreply.github.com> Date: Thu, 25 Jan 2024 13:39:09 +0100 Subject: [PATCH 18/39] linting fix --- src/ptwt/conv_transform.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index 2e1d7d51..ab9e906c 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -266,7 +266,7 @@ def wavedec( level: Optional[int] = None, axis: int = -1, ) -> List[torch.Tensor]: - """Compute the analysis (forward) 1d fast wavelet transform. + r"""Compute the analysis (forward) 1d fast wavelet transform. The transformation relies on convolution operations with filter pairs. @@ -276,9 +276,9 @@ def wavedec( Where :math:`x_s` denotes the input at scale :math:`s`, with :math:`x_0` equal to the original input. :math:`h_k` denotes - the convolution filter, with :math:`k \in {A, D}`, where :math:`A` for approximation and - :math:`D` for detail. The processes uses approximation coefficients - as inputs for higher scales. + the convolution filter, with :math:`k \in {A, D}`, where :math:`A` for + approximation and :math:`D` for detail. The processes uses approximation + coefficients as inputs for higher scales. Args: data (torch.Tensor): The input time series, From 09629216471c271640a34f589a1c4c9cdc5ebf19 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 25 Jan 2024 13:48:30 +0100 Subject: [PATCH 19/39] small update. --- docs/intro.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/intro.rst b/docs/intro.rst index 37d225fc..279f679c 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -8,6 +8,7 @@ This text is based on the supplementary material of :cite:`wolter2022wavelet`. The fwt relies on convolution operations with filter pairs. + .. _fig-fwt: .. figure:: figures/fwt.png From 5175a78ad2bd2386634e19595027592e1126d9a7 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 25 Jan 2024 14:43:38 +0100 Subject: [PATCH 20/39] uptade docs. --- docs/examples.rst | 39 ++++++++++++++++++++++++++++++++++++++- docs/index.rst | 31 ++++++------------------------- docs/intro.rst | 45 ++++++++++++++++++++++++++++----------------- docs/intro_cwt.rst | 38 +++----------------------------------- docs/literature.bib | 3 ++- 5 files changed, 77 insertions(+), 79 deletions(-) diff --git a/docs/examples.rst b/docs/examples.rst index b9fabde7..b85ff3b0 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,4 +1,41 @@ Wavelet transforms by example ============================= -TODO \ No newline at end of file + +The continuous wavelet transform +------------------------------------------------- +The provided function :py:meth:`ptwt.continuous_transform.cwt` implements the Continuous Wavelet Transform (CWT) for analyzing signals for usage in PyTorch. It computes the CWT matrix for a given input signal using specified wavelet scales and wavelet functions. + +Inputs: + +* ``data``: Input signal tensor. + +* ``scales``: Array of desired wavelet scales. + +* ``wavelet``: Continuous wavelet function or string representing a wavelet. + +* ``sampling_period``: Sampling period for frequency output (optional). This must be given to obtain the correct corresponding frequency array (see outputs). + +Outputs: + +* ``cwtmatr``: A tensor containing the transformation matrix. + +* ``freqs``: An array with information about the frequencies corresponding to the scales in ``cwtmatr``. + +Example Usage: + +.. code-block:: + + import torch + import ptwt + import numpy as np + import scipy.signal as signal + + t = np.linspace(-2, 2, 800, endpoint=False) + sig = signal.chirp(t, f0=1, f1=12, t1=2, method="linear") + widths = np.arange(1, 31) + cwtmatr, freqs = ptwt.cwt( + torch.from_numpy(sig), widths, "mexh", sampling_period=(4 / 800) * np.pi + ) + +This code snippet demonstrates how to compute the CWT of a chirp signal using the Mexican-Hat wavelet ("mexh"), specifying the scales and sampling period. The resulting ``cwtmatr`` contains the transformed coefficients, and ``freqs`` provides information about the frequencies corresponding to the scales in ``cwtmatr``. diff --git a/docs/index.rst b/docs/index.rst index 1f9bf149..19f538ee 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -32,31 +32,12 @@ If you use this work in a scientific context, please cite the following thesis: .. code-block:: - @phdthesis{handle:20.500.11811/9245, - 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} - } - - - - + @article{ptwt_2023, + author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, + title = {ptwt - The PyTorch Wavelet Toolbox}, + journal = {Journal of Machine Learning Research}, + year = {2023} + } .. toctree:: :hidden: diff --git a/docs/intro.rst b/docs/intro.rst index 4161f1e5..41b9da42 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -3,12 +3,10 @@ Introduction to discrete wavelet transforms This text summarizes key wavelet facts as a convenience for the hasty reader. See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. -This text is based on the supplementary material of :cite:`wolter2022wavelet`. +This text is partially based material from :cite:`wolter2022wavelet`. The fwt relies on convolution operations with filter pairs. - - .. _fig-fwt: .. figure:: figures/fwt.png @@ -28,6 +26,7 @@ with :math:`k \in [\mathcal{A}, \mathcal{D}]` and :math:`s \in \mathbb{N}_0` the the original input signal :math:`\mathbf{x}`. At higher scales, the fwt uses the low-pass filtered result as input, :math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{A}, s}` if :math:`s > 0`. The dashed arrow indicates that we could continue to expand the fwt tree here. :py:meth:`ptwt.conv_transform.wavedec` implements this transformation. +:py:meth:`ptwt.conv_transform.waverec` provides the inverse functionality visible on the right side of Figure :numref:`fig-fwt`. The wavelet packet transform (pwt) additionally expands the high-frequency part of the tree. The figure below depicts the idea. @@ -57,10 +56,31 @@ We construct filter quadruples from the original filter pairs to process two-dim With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. -*TODO*: Describe the two dimensional fwt +With the four filters we are now able to compute, + +.. math:: + \mathbf{x}_s *_2 \mathbf{h}_k = \mathbf{c}_{k, s+1} + +with :math:`k \in [a, h, v, d]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to +the original input image :math:`\mathbf{X}`. :math:`*_2` indicates two dimensional-convolution. +Computations at subsequent scales work exclusively with approximation coefficients :math:`c_{a, s}` as inputs. +The figure below illustrates the process. + +.. _fig-fwt2d: + +.. figure:: figures/fwt_2d.png + :scale: 45 % + :alt: 2d wavelet transform computation diagram. + :align: center + + Two-dimensional wavelet transform computation diagram. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and + reconstruction respectively. -We can construct a wpt-tree for images with these two-dimensional filters. +:py:meth:`ptwt.conv_transform_2.wavedec2` and :py:meth:`ptwt.conv_transform_2.waverec2` support forward +and backward transforms respectively. Potential further decomposition of all coefficient leads us to +wavelet packets. + .. _fig-wpt2d: @@ -69,17 +89,11 @@ We can construct a wpt-tree for images with these two-dimensional filters. :alt: 2d wavelet packet transform computation diagram. :align: center - Two-dimensional wavelet packet transform computation diagram. + Two-dimensional wavelet packet transform computation diagram. Dashed lines indicate potential full expansion of the tree. -Two dimensional wavelet packet computation overview. :math:`\mathbf{X}` and :math:`\hat{\mathbf{X}}` denote input image and -reconstruction respectively. :numref:`fig-wpt2d` illustrates the computation of a full two-dimensional wavelet packet tree. -More formally, the process initially evaluates - -.. math:: - \mathbf{x}_0 *_2 \mathbf{h}_j = \mathbf{c}_{j, 1} - -with :math:`\mathbf{x}_0` equal to an input image :math:`\mathbf{X}`, :math:`j \in [a,h,v,d]`, and :math:`*_2` for two-dimensional convolution. At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. +At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. +:py:meth:`ptwt.packets.WaveletPacket2D` provides this functionality. We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. Compared to the FWT, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. Synthesis transforms reconstruct the original input based on the results from the analysis transform. @@ -128,6 +142,3 @@ Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. :numref:`fig-sym6` illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in :numref:`fig-db6`. Consider the sign patterns in :numref:`fig-db6`. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` and :math:`F_\mathcal{D} = -H_\mathcal{A}(-z)` into the perfect reconstruction condition :cite:`strang1996wavelets`. :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. - - -.. bibliography:: \ No newline at end of file diff --git a/docs/intro_cwt.rst b/docs/intro_cwt.rst index f37d28ce..1d1dcbb4 100644 --- a/docs/intro_cwt.rst +++ b/docs/intro_cwt.rst @@ -53,40 +53,8 @@ To use continuous wavelets effectively for audio signal analysis, certain criter * Implementation Considerations: Implementing CWT requires discretizing the scales and performing convolutions. Efficient algorithms, such as Fast Fourier Transform (FFT), are often utilized for numerical computations. -Example Usage --------------- -The provided function :py:meth:`ptwt.continuous_transform.cwt` implements the Continuous Wavelet Transform (CWT) for analyzing signals for usage in PyTorch. It computes the CWT matrix for a given input signal using specified wavelet scales and wavelet functions. -Inputs: +Bibliography +------------ -* ``data``: Input signal tensor. - -* ``scales``: Array of desired wavelet scales. - -* ``wavelet``: Continuous wavelet function or string representing a wavelet. - -* ``sampling_period``: Sampling period for frequency output (optional). This must be given to obtain the correct corresponding frequency array (see outputs). - -Outputs: - -* ``cwtmatr``: A tensor containing the transformation matrix. - -* ``freqs``: An array with information about the frequencies corresponding to the scales in ``cwtmatr``. - -Example Usage: - -.. code-block:: - - import torch - import ptwt - import numpy as np - import scipy.signal as signal - - t = np.linspace(-2, 2, 800, endpoint=False) - sig = signal.chirp(t, f0=1, f1=12, t1=2, method="linear") - widths = np.arange(1, 31) - cwtmatr, freqs = ptwt.cwt( - torch.from_numpy(sig), widths, "mexh", sampling_period=(4 / 800) * np.pi - ) - -This code snippet demonstrates how to compute the CWT of a chirp signal using the Mexican-Hat wavelet ("mexh"), specifying the scales and sampling period. The resulting ``cwtmatr`` contains the transformed coefficients, and ``freqs`` provides information about the frequencies corresponding to the scales in ``cwtmatr``. +.. bibliography:: diff --git a/docs/literature.bib b/docs/literature.bib index d4a480ea..d6fa859b 100644 --- a/docs/literature.bib +++ b/docs/literature.bib @@ -6,7 +6,8 @@ @article{wolter2022wavelet number={11}, pages={4295--4327}, year={2022}, - publisher={Springer} + publisher={Springer}, + doi={10.1007/s10994-022-06225-5} } From ab18d13a58dc19ecc5a8abcb4d618ff417e6385a Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 25 Jan 2024 15:00:03 +0100 Subject: [PATCH 21/39] docs update. --- docs/intro.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro.rst b/docs/intro.rst index 41b9da42..a8b50f8c 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -117,7 +117,7 @@ Similarly guarantees alias cancellation. -Filters that satisfy both equations qualify as wavelets. Daubechies wavelets and Symlets appear in this paper. +Filters that satisfy both equations qualify as wavelets. Lets consider i.e. a Daubechies wavelet and a Symlet: .. _fig-sym6: From 82de9dc430474d48c748a339fe72ed68eeeafe97 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Thu, 25 Jan 2024 15:50:20 +0100 Subject: [PATCH 22/39] update citation information. --- CITATION.bib | 24 ++++++------------------ README.rst | 28 ++++++---------------------- 2 files changed, 12 insertions(+), 40 deletions(-) diff --git a/CITATION.bib b/CITATION.bib index 5a18ac96..d0fe10e9 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -1,18 +1,6 @@ -@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} -} - -@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} -} +@article{ptwt_2023, + author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, + title = {ptwt - The PyTorch Wavelet Toolbox}, + journal = {Journal of Machine Learning Research}, + year = {2023} + } \ No newline at end of file diff --git a/README.rst b/README.rst index 6d9e87b8..9af26158 100644 --- a/README.rst +++ b/README.rst @@ -195,25 +195,9 @@ If you use this work in a scientific context, please cite the following: .. code-block:: - @phdthesis{handle:20.500.11811/9245, - 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} - } - + @article{ptwt_2023, + author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, + title = {ptwt - The PyTorch Wavelet Toolbox}, + journal = {Journal of Machine Learning Research}, + year = {2023} + } From 7567ae97b2ef5cbe973a4592f1697c074b87ff35 Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Thu, 25 Jan 2024 16:05:12 +0100 Subject: [PATCH 23/39] Add nox settings for building docs --- noxfile.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/noxfile.py b/noxfile.py index 011e123e..2c5ca768 100644 --- a/noxfile.py +++ b/noxfile.py @@ -51,6 +51,26 @@ def mypy(session): ) +@nox.session(name="docs") +def docs(session): + """Build docs.""" + session.install(".") + session.install("sphinx-book-theme") + session.install("sphinxcontrib-bibtex") + session.run( + "python", + "-m", + "sphinx", + "-W", + "-b", + "html", + "-d", + "docs/build/doctrees", + "docs/", + "docs/_build/html", + ) + + @nox.session(name="format") def format(session): """Fix common convention problems automatically.""" From 09cfd9c41b902edc4f4dc790adb17d3092d0534c Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Thu, 25 Jan 2024 16:05:18 +0100 Subject: [PATCH 24/39] Typo fixes on index --- docs/index.rst | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 19f538ee..2f69e5cf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,10 +8,10 @@ Pytorch Wavelet Toolbox (``ptwt``) ================================== -``ptwt`` brings wavelet transforms to Pytorch. The code is open-source, follow the link above -to go to the source. This package is listed in the Python Package Index. Its best intalled via pip. +``ptwt`` brings wavelet transforms to PyTorch. The code is open-source, follow the link above +to go to the source. This package is listed in the Python Package Index (PyPI). Its best installed via pip. GPU support depends on PyTorch. To take advantage of GPU-processing follow the `PyTorch install instructions`_. -Install the version, that best suits your systems hardware setup. Once PyTorch ist set up type +Install the version that best suits your systems hardware setup. Once PyTorch ist set up, type: .. code-block:: sh @@ -19,25 +19,23 @@ Install the version, that best suits your systems hardware setup. Once PyTorch i to get started. - -This documentation aims to explain the foundations of wavelet theory, introduce the ``ptwt`` package by example and +This documentation aims to explain the foundations of wavelet theory, introduce the ``ptwt`` package by example, and deliver a complete documentation of all functions. Readers who are already familiar with the theory should directly jump to the examples or the API-documentation using the navigation on the left. -``ptwt`` is build to be `PyWavelets `_ compatible. +``ptwt`` is built to be `PyWavelets `_ compatible. It should be possible to switch back and forth with relative ease. - If you use this work in a scientific context, please cite the following thesis: .. code-block:: @article{ptwt_2023, author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, - title = {ptwt - The PyTorch Wavelet Toolbox}, + title = {{ptwt - The PyTorch Wavelet Toolbox}}, journal = {Journal of Machine Learning Research}, year = {2023} - } + } .. toctree:: :hidden: From 74affd4ac910c6a9172bfddba652fc8816beb2c4 Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Thu, 25 Jan 2024 16:19:37 +0100 Subject: [PATCH 25/39] Update index.rst --- docs/index.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 2f69e5cf..6ea58195 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,20 +5,19 @@ .. _PyTorch install instructions: https://pytorch.org/get-started/locally/ -Pytorch Wavelet Toolbox (``ptwt``) +PyTorch Wavelet Toolbox (``ptwt``) ================================== ``ptwt`` brings wavelet transforms to PyTorch. The code is open-source, follow the link above to go to the source. This package is listed in the Python Package Index (PyPI). Its best installed via pip. GPU support depends on PyTorch. To take advantage of GPU-processing follow the `PyTorch install instructions`_. -Install the version that best suits your systems hardware setup. Once PyTorch ist set up, type: +Install the version that best suits your systems hardware setup. Once PyTorch ist set up, type the following +to get started: .. code-block:: sh pip install ptwt -to get started. - This documentation aims to explain the foundations of wavelet theory, introduce the ``ptwt`` package by example, and deliver a complete documentation of all functions. Readers who are already familiar with the theory should directly jump to the examples or the API-documentation using the navigation on the left. From 96a940b0b91155f35dd95ca39a7571882088bffe Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Fri, 26 Jan 2024 09:52:05 +0100 Subject: [PATCH 26/39] Reformat with black 2024 style this will help with merging from main branch --- noxfile.py | 1 + src/ptwt/__init__.py | 1 + src/ptwt/_stationary_transform.py | 1 + src/ptwt/_util.py | 1 + src/ptwt/continuous_transform.py | 1 + src/ptwt/conv_transform.py | 1 + src/ptwt/conv_transform_2.py | 1 + src/ptwt/conv_transform_3.py | 6 +++++- src/ptwt/matmul_transform.py | 1 + src/ptwt/matmul_transform_2.py | 1 + src/ptwt/matmul_transform_3.py | 1 + src/ptwt/packets.py | 9 +++------ src/ptwt/separable_conv_transform.py | 1 + src/ptwt/sparse_math.py | 1 + src/ptwt/wavelets_learnable.py | 1 + tests/_mackey_glass.py | 1 + tests/test_convolution_fwt.py | 1 + tests/test_cwt.py | 1 + tests/test_jit.py | 1 + tests/test_matrix_fwt.py | 1 + tests/test_matrix_fwt_2.py | 1 + tests/test_matrix_fwt_3.py | 1 + tests/test_packets.py | 1 + tests/test_sparse_math.py | 1 + tests/test_util.py | 1 + tests/test_wavelet.py | 1 + 26 files changed, 32 insertions(+), 7 deletions(-) diff --git a/noxfile.py b/noxfile.py index 2c5ca768..6b28ac9c 100644 --- a/noxfile.py +++ b/noxfile.py @@ -1,4 +1,5 @@ """This module implements our CI function calls.""" + import nox diff --git a/src/ptwt/__init__.py b/src/ptwt/__init__.py index 03a6f6da..34808704 100644 --- a/src/ptwt/__init__.py +++ b/src/ptwt/__init__.py @@ -1,4 +1,5 @@ """Differentiable and gpu enabled fast wavelet transforms in PyTorch.""" + from ._util import Wavelet from .continuous_transform import cwt from .conv_transform import wavedec, waverec diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index e87574dc..bdcc44b2 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -1,4 +1,5 @@ """This module implements stationary wavelet transforms.""" + # Created by the pytorch wavelet toolbox team, in 2024 from typing import List, Optional, Union diff --git a/src/ptwt/_util.py b/src/ptwt/_util.py index 50277b42..f76f973a 100644 --- a/src/ptwt/_util.py +++ b/src/ptwt/_util.py @@ -1,4 +1,5 @@ """Utility methods to compute wavelet decompositions from a dataset.""" + from typing import Any, Callable, List, Optional, Protocol, Sequence, Tuple, Union import numpy as np diff --git a/src/ptwt/continuous_transform.py b/src/ptwt/continuous_transform.py index d91ccb1f..074f40b5 100644 --- a/src/ptwt/continuous_transform.py +++ b/src/ptwt/continuous_transform.py @@ -2,6 +2,7 @@ This module is based on pywt's cwt implementation. """ + # Written by the Pytorch wavelet toolbox team in 2024 from typing import Any, Tuple, Union diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index ab9e906c..4120da72 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -2,6 +2,7 @@ This module treats boundaries with edge-padding. """ + # Created by moritz wolter, 14.04.20 from typing import List, Optional, Sequence, Tuple, Union diff --git a/src/ptwt/conv_transform_2.py b/src/ptwt/conv_transform_2.py index b933f727..35815209 100644 --- a/src/ptwt/conv_transform_2.py +++ b/src/ptwt/conv_transform_2.py @@ -3,6 +3,7 @@ The implementation relies on torch.nn.functional.conv2d and torch.nn.functional.conv_transpose2d under the hood. """ + # Written by the Pytorch wavelet toolbox team in 2024 diff --git a/src/ptwt/conv_transform_3.py b/src/ptwt/conv_transform_3.py index dc82cee4..9019c74d 100644 --- a/src/ptwt/conv_transform_3.py +++ b/src/ptwt/conv_transform_3.py @@ -2,6 +2,7 @@ The functions here are based on torch.nn.functional.conv3d and it's transpose. """ + # Written by the Pytorch wavelet toolbox team in 2024 from functools import partial @@ -212,7 +213,10 @@ def wavedec3( def _waverec3d_fold_channels_3d_list( coeffs: List[Union[torch.Tensor, Dict[str, torch.Tensor]]], -) -> Tuple[List[Union[torch.Tensor, Dict[str, torch.Tensor]]], List[int],]: +) -> Tuple[ + List[Union[torch.Tensor, Dict[str, torch.Tensor]]], + List[int], +]: # fold the input coefficients for processing conv2d_transpose. fold_coeffs: List[Union[torch.Tensor, Dict[str, torch.Tensor]]] = [] ds = list(_check_if_tensor(coeffs[0]).shape) diff --git a/src/ptwt/matmul_transform.py b/src/ptwt/matmul_transform.py index a31191d9..03ced4f7 100644 --- a/src/ptwt/matmul_transform.py +++ b/src/ptwt/matmul_transform.py @@ -6,6 +6,7 @@ in Strang Nguyen (p. 32), as well as the description of boundary filters in "Ripples in Mathematics" section 10.3 . """ + # Created by moritz (wolter@cs.uni-bonn.de) at 14.04.20 import sys from typing import List, Optional, Union diff --git a/src/ptwt/matmul_transform_2.py b/src/ptwt/matmul_transform_2.py index 1a1642ab..c4c30648 100644 --- a/src/ptwt/matmul_transform_2.py +++ b/src/ptwt/matmul_transform_2.py @@ -2,6 +2,7 @@ This module uses boundary filters to minimize padding. """ + # Written by moritz ( @ wolter.tech ) in 2021 import sys from functools import partial diff --git a/src/ptwt/matmul_transform_3.py b/src/ptwt/matmul_transform_3.py index cbf02de8..445b7ea3 100644 --- a/src/ptwt/matmul_transform_3.py +++ b/src/ptwt/matmul_transform_3.py @@ -1,4 +1,5 @@ """Implement 3D separable boundary transforms.""" + # Written by the Pytorch wavelet toolbox team in 2024 import sys diff --git a/src/ptwt/packets.py b/src/ptwt/packets.py index b1cecc66..272272bb 100644 --- a/src/ptwt/packets.py +++ b/src/ptwt/packets.py @@ -1,4 +1,5 @@ """Compute analysis wavelet packet representations.""" + # Created on Fri Apr 6 2021 by moritz (wolter@cs.uni-bonn.de) import collections @@ -382,9 +383,7 @@ def get_natural_order(self, level: int) -> List[str]: """ return ["".join(p) for p in product(["a", "h", "v", "d"], repeat=level)] - def _get_wavedec( - self, shape: Tuple[int, ...] - ) -> Callable[ + def _get_wavedec(self, shape: Tuple[int, ...]) -> Callable[ [torch.Tensor], List[Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor, torch.Tensor]]], ]: @@ -415,9 +414,7 @@ def _get_wavedec( wavedec2, wavelet=self.wavelet, level=1, mode=self.mode, axes=self.axes ) - def _get_waverec( - self, shape: Tuple[int, ...] - ) -> Callable[ + def _get_waverec(self, shape: Tuple[int, ...]) -> Callable[ [List[Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor, torch.Tensor]]]], torch.Tensor, ]: diff --git a/src/ptwt/separable_conv_transform.py b/src/ptwt/separable_conv_transform.py index 1cd1a322..23744a2c 100644 --- a/src/ptwt/separable_conv_transform.py +++ b/src/ptwt/separable_conv_transform.py @@ -6,6 +6,7 @@ Under the hood, code in this module transforms all dimensions using torch.nn.functional.conv1d and it's transpose. """ + # Written by the Pytorch wavelet toolbox team in 2024 from functools import partial from typing import Dict, List, Optional, Tuple, Union diff --git a/src/ptwt/sparse_math.py b/src/ptwt/sparse_math.py index aa1ec232..e4eb91d0 100644 --- a/src/ptwt/sparse_math.py +++ b/src/ptwt/sparse_math.py @@ -1,4 +1,5 @@ """Efficiently construct fwt operations using sparse matrices.""" + # Written by moritz ( @ wolter.tech ) 17.09.21 from itertools import product from typing import List diff --git a/src/ptwt/wavelets_learnable.py b/src/ptwt/wavelets_learnable.py index 196b90c0..240abd26 100644 --- a/src/ptwt/wavelets_learnable.py +++ b/src/ptwt/wavelets_learnable.py @@ -2,6 +2,7 @@ See https://arxiv.org/pdf/2004.09569.pdf for more information. """ + # Created by moritz wolter@cs.uni-bonn.de, 14.05.20 # Inspired by Ripples in Mathematics, Jensen and La Cour-Harbo, Chapter 7.7 # import pywt diff --git a/tests/_mackey_glass.py b/tests/_mackey_glass.py index fb8e9d8c..63f17ee3 100644 --- a/tests/_mackey_glass.py +++ b/tests/_mackey_glass.py @@ -1,4 +1,5 @@ """Generate artificial time-series data for debugging purposes.""" + from typing import Optional, Union import torch diff --git a/tests/test_convolution_fwt.py b/tests/test_convolution_fwt.py index d7663c28..001a41e6 100644 --- a/tests/test_convolution_fwt.py +++ b/tests/test_convolution_fwt.py @@ -1,4 +1,5 @@ """Test the conv-fwt code.""" + # Written by moritz ( @ wolter.tech ) in 2021 import numpy as np import pytest diff --git a/tests/test_cwt.py b/tests/test_cwt.py index 01979d36..44148bb3 100644 --- a/tests/test_cwt.py +++ b/tests/test_cwt.py @@ -1,4 +1,5 @@ """Test the continuous transformation code.""" + from typing import Union import numpy as np diff --git a/tests/test_jit.py b/tests/test_jit.py index 1f34e482..b9a28725 100644 --- a/tests/test_jit.py +++ b/tests/test_jit.py @@ -1,4 +1,5 @@ """Ensure pytorch's torch.jit.trace feature works properly.""" + from typing import NamedTuple import numpy as np diff --git a/tests/test_matrix_fwt.py b/tests/test_matrix_fwt.py index 0cc82484..edbd12bd 100644 --- a/tests/test_matrix_fwt.py +++ b/tests/test_matrix_fwt.py @@ -1,4 +1,5 @@ """Test the fwt and ifwt matrices.""" + # Written by moritz ( @ wolter.tech ) in 2021 from typing import List diff --git a/tests/test_matrix_fwt_2.py b/tests/test_matrix_fwt_2.py index d975a32e..9ccdb010 100644 --- a/tests/test_matrix_fwt_2.py +++ b/tests/test_matrix_fwt_2.py @@ -1,4 +1,5 @@ """Test code for the 2d boundary wavelets.""" + # Created by moritz ( wolter@cs.uni-bonn.de ), 08.09.21 import numpy as np import pytest diff --git a/tests/test_matrix_fwt_3.py b/tests/test_matrix_fwt_3.py index 09790810..9d555043 100644 --- a/tests/test_matrix_fwt_3.py +++ b/tests/test_matrix_fwt_3.py @@ -1,4 +1,5 @@ """Test the 3d matrix-fwt code.""" + from typing import List import numpy as np diff --git a/tests/test_packets.py b/tests/test_packets.py index 488b8035..6b2c0e90 100644 --- a/tests/test_packets.py +++ b/tests/test_packets.py @@ -1,4 +1,5 @@ """Test the wavelet packet code.""" + # Created on Fri Apr 6 2021 by moritz (wolter@cs.uni-bonn.de) from itertools import product diff --git a/tests/test_sparse_math.py b/tests/test_sparse_math.py index 3cc45679..06068269 100644 --- a/tests/test_sparse_math.py +++ b/tests/test_sparse_math.py @@ -1,4 +1,5 @@ """Test the sparse math code from ptwt.sparse_math.""" + # Written by moritz ( @ wolter.tech ) in 2021 import numpy as np import pytest diff --git a/tests/test_util.py b/tests/test_util.py index a6b6016c..9123acc9 100644 --- a/tests/test_util.py +++ b/tests/test_util.py @@ -1,4 +1,5 @@ """Test the util methods.""" + from typing import Tuple import numpy as np diff --git a/tests/test_wavelet.py b/tests/test_wavelet.py index eea5baf2..b9f8a8bc 100644 --- a/tests/test_wavelet.py +++ b/tests/test_wavelet.py @@ -1,4 +1,5 @@ """Test the adaptive wavelet cost functions.""" + import pytest import pywt import torch From a503e934459d4bf3cf00751ffa98e478f022759e Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Fri, 26 Jan 2024 09:53:14 +0100 Subject: [PATCH 27/39] Format everything else --- docs/conf.py | 49 +++++----- docs/logo/plot_shannon.py | 11 +-- .../cwt_chirp_analysis.py | 7 +- examples/deepfake_analysis/packet_plot.py | 30 +++--- .../network_compression/mnist_compression.py | 10 +- .../network_compression/wavelet_linear.py | 5 +- examples/speed_tests/timeitconv_1d.py | 77 ++++++++++------ examples/speed_tests/timeitconv_1dmat.py | 32 ++++--- examples/speed_tests/timeitconv_2d.py | 55 ++++++----- .../speed_tests/timeitconv_2d_separable.py | 92 +++++++++++++------ examples/speed_tests/timeitconv_2dmat.py | 27 +++--- examples/speed_tests/timeitconv_3d.py | 70 ++++++++------ examples/speed_tests/timeitcwt_1d.py | 52 ++++++----- .../chirp_analysis.py | 12 +-- noxfile.py | 4 +- 15 files changed, 312 insertions(+), 221 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 37793fab..01698fb8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -12,13 +12,14 @@ # import os import sys -sys.path.insert(0, os.path.abspath('../src')) + +sys.path.insert(0, os.path.abspath("../src")) # -- Project information ----------------------------------------------------- -project = 'PyTorch-Wavelet-Toolbox' -copyright = '2024, the ptwt-team' +project = "PyTorch-Wavelet-Toolbox" +copyright = "2024, the ptwt-team" # -- General configuration --------------------------------------------------- @@ -26,29 +27,29 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.napoleon', - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.mathjax', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.viewcode', - 'sphinxcontrib.bibtex', + "sphinx.ext.napoleon", + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.mathjax", + "sphinx.ext.todo", + "sphinx.ext.coverage", + "sphinx.ext.viewcode", + "sphinxcontrib.bibtex", ] napoleon_google_docstring = True # napoleon_use_admonition_for_examples = True # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # document __init__ in the docpages -autoclass_content = 'both' +autoclass_content = "both" # -- Options for HTML output ------------------------------------------------- @@ -57,26 +58,26 @@ # a list of builtin themes. # -html_theme = 'sphinx_book_theme' +html_theme = "sphinx_book_theme" html_theme_options = { - 'show_toc_level': 2, - 'repository_url': "https://github.com/v0lta/PyTorch-Wavelet-Toolbox", - 'use_repository_button': True, - 'navigation_with_keys': False + "show_toc_level": 2, + "repository_url": "https://github.com/v0lta/PyTorch-Wavelet-Toolbox", + "use_repository_button": True, + "navigation_with_keys": False, } -html_favicon = '_static/favicon.ico' -html_logo = '_static/shannon.png' +html_favicon = "_static/favicon.ico" +html_logo = "_static/shannon.png" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] -bibtex_bibfiles = ['literature.bib'] +bibtex_bibfiles = ["literature.bib"] # numbered figures -numfig = True \ No newline at end of file +numfig = True diff --git a/docs/logo/plot_shannon.py b/docs/logo/plot_shannon.py index 0bd3a136..fc479998 100644 --- a/docs/logo/plot_shannon.py +++ b/docs/logo/plot_shannon.py @@ -1,19 +1,16 @@ -import numpy as np import matplotlib.pyplot as plt +import numpy as np -if __name__ == '__main__': +if __name__ == "__main__": bandwidth = 1 center = 0 grid_values = np.linspace(-6, 6, 500) shannon = ( np.sqrt(bandwidth) - * ( - np.sin(np.pi * bandwidth * grid_values) - / (np.pi * bandwidth * grid_values) - ) + * (np.sin(np.pi * bandwidth * grid_values) / (np.pi * bandwidth * grid_values)) * np.exp(1j * 2 * np.pi * center * grid_values) ) plt.plot(shannon, linewidth=20.0) plt.axis("off") plt.savefig("shannon.png") - plt.show() \ No newline at end of file + plt.show() diff --git a/examples/continuous_signal_analysis/cwt_chirp_analysis.py b/examples/continuous_signal_analysis/cwt_chirp_analysis.py index e4e6fd98..540b90f5 100644 --- a/examples/continuous_signal_analysis/cwt_chirp_analysis.py +++ b/examples/continuous_signal_analysis/cwt_chirp_analysis.py @@ -1,8 +1,9 @@ -import torch -import numpy as np -import ptwt import matplotlib.pyplot as plt +import numpy as np import scipy.signal as signal +import torch + +import ptwt if __name__ == "__main__": t = np.linspace(-2, 2, 800, endpoint=False) diff --git a/examples/deepfake_analysis/packet_plot.py b/examples/deepfake_analysis/packet_plot.py index 5349d4e8..ca46286f 100644 --- a/examples/deepfake_analysis/packet_plot.py +++ b/examples/deepfake_analysis/packet_plot.py @@ -1,14 +1,14 @@ import os from itertools import product -from tqdm import tqdm -from PIL import Image +import matplotlib.pyplot as plt import numpy as np -import torch -import ptwt import pywt +import torch +from PIL import Image +from tqdm import tqdm -import matplotlib.pyplot as plt +import ptwt def get_freq_order(level: int): @@ -78,13 +78,14 @@ def generate_frequency_packet_image(packet_array: np.ndarray, degree: int): def load_image(path_to_file: str) -> torch.Tensor: - + image = Image.open(path_to_file) tensor = torch.from_numpy(np.nan_to_num(np.array(image), posinf=255, neginf=0)) return tensor + def process_images(tensor: torch.Tensor, paths: list) -> torch.Tensor: - tensor = torch.mean(tensor/255., -1) + tensor = torch.mean(tensor / 255.0, -1) packets = ptwt.WaveletPacket2D(tensor, pywt.Wavelet("Haar")) packet_list = [] @@ -103,10 +104,10 @@ def load_images(path: str) -> list: path = os.path.join(root, name) packets = load_image(path) image_list.append(packets) - return image_list + return image_list -if __name__ == '__main__': +if __name__ == "__main__": frequency_path, natural_path = get_freq_order(level=3) print("Loading ffhq images:") ffhq_images = load_images("./ffhq_style_gan/source_data/A_ffhq") @@ -120,7 +121,6 @@ def load_images(path: str) -> list: del ffhq_images del ffhq_packets - print("Loading style-gan images") gan_images = load_images("./ffhq_style_gan/source_data/B_stylegan") print("processing style-gan") @@ -136,7 +136,7 @@ def load_images(path: str) -> list: plot_ffhq = generate_frequency_packet_image(mean_packets_ffhq, 3) plot_gan = generate_frequency_packet_image(mean_packets_gan, 3) - fig = plt.figure(figsize=(9,3)) + fig = plt.figure(figsize=(9, 3)) fig.add_subplot(1, 2, 1) plt.imshow(plot_ffhq, vmax=1.5, vmin=-7) plt.title("real") @@ -151,9 +151,9 @@ def load_images(path: str) -> list: plt.colorbar() plt.show() - plt.plot(torch.mean(mean_packets_ffhq, (1, 2)).flatten().numpy(), label='real') - plt.plot(torch.mean(mean_packets_gan, (1, 2)).flatten().numpy(), label='fake') - plt.xlabel('mean packets') - plt.ylabel('magnitude') + plt.plot(torch.mean(mean_packets_ffhq, (1, 2)).flatten().numpy(), label="real") + plt.plot(torch.mean(mean_packets_gan, (1, 2)).flatten().numpy(), label="fake") + plt.xlabel("mean packets") + plt.ylabel("magnitude") plt.legend() plt.show() diff --git a/examples/network_compression/mnist_compression.py b/examples/network_compression/mnist_compression.py index e8add3cc..e1ad52bd 100644 --- a/examples/network_compression/mnist_compression.py +++ b/examples/network_compression/mnist_compression.py @@ -3,17 +3,19 @@ # based on https://github.com/pytorch/examples/blob/master/mnist/main.py import argparse +import collections + +import matplotlib.pyplot as plt import numpy as np import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim -import collections -import matplotlib.pyplot as plt -from torchvision import datasets, transforms from torch.optim.lr_scheduler import StepLR -from wavelet_linear import WaveletLayer from torch.utils.tensorboard.writer import SummaryWriter +from torchvision import datasets, transforms +from wavelet_linear import WaveletLayer + from ptwt.wavelets_learnable import ProductFilter diff --git a/examples/network_compression/wavelet_linear.py b/examples/network_compression/wavelet_linear.py index 9f88c42f..43bdac79 100644 --- a/examples/network_compression/wavelet_linear.py +++ b/examples/network_compression/wavelet_linear.py @@ -1,9 +1,10 @@ # Originally created by moritz (wolter@cs.uni-bonn.de) # at https://github.com/v0lta/Wavelet-network-compression/blob/master/wavelet_learning/wavelet_linear.py -import torch import numpy as np -from torch.nn.parameter import Parameter import pywt +import torch +from torch.nn.parameter import Parameter + from ptwt.conv_transform import wavedec, waverec diff --git a/examples/speed_tests/timeitconv_1d.py b/examples/speed_tests/timeitconv_1d.py index 95641266..135f77c9 100644 --- a/examples/speed_tests/timeitconv_1d.py +++ b/examples/speed_tests/timeitconv_1d.py @@ -1,11 +1,13 @@ -import pywt -import ptwt -import torch -import numpy as np import time from typing import NamedTuple import matplotlib.pyplot as plt +import numpy as np +import pywt +import torch + +import ptwt + class WaveletTuple(NamedTuple): """Replaces namedtuple("Wavelet", ("dec_lo", "dec_hi", "rec_lo", "rec_hi")).""" @@ -24,15 +26,15 @@ def _set_up_wavelet_tuple(wavelet, dtype): torch.tensor(wavelet.rec_hi).type(dtype), ) + def _jit_wavedec_fun(data, wavelet): return ptwt.wavedec(data, wavelet, "periodic", level=10) -if __name__ == '__main__': +if __name__ == "__main__": length = 1e6 repetitions = 100 - pywt_time_cpu = [] ptwt_time_cpu = [] ptwt_time_gpu = [] @@ -56,10 +58,10 @@ def _jit_wavedec_fun(data, wavelet): wavelet = _set_up_wavelet_tuple(pywt.Wavelet("db5"), torch.float32) jit_wavedec = torch.jit.trace( - _jit_wavedec_fun, - (data, wavelet), - strict=False, - ) + _jit_wavedec_fun, + (data, wavelet), + strict=False, + ) for _ in range(repetitions): data = np.random.randn(32, int(length)).astype(np.float32) @@ -69,7 +71,6 @@ def _jit_wavedec_fun(data, wavelet): end = time.perf_counter() ptwt_time_cpu_jit.append(end - start) - for _ in range(repetitions): data = np.random.randn(32, int(length)).astype(np.float32) data = torch.from_numpy(data).cuda() @@ -82,10 +83,10 @@ def _jit_wavedec_fun(data, wavelet): wavelet = _set_up_wavelet_tuple(pywt.Wavelet("db5"), torch.float32) jit_wavedec = torch.jit.trace( - _jit_wavedec_fun, - (data.cuda(), wavelet), - strict=False, - ) + _jit_wavedec_fun, + (data.cuda(), wavelet), + strict=False, + ) for _ in range(repetitions): data = np.random.randn(32, int(length)).astype(np.float32) @@ -95,14 +96,24 @@ def _jit_wavedec_fun(data, wavelet): res = jit_wavedec(data, wavelet) torch.cuda.synchronize() end = time.perf_counter() - ptwt_time_gpu_jit.append(end-start) + ptwt_time_gpu_jit.append(end - start) print("1d fwt results") - print(f"1d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"1d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") - print(f"1d-ptwt-cpu-jit:{np.mean(ptwt_time_cpu_jit):5.5f} +- {np.std(ptwt_time_cpu_jit):5.5f}") - print(f"1d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"1d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}") + print( + f"1d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}" + ) + print( + f"1d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}" + ) + print( + f"1d-ptwt-cpu-jit:{np.mean(ptwt_time_cpu_jit):5.5f} +- {np.std(ptwt_time_cpu_jit):5.5f}" + ) + print( + f"1d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}" + ) + print( + f"1d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}" + ) # plt.semilogy(pywt_time_cpu, label='pywt-cpu') # plt.semilogy(ptwt_time_cpu, label='ptwt-cpu') # plt.semilogy(ptwt_time_cpu_jit, label='ptwt-cpu-jit') @@ -112,12 +123,24 @@ def _jit_wavedec_fun(data, wavelet): # plt.xlabel('repetition') # plt.ylabel('runtime [s]') # plt.show() - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_cpu_jit, ptwt_time_gpu, ptwt_time_gpu_jit], -1) + time_stack = np.stack( + [ + pywt_time_cpu, + ptwt_time_cpu, + ptwt_time_cpu_jit, + ptwt_time_gpu, + ptwt_time_gpu_jit, + ], + -1, + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4,5], ["pywt-cpu", "ptwt-cpu", "ptwt-cpu-jit", "ptwt-gpu", "ptwt-gpu-jit"]) + plt.yscale("log") + plt.xticks( + [1, 2, 3, 4, 5], + ["pywt-cpu", "ptwt-cpu", "ptwt-cpu-jit", "ptwt-gpu", "ptwt-gpu-jit"], + ) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-1D') - plt.savefig('./figs/timeitconv1d.png') + plt.ylabel("runtime [s]") + plt.title("DWT-1D") + plt.savefig("./figs/timeitconv1d.png") # plt.show() diff --git a/examples/speed_tests/timeitconv_1dmat.py b/examples/speed_tests/timeitconv_1dmat.py index 738e45af..7fe516be 100644 --- a/examples/speed_tests/timeitconv_1dmat.py +++ b/examples/speed_tests/timeitconv_1dmat.py @@ -1,13 +1,13 @@ -import pywt -import ptwt -import torch -import numpy as np import time import matplotlib.pyplot as plt +import numpy as np +import pywt +import torch +import ptwt -if __name__ == '__main__': +if __name__ == "__main__": length = 1e6 repetitions = 100 @@ -51,17 +51,21 @@ end = time.perf_counter() ptwt_time_gpu_mat.append(end - start) - print('1d boundary results') + print("1d boundary results") print(f"1d-pywt-cpu:{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"1d-ptwt-cpu:{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") + print(f"1d-ptwt-cpu:{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") print(f"1d-ptwt-gpu:{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"1d-ptwt-jit:{np.mean(ptwt_time_gpu_mat):5.5f} +- {np.std(ptwt_time_gpu_mat):5.5f}") + print( + f"1d-ptwt-jit:{np.mean(ptwt_time_gpu_mat):5.5f} +- {np.std(ptwt_time_gpu_mat):5.5f}" + ) - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_mat], -1) + time_stack = np.stack( + [pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_mat], -1 + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-boundary"]) + plt.yscale("log") + plt.xticks([1, 2, 3, 4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-boundary"]) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-1D-boundary') - plt.savefig('./figs/timeitconv1dmat.png') + plt.ylabel("runtime [s]") + plt.title("DWT-1D-boundary") + plt.savefig("./figs/timeitconv1dmat.png") diff --git a/examples/speed_tests/timeitconv_2d.py b/examples/speed_tests/timeitconv_2d.py index da909e0f..ba709644 100644 --- a/examples/speed_tests/timeitconv_2d.py +++ b/examples/speed_tests/timeitconv_2d.py @@ -1,12 +1,12 @@ +import time from typing import NamedTuple +import matplotlib.pyplot as plt +import numpy as np import pywt -import ptwt import torch -import numpy as np -import time -import matplotlib.pyplot as plt +import ptwt class WaveletTuple(NamedTuple): @@ -26,6 +26,7 @@ def _set_up_wavelet_tuple(wavelet, dtype): torch.tensor(wavelet.rec_hi).type(dtype), ) + def _to_jit_wavedec_2(data, wavelet): """Ensure uniform datatypes in lists for the tracer. Going from List[Union[torch.Tensor, List[torch.Tensor]]] to List[torch.Tensor] @@ -42,7 +43,7 @@ def _to_jit_wavedec_2(data, wavelet): return coeff2 -if __name__ == '__main__': +if __name__ == "__main__": repetitions = 100 length = 1e3 @@ -70,21 +71,20 @@ def _to_jit_wavedec_2(data, wavelet): for _ in range(repetitions): data = np.random.randn(32, int(length), int(length)).astype(np.float32) data = torch.from_numpy(data).cuda() - + start = time.perf_counter() res = ptwt.wavedec2(data, "db5", mode="periodic", level=5) torch.cuda.synchronize() end = time.perf_counter() - - ptwt_time_gpu.append(end - start) + ptwt_time_gpu.append(end - start) wavelet = _set_up_wavelet_tuple(pywt.Wavelet("db5"), torch.float32) jit_wavedec = torch.jit.trace( - _to_jit_wavedec_2, - (data.cuda(), wavelet), - strict=False, - ) + _to_jit_wavedec_2, + (data.cuda(), wavelet), + strict=False, + ) for _ in range(repetitions): data = np.random.randn(32, int(length), int(length)).astype(np.float32) @@ -97,10 +97,18 @@ def _to_jit_wavedec_2(data, wavelet): ptwt_time_gpu_jit.append(pc_end - pc_start) print("2d fwt results") - print(f"2d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"2d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") - print(f"2d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"2d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}") + print( + f"2d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}" + ) + print( + f"2d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}" + ) + print( + f"2d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}" + ) + print( + f"2d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}" + ) # plt.semilogy(pywt_time_cpu, label='pywt-cpu') # plt.semilogy(ptwt_time_cpu, label='ptwt-cpu') # plt.semilogy(ptwt_time_gpu, label='ptwt-gpu') @@ -111,12 +119,13 @@ def _to_jit_wavedec_2(data, wavelet): # plt.show() # plt.clf() - - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1) + time_stack = np.stack( + [pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1 + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) + plt.yscale("log") + plt.xticks([1, 2, 3, 4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-2D') - plt.savefig('./figs/timeitconv2d.png') + plt.ylabel("runtime [s]") + plt.title("DWT-2D") + plt.savefig("./figs/timeitconv2d.png") diff --git a/examples/speed_tests/timeitconv_2d_separable.py b/examples/speed_tests/timeitconv_2d_separable.py index 310f4a58..770de1d2 100644 --- a/examples/speed_tests/timeitconv_2d_separable.py +++ b/examples/speed_tests/timeitconv_2d_separable.py @@ -1,13 +1,13 @@ +import time from typing import NamedTuple +import matplotlib.pyplot as plt +import numpy as np import pywt -import ptwt import torch -import numpy as np -import time from pytorch_wavelets import DWTForward -import matplotlib.pyplot as plt +import ptwt class WaveletTuple(NamedTuple): @@ -27,6 +27,7 @@ def _set_up_wavelet_tuple(wavelet, dtype): torch.tensor(wavelet.rec_hi).type(dtype), ) + def _to_jit_wavedec_2(data, wavelet): """Ensure uniform datatypes in lists for the tracer. Going from List[Union[torch.Tensor, List[torch.Tensor]]] to List[torch.Tensor] @@ -39,11 +40,11 @@ def _to_jit_wavedec_2(data, wavelet): if isinstance(c, torch.Tensor): coeff2.append(c) else: - coeff2.append(torch.stack([cel for _,cel in c.items()])) + coeff2.append(torch.stack([cel for _, cel in c.items()])) return coeff2 -if __name__ == '__main__': +if __name__ == "__main__": repetitions = 100 length = 1e3 @@ -60,7 +61,9 @@ def _to_jit_wavedec_2(data, wavelet): for _ in range(repetitions): data = np.random.randn(32, int(length), int(length)).astype(np.float32) start = time.perf_counter() - pywt_res = pywt.fswavedecn(data, "db5", levels=5, mode="periodic", axes=(-2, -1)) + pywt_res = pywt.fswavedecn( + data, "db5", levels=5, mode="periodic", axes=(-2, -1) + ) end = time.perf_counter() pywt_time_cpu.append(end - start) @@ -100,13 +103,12 @@ def _to_jit_wavedec_2(data, wavelet): end = time.perf_counter() ptwt_time_gpu.append(end - start) - wavelet = _set_up_wavelet_tuple(pywt.Wavelet("db5"), torch.float32) jit_wavedec = torch.jit.trace( - _to_jit_wavedec_2, - (data.cuda(), wavelet), - strict=False, - ) + _to_jit_wavedec_2, + (data.cuda(), wavelet), + strict=False, + ) for _ in range(repetitions): data = np.random.randn(32, int(length), int(length)).astype(np.float32) @@ -119,10 +121,10 @@ def _to_jit_wavedec_2(data, wavelet): ptwt_time_jit.append(pc_end - pc_start) jit_wavedec = torch.jit.trace( - _to_jit_wavedec_2, - (data.cpu(), wavelet), - strict=False, - ) + _to_jit_wavedec_2, + (data.cpu(), wavelet), + strict=False, + ) for _ in range(repetitions): data = np.random.randn(32, int(length), int(length)).astype(np.float32) @@ -136,14 +138,26 @@ def _to_jit_wavedec_2(data, wavelet): print("2d separable fwt results") print(f"2d-pywt-cpu:{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"2d-pytorch_wavelets-cpu:{np.mean(cotter_time_cpu):5.5f} +- {np.std(cotter_time_cpu):5.5f}") - print(f"2d-pytorch_wavelets-gpu:{np.mean(cotter_time_gpu):5.5f} +- {np.std(cotter_time_gpu):5.5f}") + print( + f"2d-pytorch_wavelets-cpu:{np.mean(cotter_time_cpu):5.5f} +- {np.std(cotter_time_cpu):5.5f}" + ) + print( + f"2d-pytorch_wavelets-gpu:{np.mean(cotter_time_gpu):5.5f} +- {np.std(cotter_time_gpu):5.5f}" + ) + + print( + f"2d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}" + ) + print( + f"2d-ptwt-cpu-jit:{np.mean(ptwt_time_jit_cpu):5.5f} +- {np.std(ptwt_time_jit_cpu):5.5f}" + ) - print(f"2d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") - print(f"2d-ptwt-cpu-jit:{np.mean(ptwt_time_jit_cpu):5.5f} +- {np.std(ptwt_time_jit_cpu):5.5f}") - - print(f"2d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"2d-ptwt-gpu-jit:{np.mean(ptwt_time_jit):5.5f} +- {np.std(ptwt_time_jit):5.5f}") + print( + f"2d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}" + ) + print( + f"2d-ptwt-gpu-jit:{np.mean(ptwt_time_jit):5.5f} +- {np.std(ptwt_time_jit):5.5f}" + ) # plt.semilogy(pywt_time_cpu, label='pywt-cpu') # plt.semilogy(ptwt_time_cpu, label='ptwt-cpu') # plt.semilogy(ptwt_time_jit_cpu, label='ptwt-cpu-jit') @@ -156,11 +170,31 @@ def _to_jit_wavedec_2(data, wavelet): # plt.ylabel('runtime [s]') # plt.show() - time_stack = np.stack([pywt_time_cpu, cotter_time_cpu, ptwt_time_cpu, cotter_time_gpu, ptwt_time_gpu, ptwt_time_jit], -1) + time_stack = np.stack( + [ + pywt_time_cpu, + cotter_time_cpu, + ptwt_time_cpu, + cotter_time_gpu, + ptwt_time_gpu, + ptwt_time_jit, + ], + -1, + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4,5,6], ["pywt-cpu", "pytorch-wavelets-cpu", "ptwt-cpu", "pytorch-wavelets-gpu", "ptwt-gpu", "ptwt-gpu-jit"]) + plt.yscale("log") + plt.xticks( + [1, 2, 3, 4, 5, 6], + [ + "pywt-cpu", + "pytorch-wavelets-cpu", + "ptwt-cpu", + "pytorch-wavelets-gpu", + "ptwt-gpu", + "ptwt-gpu-jit", + ], + ) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-2D-separable') - plt.savefig('figs/timeitconv2d_sep.png') + plt.ylabel("runtime [s]") + plt.title("DWT-2D-separable") + plt.savefig("figs/timeitconv2d_sep.png") diff --git a/examples/speed_tests/timeitconv_2dmat.py b/examples/speed_tests/timeitconv_2dmat.py index 3ecfd845..743d0442 100644 --- a/examples/speed_tests/timeitconv_2dmat.py +++ b/examples/speed_tests/timeitconv_2dmat.py @@ -1,13 +1,13 @@ -import pywt -import ptwt -import torch -import numpy as np import time import matplotlib.pyplot as plt +import numpy as np +import pywt +import torch +import ptwt -if __name__ == '__main__': +if __name__ == "__main__": repetitions = int(100) length = 1e3 @@ -41,7 +41,6 @@ end = time.perf_counter() ptwt_time_gpu.append(end - start) - matrix_wavedec2 = ptwt.MatrixWavedec2("db5", 5) for _ in range(repetitions): @@ -53,17 +52,19 @@ end = time.perf_counter() ptwt_time_mat.append(end - start) - print('2d boundary results.') + print("2d boundary results.") print(f"2d-pywt-cpu:{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") print(f"2d-ptwt-cpu:{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") print(f"2d-ptwt-gpu:{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") print(f"2d-ptwt-mat:{np.mean(ptwt_time_mat):5.5f} +- {np.std(ptwt_time_mat):5.5f}") - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_mat], -1) + time_stack = np.stack( + [pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_mat], -1 + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-boundary"]) + plt.yscale("log") + plt.xticks([1, 2, 3, 4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-boundary"]) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-2D-boundary') - plt.savefig('./figs/timeitconv2dmat.png') + plt.ylabel("runtime [s]") + plt.title("DWT-2D-boundary") + plt.savefig("./figs/timeitconv2dmat.png") diff --git a/examples/speed_tests/timeitconv_3d.py b/examples/speed_tests/timeitconv_3d.py index e419d1f5..2690ec5b 100644 --- a/examples/speed_tests/timeitconv_3d.py +++ b/examples/speed_tests/timeitconv_3d.py @@ -1,12 +1,12 @@ +import time from typing import NamedTuple +import matplotlib.pyplot as plt +import numpy as np import pywt -import ptwt import torch -import numpy as np -import time -import matplotlib.pyplot as plt +import ptwt class WaveletTuple(NamedTuple): @@ -27,7 +27,6 @@ def _set_up_wavelet_tuple(wavelet, dtype): ) - def _to_jit_wavedec_3(data, wavelet): """Ensure uniform datatypes in lists for the tracer. @@ -46,7 +45,7 @@ def _to_jit_wavedec_3(data, wavelet): return coeff2 -if __name__ == '__main__': +if __name__ == "__main__": length = 1e2 repetitions = 100 @@ -56,18 +55,19 @@ def _to_jit_wavedec_3(data, wavelet): ptwt_time_gpu_jit = [] for _ in range(repetitions): - data = np.random.randn( - 32, int(length), int(length), int(length)).astype(np.float32) + data = np.random.randn(32, int(length), int(length), int(length)).astype( + np.float32 + ) start = time.perf_counter() res = pywt.wavedecn(data, "db5", level=3, axes=range(1, 3), mode="periodic") end = time.perf_counter() pywt_time_cpu.append(end - start) - for _ in range(repetitions): - data = np.random.randn( - 32, int(length), int(length), int(length)).astype(np.float32) + data = np.random.randn(32, int(length), int(length), int(length)).astype( + np.float32 + ) data = torch.from_numpy(data) start = time.perf_counter() res = ptwt.wavedec3(data, "db5", level=3, mode="periodic") @@ -75,8 +75,9 @@ def _to_jit_wavedec_3(data, wavelet): ptwt_time_cpu.append(end - start) for _ in range(repetitions): - data = np.random.randn( - 32, int(length), int(length), int(length)).astype(np.float32) + data = np.random.randn(32, int(length), int(length), int(length)).astype( + np.float32 + ) data = torch.from_numpy(data).cuda() start = time.perf_counter() res = ptwt.wavedec3(data, "db5", level=3, mode="periodic") @@ -86,13 +87,14 @@ def _to_jit_wavedec_3(data, wavelet): wavelet = _set_up_wavelet_tuple(pywt.Wavelet("db5"), torch.float32) jit_wavedec = torch.jit.trace( - _to_jit_wavedec_3, - (data.cuda(), wavelet), - strict=False, - ) + _to_jit_wavedec_3, + (data.cuda(), wavelet), + strict=False, + ) for _ in range(repetitions): - data = np.random.randn( - 32, int(length), int(length), int(length)).astype(np.float32) + data = np.random.randn(32, int(length), int(length), int(length)).astype( + np.float32 + ) data = torch.from_numpy(data).cuda() start = time.perf_counter() res = jit_wavedec(data, wavelet) @@ -101,16 +103,26 @@ def _to_jit_wavedec_3(data, wavelet): ptwt_time_gpu_jit.append(end - start) print("3d fwt results") - print(f"3d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"3d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") - print(f"3d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"3d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}") + print( + f"3d-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}" + ) + print( + f"3d-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}" + ) + print( + f"3d-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}" + ) + print( + f"3d-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}" + ) - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1) + time_stack = np.stack( + [pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1 + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) + plt.yscale("log") + plt.xticks([1, 2, 3, 4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('DWT-3D') - plt.savefig('./figs/timeitconv3d.png') + plt.ylabel("runtime [s]") + plt.title("DWT-3D") + plt.savefig("./figs/timeitconv3d.png") diff --git a/examples/speed_tests/timeitcwt_1d.py b/examples/speed_tests/timeitcwt_1d.py index 634777ce..76759f72 100644 --- a/examples/speed_tests/timeitcwt_1d.py +++ b/examples/speed_tests/timeitcwt_1d.py @@ -1,11 +1,11 @@ -import torch -import ptwt -import pywt import time -import numpy as np -import matplotlib.pyplot as plt +import matplotlib.pyplot as plt +import numpy as np +import pywt +import torch +import ptwt from ptwt.continuous_transform import _ShannonWavelet @@ -17,7 +17,7 @@ def _to_jit_cwt(sig): return cwtmatr -if __name__ == '__main__': +if __name__ == "__main__": length = 1e4 repetitions = 100 @@ -51,7 +51,6 @@ def _to_jit_cwt(sig): end = time.perf_counter() ptwt_time_cpu.append(end - start) - for _ in range(repetitions): sig = np.random.randn(32, int(length)).astype(np.float32) sig = torch.from_numpy(sig).cuda() @@ -66,10 +65,7 @@ def _to_jit_cwt(sig): end = time.perf_counter() ptwt_time_gpu.append(end - start) - - - jit_cwt = torch.jit.trace(_to_jit_cwt, (sig.cuda()), strict=False) - + jit_cwt = torch.jit.trace(_to_jit_cwt, (sig.cuda()), strict=False) for _ in range(repetitions): sig = np.random.randn(32, int(length)).astype(np.float32) @@ -79,18 +75,28 @@ def _to_jit_cwt(sig): torch.cuda.synchronize() end = time.perf_counter() ptwt_time_gpu_jit.append(end - start) - - print("1d cwt results") - print(f"cwt-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}") - print(f"cwt-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}") - print(f"cwt-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}") - print(f"cwt-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}") - time_stack = np.stack([pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1) + print("1d cwt results") + print( + f"cwt-pywt-cpu :{np.mean(pywt_time_cpu):5.5f} +- {np.std(pywt_time_cpu):5.5f}" + ) + print( + f"cwt-ptwt-cpu :{np.mean(ptwt_time_cpu):5.5f} +- {np.std(ptwt_time_cpu):5.5f}" + ) + print( + f"cwt-ptwt-gpu :{np.mean(ptwt_time_gpu):5.5f} +- {np.std(ptwt_time_gpu):5.5f}" + ) + print( + f"cwt-ptwt-gpu-jit:{np.mean(ptwt_time_gpu_jit):5.5f} +- {np.std(ptwt_time_gpu_jit):5.5f}" + ) + + time_stack = np.stack( + [pywt_time_cpu, ptwt_time_cpu, ptwt_time_gpu, ptwt_time_gpu_jit], -1 + ) plt.boxplot(time_stack) - plt.yscale('log') - plt.xticks([1,2,3,4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) + plt.yscale("log") + plt.xticks([1, 2, 3, 4], ["pywt-cpu", "ptwt-cpu", "ptwt-gpu", "ptwt-gpu-jit"]) plt.xticks(rotation=20) - plt.ylabel('runtime [s]') - plt.title('CWT-1D') - plt.savefig('./figs/timeitcwt.png') + plt.ylabel("runtime [s]") + plt.title("CWT-1D") + plt.savefig("./figs/timeitcwt.png") diff --git a/examples/wavelet_packet_chirp_analysis/chirp_analysis.py b/examples/wavelet_packet_chirp_analysis/chirp_analysis.py index 110eb76f..24617edd 100644 --- a/examples/wavelet_packet_chirp_analysis/chirp_analysis.py +++ b/examples/wavelet_packet_chirp_analysis/chirp_analysis.py @@ -1,15 +1,15 @@ -import torch -import pywt +import matplotlib.pyplot as plt import numpy as np +import pywt import scipy.signal -import matplotlib.pyplot as plt +import torch # use from src.ptwt.packets if you cloned the repo instead of using pip. from ptwt import WaveletPacket fs = 1000 -t = np.linspace(0, 2, int(2//(1/fs))) -w = np.sin(256*np.pi*t**2) +t = np.linspace(0, 2, int(2 // (1 / fs))) +w = np.sin(256 * np.pi * t**2) wavelet = pywt.Wavelet("sym8") wp = WaveletPacket( @@ -23,7 +23,7 @@ viz = np.stack(np_lst).squeeze() n = list(range(int(np.power(2, level)))) -freqs = (fs/2)*(n/(np.power(2, level))) +freqs = (fs / 2) * (n / (np.power(2, level))) xticks = list(range(viz.shape[-1]))[::6] xlabels = np.round(np.linspace(min(t), max(t), viz.shape[-1]), 2)[::6] diff --git a/noxfile.py b/noxfile.py index 6b28ac9c..824a4a9a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -77,8 +77,8 @@ def format(session): """Fix common convention problems automatically.""" session.install("black") session.install("isort") - session.run("isort", "src", "tests", "noxfile.py") - session.run("black", "src", "tests", "noxfile.py") + session.run("isort", ".") + session.run("black", ".") @nox.session(name="coverage") From 7ac4998db016a98ad2279a471e9868eb3957dc9e Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 19:51:44 +0100 Subject: [PATCH 28/39] batched iswt fix. --- src/ptwt/_stationary_transform.py | 16 ++++++++++++---- tests/test_swt.py | 14 +++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index bdcc44b2..7d5de967 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -43,6 +43,9 @@ def _swt( elif data.dim() == 2: # assume batched time series data = data.unsqueeze(1) + else: + # TODO: Take care of n-dimensional input support. + raise Exception(f"{data.dim()}-dimensional inputs not supported.") dec_lo, dec_hi, _, _ = _get_filter_tensors( wavelet, flip=True, device=data.device, dtype=data.dtype @@ -96,12 +99,17 @@ def _conv_transpose_dedilate( for fl in range(length) ] to_conv_t = torch.cat(to_conv_t_list, 0) - rec = torch.nn.functional.conv1d( + padding = rec_filt.shape[-1] - 1 + rec = torch.nn.functional.conv_transpose1d( to_conv_t, - rec_filt.swapaxes(0, 1), + rec_filt, stride=1, + padding=padding, + output_padding=0 ) - return rec.swapaxes(0, -1) / 2.0 + rec = rec / 2.0 + splits = torch.split(rec, rec.shape[0]//len(to_conv_t_list)) + return torch.cat(splits, -1) def _iswt( @@ -123,7 +131,7 @@ def _iswt( wavelet = _as_wavelet(wavelet) _, _, rec_lo, rec_hi = _get_filter_tensors( - wavelet, flip=True, dtype=coeffs[0].dtype, device=coeffs[0].device + wavelet, flip=False, dtype=coeffs[0].dtype, device=coeffs[0].device ) filt_len = rec_lo.shape[-1] rec_filt = torch.stack([rec_lo, rec_hi], 0) diff --git a/tests/test_swt.py b/tests/test_swt.py index 73fcb87f..3fbb3182 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -5,16 +5,15 @@ import pywt import torch -from ptwt._stationary_transform import _iswt, _swt - +# from ptwt._stationary_transform import _iswt, _swt +from src.ptwt._stationary_transform import _iswt, _swt @pytest.mark.parametrize("level", [1, 2, None]) -@pytest.mark.parametrize("size", [32, 64]) +@pytest.mark.parametrize("size", [[1,32], [3,64], [5, 64]]) @pytest.mark.parametrize("wavelet", ["db1", "db2"]) def test_swt_1d(level, size, wavelet): """Test the 1d swt.""" - # signal = np.expand_dims(np.arange(size).astype(np.float64), 0) - signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) + signal = np.random.normal(size=size).astype(np.float64) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) pywt_coeff = pywt.swt(signal, wavelet, level, trim_approx=True, norm=False) test_list = [] @@ -24,11 +23,12 @@ def test_swt_1d(level, size, wavelet): @pytest.mark.parametrize("level", [1, 2, None]) -@pytest.mark.parametrize("size", [32, 64]) +@pytest.mark.parametrize("size", [[1, 32], [5, 64]]) @pytest.mark.parametrize("wavelet", ["db1", "db2"]) def test_iswt_1d(level, size, wavelet): """Ensure iswt inverts swt.""" - signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) + # signal = np.random.normal(size=size).astype(np.float64) + signal = np.stack([np.arange(32)]*3).astype(np.float64) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) rec = _iswt(ptwt_coeff, wavelet) assert np.allclose(rec.numpy(), signal) From 8ecb96fe777d79a0a2b452551518f069b153c541 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 19:52:03 +0100 Subject: [PATCH 29/39] format. --- src/ptwt/_stationary_transform.py | 10 +++------- tests/test_swt.py | 5 +++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 7d5de967..58489fc1 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -99,16 +99,12 @@ def _conv_transpose_dedilate( for fl in range(length) ] to_conv_t = torch.cat(to_conv_t_list, 0) - padding = rec_filt.shape[-1] - 1 + padding = rec_filt.shape[-1] - 1 rec = torch.nn.functional.conv_transpose1d( - to_conv_t, - rec_filt, - stride=1, - padding=padding, - output_padding=0 + to_conv_t, rec_filt, stride=1, padding=padding, output_padding=0 ) rec = rec / 2.0 - splits = torch.split(rec, rec.shape[0]//len(to_conv_t_list)) + splits = torch.split(rec, rec.shape[0] // len(to_conv_t_list)) return torch.cat(splits, -1) diff --git a/tests/test_swt.py b/tests/test_swt.py index 3fbb3182..d1c154bb 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -8,8 +8,9 @@ # from ptwt._stationary_transform import _iswt, _swt from src.ptwt._stationary_transform import _iswt, _swt + @pytest.mark.parametrize("level", [1, 2, None]) -@pytest.mark.parametrize("size", [[1,32], [3,64], [5, 64]]) +@pytest.mark.parametrize("size", [[1, 32], [3, 64], [5, 64]]) @pytest.mark.parametrize("wavelet", ["db1", "db2"]) def test_swt_1d(level, size, wavelet): """Test the 1d swt.""" @@ -28,7 +29,7 @@ def test_swt_1d(level, size, wavelet): def test_iswt_1d(level, size, wavelet): """Ensure iswt inverts swt.""" # signal = np.random.normal(size=size).astype(np.float64) - signal = np.stack([np.arange(32)]*3).astype(np.float64) + signal = np.stack([np.arange(32)] * 3).astype(np.float64) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) rec = _iswt(ptwt_coeff, wavelet) assert np.allclose(rec.numpy(), signal) From 2f055dbefee48a26579f1850d8639366e0a8cea7 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:01:24 +0100 Subject: [PATCH 30/39] batched 1d swt. --- src/ptwt/_stationary_transform.py | 28 +++++++++++++++++----------- tests/test_swt.py | 10 +++++----- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 58489fc1..072546f3 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -7,8 +7,13 @@ import pywt import torch -from src.ptwt._util import Wavelet, _as_wavelet -from src.ptwt.conv_transform import _get_filter_tensors, _preprocess_result_list_rec1d +from ._util import Wavelet, _as_wavelet, _unfold_axes +from .conv_transform import ( + _get_filter_tensors, + _postprocess_result_list_dec1d, + _preprocess_result_list_rec1d, + _preprocess_tensor_dec1d, +) def _swt( @@ -37,15 +42,7 @@ def _swt( else: raise ValueError("swt transforms a single axis only.") - if data.dim() == 1: - # assume time series - data = data.unsqueeze(0).unsqueeze(0) - elif data.dim() == 2: - # assume batched time series - data = data.unsqueeze(1) - else: - # TODO: Take care of n-dimensional input support. - raise Exception(f"{data.dim()}-dimensional inputs not supported.") + data, ds = _preprocess_tensor_dec1d(data) dec_lo, dec_hi, _, _ = _get_filter_tensors( wavelet, flip=True, device=data.device, dtype=data.dtype @@ -69,6 +66,9 @@ def _swt( result_list.append(res_hi.squeeze(1)) result_list.append(res_lo.squeeze(1)) + if ds: + result_list = _postprocess_result_list_dec1d(result_list, ds) + if axis != -1: result_list = [coeff.swapaxes(axis, -1) for coeff in result_list] @@ -143,4 +143,10 @@ def _iswt( ) res_lo = res_lo.squeeze(1) + if ds: + res_lo = _unfold_axes(res_lo, ds, 1) + + if axis != -1: + res_lo = res_lo.swapaxes(axis, -1) + return res_lo diff --git a/tests/test_swt.py b/tests/test_swt.py index d1c154bb..96f3b9e5 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -28,21 +28,21 @@ def test_swt_1d(level, size, wavelet): @pytest.mark.parametrize("wavelet", ["db1", "db2"]) def test_iswt_1d(level, size, wavelet): """Ensure iswt inverts swt.""" - # signal = np.random.normal(size=size).astype(np.float64) - signal = np.stack([np.arange(32)] * 3).astype(np.float64) + signal = np.random.normal(size=size).astype(np.float64) + # signal = np.stack([np.arange(32)] * 3).astype(np.float64) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level) rec = _iswt(ptwt_coeff, wavelet) assert np.allclose(rec.numpy(), signal) -@pytest.mark.parametrize("size", [64, 128, 256]) +# TODO: test beyond 2d. +@pytest.mark.parametrize("size", [[1, 64], [2, 128], [3, 256]]) @pytest.mark.parametrize("wavelet", ["db1", "db2", "sym5"]) @pytest.mark.parametrize("level", [1, 2, 3]) # TODO: None @pytest.mark.parametrize("axis", [1, -1]) def test_swt_1d_slow(level, size, wavelet, axis): """Test the 1d swt.""" - # signal = np.expand_dims(np.arange(size).astype(np.float64), 0) - signal = np.expand_dims(np.random.normal(size=size).astype(np.float64), 0) + signal = np.random.normal(size=size).astype(np.float64) ptwt_coeff = _swt(torch.from_numpy(signal), wavelet, level=level, axis=axis) pywt_coeff = pywt.swt( signal, wavelet, level, trim_approx=True, norm=False, axis=axis From 0d4b30d0bb75cde7c2d5ddaa58179c732ec7837c Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:07:09 +0100 Subject: [PATCH 31/39] nd and axis test. --- tests/test_swt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_swt.py b/tests/test_swt.py index 96f3b9e5..fe26e628 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -36,7 +36,7 @@ def test_iswt_1d(level, size, wavelet): # TODO: test beyond 2d. -@pytest.mark.parametrize("size", [[1, 64], [2, 128], [3, 256]]) +@pytest.mark.parametrize("size", [[32, 64], [32, 128], [3, 32, 256]]) @pytest.mark.parametrize("wavelet", ["db1", "db2", "sym5"]) @pytest.mark.parametrize("level", [1, 2, 3]) # TODO: None @pytest.mark.parametrize("axis", [1, -1]) From 0234789879cecb5b34afae01f26e2e9985b3af0b Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:22:58 +0100 Subject: [PATCH 32/39] clean up document headers. --- src/ptwt/_stationary_transform.py | 2 -- src/ptwt/conv_transform.py | 1 - src/ptwt/conv_transform_3.py | 2 -- src/ptwt/matmul_transform.py | 1 - src/ptwt/matmul_transform_2.py | 1 - src/ptwt/packets.py | 2 -- src/ptwt/sparse_math.py | 1 - src/ptwt/wavelets_learnable.py | 2 -- tests/test_swt.py | 8 +++----- 9 files changed, 3 insertions(+), 17 deletions(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 072546f3..ee8bb05b 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -1,7 +1,5 @@ """This module implements stationary wavelet transforms.""" -# Created by the pytorch wavelet toolbox team, in 2024 - from typing import List, Optional, Union import pywt diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index 7a0a21a8..1b079d5f 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -3,7 +3,6 @@ This module treats boundaries with edge-padding. """ -# Created by moritz wolter, 14.04.20 from typing import List, Optional, Sequence, Tuple, Union, cast import pywt diff --git a/src/ptwt/conv_transform_3.py b/src/ptwt/conv_transform_3.py index b08fa915..38341cb9 100644 --- a/src/ptwt/conv_transform_3.py +++ b/src/ptwt/conv_transform_3.py @@ -3,8 +3,6 @@ The functions here are based on torch.nn.functional.conv3d and it's transpose. """ -# Written by the Pytorch wavelet toolbox team in 2024 - from functools import partial from typing import Dict, List, Optional, Sequence, Tuple, Union, cast diff --git a/src/ptwt/matmul_transform.py b/src/ptwt/matmul_transform.py index 62238469..aa2af955 100644 --- a/src/ptwt/matmul_transform.py +++ b/src/ptwt/matmul_transform.py @@ -7,7 +7,6 @@ of boundary filters in "Ripples in Mathematics" section 10.3 . """ -# Created by moritz (wolter@cs.uni-bonn.de) at 14.04.20 import sys from typing import List, Optional, Union diff --git a/src/ptwt/matmul_transform_2.py b/src/ptwt/matmul_transform_2.py index dc465f8a..215e738a 100644 --- a/src/ptwt/matmul_transform_2.py +++ b/src/ptwt/matmul_transform_2.py @@ -3,7 +3,6 @@ This module uses boundary filters to minimize padding. """ -# Written by moritz ( @ wolter.tech ) in 2021 import sys from functools import partial from typing import List, Optional, Tuple, Union, cast diff --git a/src/ptwt/packets.py b/src/ptwt/packets.py index e27304c2..95e653b7 100644 --- a/src/ptwt/packets.py +++ b/src/ptwt/packets.py @@ -1,7 +1,5 @@ """Compute analysis wavelet packet representations.""" -# Created on Fri Apr 6 2021 by moritz (wolter@cs.uni-bonn.de) - import collections from functools import partial from itertools import product diff --git a/src/ptwt/sparse_math.py b/src/ptwt/sparse_math.py index ea1c3d1b..d9cf9e6a 100644 --- a/src/ptwt/sparse_math.py +++ b/src/ptwt/sparse_math.py @@ -1,6 +1,5 @@ """Efficiently construct fwt operations using sparse matrices.""" -# Written by moritz ( @ wolter.tech ) 17.09.21 from itertools import product from typing import List diff --git a/src/ptwt/wavelets_learnable.py b/src/ptwt/wavelets_learnable.py index 240abd26..76c39036 100644 --- a/src/ptwt/wavelets_learnable.py +++ b/src/ptwt/wavelets_learnable.py @@ -3,9 +3,7 @@ See https://arxiv.org/pdf/2004.09569.pdf for more information. """ -# Created by moritz wolter@cs.uni-bonn.de, 14.05.20 # Inspired by Ripples in Mathematics, Jensen and La Cour-Harbo, Chapter 7.7 -# import pywt from abc import ABC, abstractmethod from typing import Tuple diff --git a/tests/test_swt.py b/tests/test_swt.py index 142e3d33..f7654e10 100644 --- a/tests/test_swt.py +++ b/tests/test_swt.py @@ -7,8 +7,7 @@ import pywt import torch -# from ptwt._stationary_transform import _iswt, _swt -from src.ptwt._stationary_transform import _iswt, _swt +from ptwt._stationary_transform import _iswt, _swt @pytest.mark.parametrize("level", [1, 2, None]) @@ -37,10 +36,9 @@ def test_iswt_1d(level: Optional[int], size: int, wavelet: str) -> None: assert np.allclose(rec.numpy(), signal) -# TODO: test beyond 2d. @pytest.mark.parametrize("size", [[32, 64], [32, 128], [3, 32, 256]]) -@pytest.mark.parametrize("wavelet", ["db1", "db2", "sym5"]) -@pytest.mark.parametrize("level", [1, 2, 3]) # TODO: None +@pytest.mark.parametrize("wavelet", ["db1", "db2", "sym3"]) +@pytest.mark.parametrize("level", [1, 2, 3]) # None needs more work. @pytest.mark.parametrize("axis", [1, -1]) def test_swt_1d_slow(level: Optional[int], size: int, wavelet: str, axis: int) -> None: """Test the 1d swt.""" From dc4c68a6f9cd46751a89e342fc5c0ab32bd59a2d Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:31:44 +0100 Subject: [PATCH 33/39] iswt docstring. --- src/ptwt/_stationary_transform.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index ee8bb05b..7de903cc 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -109,6 +109,19 @@ def _conv_transpose_dedilate( def _iswt( coeffs: List[torch.Tensor], wavelet: Union[pywt.Wavelet, str], axis: int = -1 ) -> torch.Tensor: + """Inverts a 1d stationary wavelet transform. + + Args: + coeffs (List[torch.Tensor]): The coefficients as computed by the swt function. + wavelet (Union[pywt.Wavelet, str]): The wavelet used for the forward transform. + axis (int, optional): The axis the forward trasform was computed over. Defaults to -1. + + Raises: + ValueError: If the axis argument is not an integer. + + Returns: + torch.Tensor: A reconstruction of the original swt input. + """ if axis != -1: swap = [] if isinstance(axis, int): From 978fdaf51d7595ccd5ff014c0b97293016b0e556 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:39:06 +0100 Subject: [PATCH 34/39] fix formatting. --- src/ptwt/_stationary_transform.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index 7de903cc..b95343de 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -107,7 +107,9 @@ def _conv_transpose_dedilate( def _iswt( - coeffs: List[torch.Tensor], wavelet: Union[pywt.Wavelet, str], axis: int = -1 + coeffs: List[torch.Tensor], + wavelet: Union[pywt.Wavelet, str], + axis: Optional[int] = -1, ) -> torch.Tensor: """Inverts a 1d stationary wavelet transform. From 3fc07ec8cca242e21317933aeb2f348048ab79a0 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 2 Feb 2024 20:40:45 +0100 Subject: [PATCH 35/39] formattinb v2. --- src/ptwt/_stationary_transform.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ptwt/_stationary_transform.py b/src/ptwt/_stationary_transform.py index b95343de..c1fe5484 100644 --- a/src/ptwt/_stationary_transform.py +++ b/src/ptwt/_stationary_transform.py @@ -116,7 +116,8 @@ def _iswt( Args: coeffs (List[torch.Tensor]): The coefficients as computed by the swt function. wavelet (Union[pywt.Wavelet, str]): The wavelet used for the forward transform. - axis (int, optional): The axis the forward trasform was computed over. Defaults to -1. + axis (int, optional): The axis the forward trasform was computed over. + Defaults to -1. Raises: ValueError: If the axis argument is not an integer. From f9333edd87d85e81b406a0f4762e38b55d2873a7 Mon Sep 17 00:00:00 2001 From: Charles Tapley Hoyt Date: Fri, 2 Feb 2024 23:12:21 +0100 Subject: [PATCH 36/39] Add documentation linting --- noxfile.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/noxfile.py b/noxfile.py index 92c00cfc..7fc71c8b 100644 --- a/noxfile.py +++ b/noxfile.py @@ -34,6 +34,9 @@ def lint(session): ) session.run("flake8", "src", "tests", "noxfile.py") + session.install("sphinx", "doc8") + session.run("doc8", "docs/") + @nox.session(name="typing") def mypy(session): From 588733c012ff368f551736440c2085493cf9ca27 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Tue, 13 Feb 2024 12:46:20 +0100 Subject: [PATCH 37/39] doc linting ok. --- .flake8 | 2 +- docs/examples.rst | 38 +----------------- docs/index.rst | 2 +- docs/intro.rst | 84 +++++++++++++++++++++++++++------------ docs/intro_cwt.rst | 91 ++++++++++++++++++++++++++++++++++--------- docs/requirements.txt | 2 +- noxfile.py | 2 +- 7 files changed, 137 insertions(+), 84 deletions(-) diff --git a/.flake8 b/.flake8 index 76823228..4aa3a6f7 100644 --- a/.flake8 +++ b/.flake8 @@ -37,7 +37,7 @@ exclude = .eggs, data. src/ptwt/__init__.py -max-line-length = 88 +max-line-length = 90 max-complexity = 20 import-order-style = pycharm application-import-names = diff --git a/docs/examples.rst b/docs/examples.rst index b85ff3b0..f934a4e6 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -1,41 +1,5 @@ Wavelet transforms by example ============================= +Worked examples are available in the examples folder of the `GitHub repository `_ . -The continuous wavelet transform -------------------------------------------------- -The provided function :py:meth:`ptwt.continuous_transform.cwt` implements the Continuous Wavelet Transform (CWT) for analyzing signals for usage in PyTorch. It computes the CWT matrix for a given input signal using specified wavelet scales and wavelet functions. - -Inputs: - -* ``data``: Input signal tensor. - -* ``scales``: Array of desired wavelet scales. - -* ``wavelet``: Continuous wavelet function or string representing a wavelet. - -* ``sampling_period``: Sampling period for frequency output (optional). This must be given to obtain the correct corresponding frequency array (see outputs). - -Outputs: - -* ``cwtmatr``: A tensor containing the transformation matrix. - -* ``freqs``: An array with information about the frequencies corresponding to the scales in ``cwtmatr``. - -Example Usage: - -.. code-block:: - - import torch - import ptwt - import numpy as np - import scipy.signal as signal - - t = np.linspace(-2, 2, 800, endpoint=False) - sig = signal.chirp(t, f0=1, f1=12, t1=2, method="linear") - widths = np.arange(1, 31) - cwtmatr, freqs = ptwt.cwt( - torch.from_numpy(sig), widths, "mexh", sampling_period=(4 / 800) * np.pi - ) - -This code snippet demonstrates how to compute the CWT of a chirp signal using the Mexican-Hat wavelet ("mexh"), specifying the scales and sampling period. The resulting ``cwtmatr`` contains the transformed coefficients, and ``freqs`` provides information about the frequencies corresponding to the scales in ``cwtmatr``. diff --git a/docs/index.rst b/docs/index.rst index 6ea58195..27c7e0e6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -29,7 +29,7 @@ If you use this work in a scientific context, please cite the following thesis: .. code-block:: - @article{ptwt_2023, + @article{ptwt_2023, author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, title = {{ptwt - The PyTorch Wavelet Toolbox}}, journal = {Journal of Machine Learning Research}, diff --git a/docs/intro.rst b/docs/intro.rst index a8b50f8c..d971eb79 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -2,7 +2,8 @@ Introduction to discrete wavelet transforms =========================================== This text summarizes key wavelet facts as a convenience for the hasty reader. -See, for example, :cite:`strang1996wavelets,mallat1999wavelet` or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. +See, for example, :cite:`strang1996wavelets,mallat1999wavelet` +or :cite:`jensen2001ripples` for excellent detailed introductions to the topic. This text is partially based material from :cite:`wolter2022wavelet`. The fwt relies on convolution operations with filter pairs. @@ -15,20 +16,31 @@ The fwt relies on convolution operations with filter pairs. :align: center Overview of the fwt computation. - -:numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{A}` denotes the analysis low-pass filter. :math:`\mathbf{h}_\mathcal{D}` the analysis high pass filter. :math:`\mathbf{f}_\mathcal{A}` and :math:`\mathbf{f}_\mathcal{D}` the synthesis filer pair. :math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. In machine learning terms, the analysis transform relies on stride two convolutions. The synthesis or inverse transform on the right works with stride two transposed convolutions. :math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{A}, \mathcal{D}]` denote the corresponding convolution operators. + +:numref:`fig-fwt` illustrates the process. :math:`\mathbf{h}_\mathcal{A}` denotes the analysis low-pass filter. +:math:`\mathbf{h}_\mathcal{D}` the analysis high pass filter. +:math:`\mathbf{f}_\mathcal{A}` and :math:`\mathbf{f}_\mathcal{D}` the synthesis filer pair. +:math:`\downarrow_2` denotes downsampling with a factor of two, :math:`\uparrow_2` means upsampling. +In machine learning terms, the analysis transform relies on stride two convolutions. +The synthesis or inverse transform on the right works with stride two transposed convolutions. +:math:`\mathbf{H}_{k}` and :math:`\mathbf{F}_{k}` with :math:`k \in [\mathcal{A}, \mathcal{D}]` +denote the corresponding convolution operators. .. math:: \mathbf{x}_s * \mathbf{h}_k = \mathbf{c}_{k, s+1} -with :math:`k \in [\mathcal{A}, \mathcal{D}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to +with :math:`k \in [\mathcal{A}, \mathcal{D}]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, +where :math:`\mathbf{x}_0` is equal to the original input signal :math:`\mathbf{x}`. At higher scales, the fwt uses the low-pass filtered result as input, -:math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{A}, s}` if :math:`s > 0`. -The dashed arrow indicates that we could continue to expand the fwt tree here. :py:meth:`ptwt.conv_transform.wavedec` implements this transformation. -:py:meth:`ptwt.conv_transform.waverec` provides the inverse functionality visible on the right side of Figure :numref:`fig-fwt`. +:math:`\mathbf{x}_s = \mathbf{c}_{\mathcal{A}, s}` if :math:`s > 0`. +The dashed arrow indicates that we could continue to expand the fwt tree here. +:py:meth:`ptwt.conv_transform.wavedec` implements this transformation. +:py:meth:`ptwt.conv_transform.waverec` provides the inverse functionality visible +on the right side of Figure :numref:`fig-fwt`. -The wavelet packet transform (pwt) additionally expands the high-frequency part of the tree. The figure below depicts the idea. +The wavelet packet transform (pwt) additionally expands the high-frequency part of the tree. +The figure below depicts the idea. .. _fig-wpt: @@ -39,14 +51,18 @@ The wavelet packet transform (pwt) additionally expands the high-frequency part Scematic drawing of the full wpt in a single dimension. Compared to :numref:`fig-fwt`, the high-pass filtered side of the tree is expanded, too. -Whole expansion is not the only possible way to construct a wavelet packet tree. See :cite:`jensen2001ripples` for a discussion of other options. -In :numref:`fig-fwt` and :numref:`fig-wpt`, capital letters denote convolution operators. These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. -The matrix nature of these operators explains the capital boldface notation. Coefficient subscripts record the path that leads to a particular coefficient. +Whole expansion is not the only possible way to construct a wavelet packet tree. +See :cite:`jensen2001ripples` for a discussion of other options. +In :numref:`fig-fwt` and :numref:`fig-wpt`, capital letters denote convolution operators. +These may be expressed as Toeplitz matrices :cite:`strang1996wavelets`. +The matrix nature of these operators explains the capital boldface notation. +Coefficient subscripts record the path that leads to a particular coefficient. :py:meth:`ptwt.packets.WaveletPacket` provides this functionality for single dimensional inputs. -This toolbox provides two dimensional input processing functionality. -We construct filter quadruples from the original filter pairs to process two-dimensional inputs. The process uses outer products :cite:`vyas2018multiscale`: +This toolbox provides two dimensional input processing functionality. +We construct filter quadruples from the original filter pairs to process two-dimensional inputs. +The process uses outer products :cite:`vyas2018multiscale`: .. math:: \mathbf{h}_{a} = \mathbf{h}_\mathcal{A}\mathbf{h}_\mathcal{A}^T, @@ -54,14 +70,16 @@ We construct filter quadruples from the original filter pairs to process two-dim \mathbf{h}_{v} = \mathbf{h}_\mathcal{D}\mathbf{h}_\mathcal{A}^T, \mathbf{h}_{d} = \mathbf{h}_\mathcal{D}\mathbf{h}_\mathcal{D}^T -With :math:`a` for approximation, :math:`h` for horizontal, :math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. +With :math:`a` for approximation, :math:`h` for horizontal, +:math:`v` for vertical, and :math:`d` for diagonal :cite:`lee2019pywavelets`. With the four filters we are now able to compute, .. math:: \mathbf{x}_s *_2 \mathbf{h}_k = \mathbf{c}_{k, s+1} -with :math:`k \in [a, h, v, d]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, where :math:`\mathbf{x}_0` is equal to +with :math:`k \in [a, h, v, d]` and :math:`s \in \mathbb{N}_0` the set of natural numbers, +where :math:`\mathbf{x}_0` is equal to the original input image :math:`\mathbf{X}`. :math:`*_2` indicates two dimensional-convolution. Computations at subsequent scales work exclusively with approximation coefficients :math:`c_{a, s}` as inputs. The figure below illustrates the process. @@ -78,7 +96,7 @@ The figure below illustrates the process. :py:meth:`ptwt.conv_transform_2.wavedec2` and :py:meth:`ptwt.conv_transform_2.waverec2` support forward -and backward transforms respectively. Potential further decomposition of all coefficient leads us to +and backward transforms respectively. Potential further decomposition of all coefficient leads us to wavelet packets. @@ -92,18 +110,26 @@ wavelet packets. Two-dimensional wavelet packet transform computation diagram. Dashed lines indicate potential full expansion of the tree. :numref:`fig-wpt2d` illustrates the computation of a full two-dimensional wavelet packet tree. -At higher scales, all resulting coefficients from previous scales serve as inputs. The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. -:py:meth:`ptwt.packets.WaveletPacket2D` provides this functionality. We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. +At higher scales, all resulting coefficients from previous scales serve as inputs. +The four filters repeatedly convolved with all outputs to build the full tree. The inverse transforms work analogously. +:py:meth:`ptwt.packets.WaveletPacket2D` provides this functionality. +We refer to the standard literature :cite:`jensen2001ripples,strang1996wavelets` for an extended discussion. -Compared to the FWT, the high-frequency half of the tree is subdivided into more bins, yielding a fine-grained view of the entire spectrum. -We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. Synthesis transforms reconstruct the original input based on the results from the analysis transform. +Compared to the FWT, the high-frequency half of the tree is subdivided into more bins, +yielding a fine-grained view of the entire spectrum. +We always show analysis and synthesis transforms to stress that all wavelet transforms are lossless. +Synthesis transforms reconstruct the original input based on the results from the analysis transform. Common wavelets and their properties ------------------------------------ A key property of the wavelet transform is its invertibility. Additionally, we expect an alias-free representation. Standard literature like :cite:`strang1996wavelets` formulates the perfect reconstruction -and alias cancellation conditions to satisfy both requirements. For an analysis filter coefficient vector :math:`\mathbf{h}` the equations below use the polynomial :math:`H(z) = \sum_n h(n)z^{-n}`. We construct :math:`F(z)` the same way using the synthesis filter coefficients in :math:`\mathbf{f}`. To guarantee perfect reconstruction the filters must respect +and alias cancellation conditions to satisfy both requirements. +For an analysis filter coefficient vector :math:`\mathbf{h}` +the equations below use the polynomial :math:`H(z) = \sum_n h(n)z^{-n}`. +We construct :math:`F(z)` the same way using the synthesis filter coefficients in :math:`\mathbf{f}`. +To guarantee perfect reconstruction the filters must respect .. math:: H_\mathcal{A}(z)F_\mathcal{A}(z) + H_\mathcal{D}(-z)F_\mathcal{D}(z) = 2z^{-l}. @@ -113,7 +139,7 @@ Similarly .. _eq-alias: .. math:: - F_\mathcal{A}(z)H_\mathcal{A}(-z) + F_\mathcal{D}(z)H_\mathcal{D}(-z) = 0 + F_\mathcal{A}(z)H_\mathcal{A}(-z) + F_\mathcal{D}(z)H_\mathcal{D}(-z) = 0 guarantees alias cancellation. @@ -125,7 +151,7 @@ Filters that satisfy both equations qualify as wavelets. Lets consider i.e. a Da :scale: 45 % :alt: sym6 filter values :align: center - + Visualization of the Symlet 6 filter coefficients. @@ -139,6 +165,14 @@ Filters that satisfy both equations qualify as wavelets. Lets consider i.e. a Da Visualization of the Daubechies 6 filter coefficients. :numref:`fig-sym6` and :numref:`fig-db6` visualize the Daubechies and Symlet filters of 6th degree. -Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. :numref:`fig-sym6` illustrates this fact. Large deviations occur around the fifth filter in the center, unlike the Daubechies' six filters in :numref:`fig-db6`. -Consider the sign patterns in :numref:`fig-db6`. The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. This behavior is a possible solution to the alias cancellation condition. To understand why substitute :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` and :math:`F_\mathcal{D} = -H_\mathcal{A}(-z)` into the perfect reconstruction condition :cite:`strang1996wavelets`. :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` requires an opposing sign at even and equal signs at odd powers of the polynomial. +Compared to the Daubechies Wavelet family, their Symlet cousins have more mass at the center. +:numref:`fig-sym6` illustrates this fact. Large deviations occur around the fifth filter in the center, +unlike the Daubechies' six filters in :numref:`fig-db6`. +Consider the sign patterns in :numref:`fig-db6`. +The decomposition highpass (orange) and the reconstruction lowpass (green) filters display an alternating sign pattern. +This behavior is a possible solution to the alias cancellation condition. +To understand why substitute :math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` and :math:`F_\mathcal{D} = -H_\mathcal{A}(-z)` +into the perfect reconstruction condition :cite:`strang1996wavelets`. +:math:`F_\mathcal{A}(z) = H_\mathcal{D}(-z)` requires an opposing sign +at even and equal signs at odd powers of the polynomial. diff --git a/docs/intro_cwt.rst b/docs/intro_cwt.rst index 1d1dcbb4..c2b17a0c 100644 --- a/docs/intro_cwt.rst +++ b/docs/intro_cwt.rst @@ -1,13 +1,24 @@ Introduction to continuous wavelet transforms ============================================= -This page provides documentation, focusing on the Continuous Wavelet Transform (CWT) and its application in signal analysis. See, for example, :cite:`strang1996wavelets,mallat1999wavelet,daubechies1992lectures` or :cite:`kaiser1994guidetowavelets` for excellent detailed introductions to the topic. +This page provides documentation, focusing on the Continuous Wavelet Transform (CWT) +and its application in signal analysis. +See, for example, :cite:`strang1996wavelets,mallat1999wavelet,daubechies1992lectures` +or :cite:`kaiser1994guidetowavelets` for excellent detailed introductions to the topic. -The implementation in :py:meth:`ptwt.continuous_transform.cwt` uses https://github.com/PyWavelets/pywt/blob/master/pywt/_cwt.py and efficiently utilizes PyTorch for computation and supports various wavelet functions for flexible signal analysis. +The implementation in :py:meth:`ptwt.continuous_transform.cwt` uses https://github.com/PyWavelets/pywt/blob/master/pywt/_cwt.py +and efficiently utilizes PyTorch for computation and supports various wavelet functions for flexible signal analysis. Definition of CWT ------------------ -The Continuous Wavelet Transform (CWT) is a mathematical tool used for analyzing signals in both time and frequency domains simultaneously. It is based on a wavelet function, which is a small, localized wave-like function, that is stretched or compressed and shifted across the signal. The shifted and stretched version of a mother wavelet function :math:`\psi \in \mathcal{L}_2(\mathbb{R})` is defined by :math:`\psi^{a,b}(t)`, where :math:`a\in\mathbb{R}\setminus\{0\}` and :math:`b\in\mathbb{R}` and :math:`\mathcal{L}_2` is a Hilbert space (complete linear space with scalar product), as: +The Continuous Wavelet Transform (CWT) is a mathematical tool +used for analyzing signals in both time and frequency domains simultaneously. +It is based on a wavelet function, which is a small, localized wave-like function, +that is stretched or compressed and shifted across the signal. +The shifted and stretched version of a mother wavelet function +:math:`\psi \in \mathcal{L}_2(\mathbb{R})` is defined by :math:`\psi^{a,b}(t)`, +where :math:`a\in\mathbb{R}\setminus\{0\}` and :math:`b\in\mathbb{R}` +and :math:`\mathcal{L}_2` is a Hilbert space (complete linear space with scalar product), as: .. math:: \psi^{a,b}(t) := |a|^{-\frac{1}{2}}\,\psi\left(\frac{t-b}{a}\right) @@ -17,41 +28,85 @@ The CWT of a signal :math:`x\in\mathcal{L}_2(\mathbb{R})` is defined as: .. math:: \mathcal{W}_x(a,b) = \langle x,\psi^{a,b} \rangle = |a|^{-\frac{1}{2}}\int_{-\infty}^{\infty} x(t) \, \psi^*\left(\frac{t-b}{a}\right)\,dt -where :math:`\psi^*` denotes the complex conjugate of :math:`\psi` and :math:`\langle\cdot,\cdot\rangle` the scalar product of two functions. The CWT essentially provides a time-scale representation of the signal, revealing information about its frequency content at different time points. +where :math:`\psi^*` denotes the complex conjugate of :math:`\psi` +and :math:`\langle\cdot,\cdot\rangle` the scalar product of two functions. +The CWT essentially provides a time-scale representation of the signal, +revealing information about its frequency content at different time points. -According to :cite:`mertins2020signaltheorie`, the Fourier transform :math:`\Psi_{a,b}` of the wavelet :math:`\psi_{a,b}` shifted in time and frequency can serve as an alternative definition of the CWT. The Fourier transform is directly derived from the properties of the Fourier Transform regarding time shifting and amplitude modulation: +According to :cite:`mertins2020signaltheorie`, +the Fourier transform :math:`\Psi_{a,b}` of the wavelet :math:`\psi_{a,b}` shifted in time and +frequency can serve as an alternative definition of the CWT. +The Fourier transform is directly derived from the properties of +the Fourier Transform regarding time shifting and amplitude modulation: .. math:: \Psi_{a,b}(\omega) = |a|^{\frac{1}{2}}\,\text{e}^{-\text{i}\omega b}\,\Psi(\omega)\, -where :math:`\Psi` denotes the Fourier transform of the mother wavelet :math:`\psi`, :math:`\text{i}` denotes the imaginary unit and :math:`\omega` the frequency of the signal. Consequently, the CWT :math:\mathcal{W}_x` of a signal :math:`x` can be defined as the inverse Fourier transformation, as described in :cite:`mertins2020signaltheorie`: +where :math:`\Psi` denotes the Fourier transform of the mother wavelet :math:`\psi`, :math:`\text{i}` +denotes the imaginary unit and :math:`\omega` the frequency of the signal. +Consequently, the CWT :math:\mathcal{W}_x` of a signal :math:`x` can be defined as the inverse Fourier transformation, +as described in :cite:`mertins2020signaltheorie`: .. math:: \mathcal{W}_x(a,b)=\frac{1}{2\pi}\langle X,\Psi_{a,b}\rangle=\frac{|a|^\frac{1}{2}}{2\pi}\int_{-\infty}^{\infty}X(\omega)\Psi^*(a\omega)\,\text{e}^{\text{i}\omega b}\,\text{d}\omega -where :math:`X` denotes the Fourier transform of the signal :math:`x`. This mathematical representation can be used for implementing the CWT. +where :math:`X` denotes the Fourier transform of the signal :math:`x`. +This mathematical representation can be used for implementing the CWT. Time-Scale Analysis with the CWT -------------------------------- -The CWT introduces the concept of scale alongside time, allowing for a scalable analysis of the signal. By varying the scale parameter :math:`a`, the CWT provides information about frequency characteristics around :math:`t=b`. This property makes the CWT particularly suitable for analyzing high-frequency components of signals concerning time. Additionally, the resolution in time and frequency is dependent on the scale parameter :math:`a`, with smaller :math:`|a|` yielding finer time resolution and larger :math:`|a|` providing better frequency resolution. - -In digital signal processing, signals are discrete, necessitating considerations for implementing the CWT. The CWT is inherently continuous, but numerical approximations are employed for computation. Unlike the Discrete Wavelet Transform, which operates on discrete time steps and scales, CWT offers a near-continuous analysis. This is achieved using methods like the FFT for efficient computation in the frequency domain. - -To use continuous wavelets effectively for audio signal analysis, certain criteria must be met. Wavelets should be mean-free and satisfy admissibility conditions ensuring signal energy normalization and invertibility. Commonly used wavelets such as the Morlet and Mexican-Hat wavelets are preferred for their properties in time-frequency representation. The choice of wavelet impacts the trade-off between time and frequency resolution, with different wavelets offering advantages in specific applications. +The CWT introduces the concept of scale alongside time, +allowing for a scalable analysis of the signal. +By varying the scale parameter :math:`a`, +the CWT provides information about frequency characteristics around :math:`t=b`. +This property makes the CWT particularly suitable for analyzing high-frequency components of signals concerning time. +Additionally, the resolution in time and frequency is dependent on the scale parameter :math:`a`, +with smaller :math:`|a|` yielding finer time resolution +and larger :math:`|a|` providing better frequency resolution. + +In digital signal processing, signals are discrete, necessitating considerations for implementing the CWT. +The CWT is inherently continuous, +but numerical approximations are employed for computation. +Unlike the Discrete Wavelet Transform, which operates on discrete time steps and scales, +CWT offers a near-continuous analysis. +This is achieved using methods like the FFT for efficient computation in the frequency domain. + +To use continuous wavelets effectively for audio signal analysis, certain criteria must be met. +Wavelets should be mean-free and satisfy +admissibility conditions ensuring signal energy normalization and invertibility. +Commonly used wavelets such as the Morlet and Mexican-Hat +wavelets are preferred for their properties in time-frequency representation. +The choice of wavelet impacts the trade-off between time and +frequency resolution, with different wavelets offering advantages in specific applications. **Key Points**: -* The CWT is based on a wavelet function, denoted as :math:`\psi(t)`. This function is scaled and shifted to create a family of wavelets :math:`\psi^{a,b}`, where :math:`a` represents the scale parameter and :math:`b` represents the translation parameter. +* The CWT is based on a wavelet function, denoted as :math:`\psi(t)`. + This function is scaled and shifted to create a family of wavelets :math:`\psi^{a,b}`, + where :math:`a` represents the scale parameter and :math:`b` represents the translation parameter. -* CWT Formula: The CWT of a signal :math:`x(t)` with respect to a wavelet :math:`\psi^{a,b}` is given by the inner product of the signal and the translated/scaled wavelet. +* CWT Formula: + The CWT of a signal :math:`x(t)` with respect to a wavelet :math:`\psi^{a,b}` + is given by the inner product of the signal and the translated/scaled wavelet. -* Interpretation: The CWT represents the coefficients of a series expansion of the signal in terms of wavelets. This allows the signal to be reconstructed from a weighted superposition of the wavelets. +* Interpretation: + The CWT represents the coefficients of a series expansion of the signal in terms of wavelets. + This allows the signal to be reconstructed from a weighted superposition of the wavelets. -* Properties: The wavelet function :math:`\psi` must satisfy certain conditions, such as being admissible, which ensures that the CWT can accurately represent the signal without loss of information. +* Properties: + The wavelet function :math:`\psi` must satisfy certain conditions, such as being admissible, + which ensures that the CWT can accurately represent the signal without loss of information. -* Time-Scale Analysis: One significant aspect of CWT is its ability to analyze signals in both time and scale (or frequency) domains simultaneously. By varying the scale parameter, the CWT can provide information about frequency content at different time points in the signal. +* Time-Scale Analysis: + One significant aspect of CWT is its ability to analyze signals + in both time and scale (or frequency) domains simultaneously. + By varying the scale parameter, + the CWT can provide information about frequency content at different time points in the signal. -* Implementation Considerations: Implementing CWT requires discretizing the scales and performing convolutions. Efficient algorithms, such as Fast Fourier Transform (FFT), are often utilized for numerical computations. +* Implementation Considerations: + Implementing CWT requires discretizing the scales and performing convolutions. + Efficient algorithms, such as Fast Fourier Transform (FFT), + are often utilized for numerical computations. Bibliography diff --git a/docs/requirements.txt b/docs/requirements.txt index 5da931ca..04de3642 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,3 @@ ptwt sphinx-book-theme -sphinxcontrib-bibtex \ No newline at end of file +sphinxcontrib-bibtex diff --git a/noxfile.py b/noxfile.py index 7fc71c8b..bae32d5a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -35,7 +35,7 @@ def lint(session): session.run("flake8", "src", "tests", "noxfile.py") session.install("sphinx", "doc8") - session.run("doc8", "docs/") + session.run("doc8", "--max-line-length", "120", "docs/") @nox.session(name="typing") From ca554db88abf45f50a95333ae98fef500d18cac4 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Tue, 13 Feb 2024 13:33:28 +0100 Subject: [PATCH 38/39] extend docs. --- docs/intro.rst | 4 ++++ docs/intro_cwt.rst | 2 ++ src/ptwt/conv_transform.py | 3 ++- src/ptwt/conv_transform_2.py | 29 ++++++++++++++++++++++++----- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index d971eb79..58d33422 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -59,6 +59,10 @@ The matrix nature of these operators explains the capital boldface notation. Coefficient subscripts record the path that leads to a particular coefficient. :py:meth:`ptwt.packets.WaveletPacket` provides this functionality for single dimensional inputs. +.. _sec-fwt-2d: + +The two-dimensional transform +----------------------------- This toolbox provides two dimensional input processing functionality. We construct filter quadruples from the original filter pairs to process two-dimensional inputs. diff --git a/docs/intro_cwt.rst b/docs/intro_cwt.rst index c2b17a0c..c28e3aec 100644 --- a/docs/intro_cwt.rst +++ b/docs/intro_cwt.rst @@ -1,3 +1,5 @@ +.. _sec-cwt: + Introduction to continuous wavelet transforms ============================================= diff --git a/src/ptwt/conv_transform.py b/src/ptwt/conv_transform.py index 1b079d5f..a90e1ed6 100644 --- a/src/ptwt/conv_transform.py +++ b/src/ptwt/conv_transform.py @@ -279,6 +279,7 @@ def wavedec( the convolution filter, with :math:`k \in {A, D}`, where :math:`A` for approximation and :math:`D` for detail. The processes uses approximation coefficients as inputs for higher scales. + Set the `level` argument to choose the largest scale. Args: data (torch.Tensor): The input time series, @@ -299,7 +300,7 @@ def wavedec( Returns: list: A list:: - [cA_n, cD_n, cD_n-1, …, cD2, cD1] + [cA_s, cD_s, cD_s-1, …, cD2, cD1] containing the wavelet coefficients. A denotes approximation and D detail coefficients. diff --git a/src/ptwt/conv_transform_2.py b/src/ptwt/conv_transform_2.py index a017d7e5..ca987cb7 100644 --- a/src/ptwt/conv_transform_2.py +++ b/src/ptwt/conv_transform_2.py @@ -132,10 +132,25 @@ def wavedec2( level: Optional[int] = None, axes: Tuple[int, int] = (-2, -1), ) -> List[Union[torch.Tensor, Tuple[torch.Tensor, torch.Tensor, torch.Tensor]]]: - """Run a two-dimensional wavelet transformation. + r"""Run a two-dimensional wavelet transformation. This function relies on two-dimensional convolutions. - We transform the last two axes by default. + Outer products allow the construction of 2D-filters from 1D filter arrays + :ref:`(see fwt-intro) `. + It transforms the last two axes by default. + This function computes + + .. math:: + \mathbf{x}_s *_2 \mathbf{h}_k = \mathbf{c}_{k, s+1} + + with :math:`k \in [a, h, v, d]` and + :math:`s \in \mathbb{N}_0` the set of natural numbers, + where :math:`\mathbf{x}_0` is equal to + the original input image :math:`\mathbf{X}`. + :math:`*_2` indicates two dimensional-convolution. + Computations at subsequent scales work exclusively with + approximation coefficients :math:`c_{a, s}` + as inputs. Setting the `level` argument allows choosing the largest scale. Args: data (torch.Tensor): The input data tensor with any number of dimensions. @@ -158,7 +173,7 @@ def wavedec2( list: A list containing the wavelet coefficients. The coefficients are in pywt order. That is:: - [cAn, (cHn, cVn, cDn), … (cH1, cV1, cD1)] . + [cAs, (cHs, cVs, cDs), … (cH1, cV1, cD1)] . A denotes approximation, H horizontal, V vertical and D diagonal coefficients. @@ -230,11 +245,14 @@ def waverec2( ) -> torch.Tensor: """Reconstruct a signal from wavelet coefficients. + This function undoes the effect of the analysis + or forward transform by running transposed convolutions. + Args: coeffs (list): The wavelet coefficient list produced by wavedec2. The coefficients must be in pywt order. That is:: - [cAn, (cHn, cVn, cDn), … (cH1, cV1, cD1)] . + [cAs, (cHs, cVs, cDs), … (cH1, cV1, cD1)] . A denotes approximation, H horizontal, V vertical, and D diagonal coefficients. @@ -244,7 +262,8 @@ def waverec2( last two. Defaults to (-2, -1). Returns: - torch.Tensor: The reconstructed signal of shape ``[batch, height, width]`` or + torch.Tensor: + The reconstructed signal of shape ``[batch, height, width]`` or ``[batch, channel, height, width]`` depending on the input to `wavedec2`. Raises: From 2cdd64cbe0ea4a2c00f898d14c50bdbfed725c38 Mon Sep 17 00:00:00 2001 From: Moritz Wolter Date: Fri, 22 Mar 2024 17:35:58 +0100 Subject: [PATCH 39/39] revert citation until jmlr not officially accpeted. --- CITATION.bib | 24 ++++++++++++++++++------ docs/index.rst | 24 ++++++++++++++++++------ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CITATION.bib b/CITATION.bib index d0fe10e9..2a0e29fc 100644 --- a/CITATION.bib +++ b/CITATION.bib @@ -1,6 +1,18 @@ -@article{ptwt_2023, - author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, - title = {ptwt - The PyTorch Wavelet Toolbox}, - journal = {Journal of Machine Learning Research}, - year = {2023} - } \ No newline at end of file +@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} +} + +@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} +} \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 27c7e0e6..4f3e7b11 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -29,12 +29,24 @@ If you use this work in a scientific context, please cite the following thesis: .. code-block:: - @article{ptwt_2023, - author = {Wolter, Moritz and Blanke, Felix and Garcke, Jochen and Hoyt, Charles Tapley}, - title = {{ptwt - The PyTorch Wavelet Toolbox}}, - journal = {Journal of Machine Learning Research}, - year = {2023} - } + @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} + } + + @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} + } .. toctree:: :hidden: