1==============================
2PyWavelets 1.0.0 Release Notes
3==============================
4
5.. contents::
6
7We are very pleased to announce the release of PyWavelets 1.0.  We view this
8version number as a milestone in the project's now more than a decade long
9history.  It reflects that PyWavelets has stabilized over the past few years,
10and is now a mature package which a lot of other important packages depend on.
11A listing of those package won't be complete, but some we are aware of are:
12
13- `scikit-image <https://scikit-image.org>`_ - image processing in Python
14- `imagehash <https://github.com/JohannesBuchner/imagehash>`_ - perceptual image hashing
15- `pyradiomics <https://github.com/Radiomics/pyradiomics>`_ - extraction of Radiomics features from 2D and 3D images and binary masks
16- `tomopy <https://github.com/tomopy/tomopy>`_ - Tomographic Reconstruction in Python
17- `SpikeSort <https://github.com/btel/SpikeSort>`_ - Spike sorting library implemented in Python/NumPy/PyTables
18- `ODL <https://github.com/odlgroup/odl>`_ - operator discretization library
19
20This release requires Python 2.7 or >=3.5 and NumPy 1.9.1 or greater.
21The 1.0 release will be the last release supporting Python 2.7.  It will be a
22Long Term Support (LTS) release, meaning that we will backport critical bug
23fixes to 1.0.x for as long as Python itself does so (i.e. until 1 Jan 2020).
24
25
26New features
27============
28
29New 1D test signals
30-------------------
31Many common synthetic 1D test signals have been implemented in the new
32function ``pywt.data.demo_signals`` to encourage reproducible research. To get
33a list of the available signals, call ``pywt.data.demo_signals('list')``.
34These signals have been validated to match the test signals of the same name
35from the `Wavelab <https://statweb.stanford.edu/~wavelab>`_ toolbox (with the
36kind permission of Dr. David Donoho).
37
38C99 complex support
39-------------------
40The Cython modules and underlying C library can now be built with C99 complex
41support when supported by the compiler. Doing so improves performance when
42running wavelet transforms on complex-valued data. On POSIX systems
43(Linux, Mac OS X), C99 complex support is enabled by default at build time.
44The user can set the environment variable ``USE_C99_COMPLEX`` to 0 or 1 to
45manually disable or enable C99 support at compile time.
46
47complex-valued CWT
48------------------
49The continuous wavelet transform, ``cwt``, now also accepts complex-valued
50data.
51
52More flexible specification of some continuous wavelets
53-------------------------------------------------------
54The continous wavelets ``"cmor"``, ``"shan"`` and ``"fbsp"`` now let the user
55specify attributes such as their center frequency and bandwidth that were
56previously fixed. See more on this in the section on deprecated features.
57
58Fully Separable Discrete Wavelet Transfrom
59------------------------------------------
60A new variant of the multilevel n-dimensional DWT has been implemented. It is
61known as the fully separable wavelet transform (FSWT). The functions
62``fswavedecn`` ``fswaverecn`` correspond to the forward and inverse transforms,
63respectively. This differs from the existing ``wavedecn`` and ``waverecn`` in
64dimensions >= 2 in that all levels of decomposition are performed along a
65single axis prior to moving on to the next.
66
67New thresholding methods
68------------------------
69``pywt.threshold`` now supports non-negative Garotte thresholding
70(``mode='garotte'``).  There is also a new function ``pywt.threshold_firm``
71that implements firm (semi-soft) thresholding. Both of the these new
72thresholding methods are intermediate between soft and hard thresholding.
73
74New anti-symmetric boundary modes
75---------------------------------
76Two new boundary handling modes for the discrete wavelet transforms have been
77implemented. These correspond to whole-sample and half-sample anti-symmetric
78boundary conditions (``antisymmetric`` and ``antireflect``).
79
80New functions to ravel and unravel wavedecn coefficients
81--------------------------------------------------------
82The function ``ravel_coeffs`` can be used to ravel all coefficients from
83``wavedec``, ``wavedec2`` or ``wavedecn`` into a single 1D array. Unraveling
84back into a list of individual n-dimensional coefficients can be performed by
85``unravel_coeffs``.
86
87New functions to determine multilevel DWT coefficient shapes and sizes
88----------------------------------------------------------------------
89The new function ``wavedecn_size`` outputs the total number of coefficients
90that will be produced by a ``wavedecn`` decomposition. The function
91``wavedecn_shapes`` returns full shape information for all coefficient arrays
92produced by ``wavedecn``. These functions provide the size/shape information
93without having to explicitly compute a transform.
94
95Deprecated features
96===================
97
98The continous wavelets with names ``"cmor"``, ``"shan"`` and ``"fbsp"``
99should now be modified to include formerly hard-coded attributes such as their
100center frequency and bandwidth. Use of the bare names "cmor". "shan" and
101"fbsp"  is now deprecated. For "cmor" (and "shan"), the form of the wavelet
102name is now "cmorB-C" ("shanB-C") where B and C are floats representing the
103bandwidth frequency and center frequency. For "fbsp" the form should now
104incorporate three floats as in "fbspM-B-C" where M is the spline order and B
105and C are the bandwidth and center frequencies.
106
107
108Backwards incompatible changes
109==============================
110
111Python 2.6, 3.3 and 3.4 are no longer supported.
112
113The order of coefficients returned by ``swt2`` and input to ``iswt2`` have been
114reversed so that the decomposition levels are now returned in descending rather
115than ascending order. This makes these 2D stationary wavelet functions
116consistent with all of the other multilevel discrete transforms in PyWavelets.
117
118For ``wavedec``, ``wavedec2`` and ``wavedecn``, the ability for the user to
119specify a ``level`` that is greater than the value returned by
120``dwt_max_level``  has been restored. A ``UserWarning`` is raised instead of a
121``ValueError`` in this case.
122
123Bugs Fixed
124==========
125
126Assigning new data to the ``Node`` or ``Node2D`` no longer forces a cast to
127``float64`` when the data is one of the other dtypes supported by the dwt
128(``float32``, ``complex64``, ``complex128``).
129
130Calling ``pywt.threshold`` with ``mode='soft'`` now works properly for
131complex-valued inputs.
132
133A segfault when running multiple `swt2` or `swtn` transforms concurrently has
134been fixed.
135
136Several instances of deprecated numpy multi-indexing that caused warnings in
137numpy >=1.15 have been resolved.
138
139The 2d inverse stationary wavelet transform, `iswt2`, now supports non-square
140inputs (an unnecessary check for square inputs was removed).
141
142Wavelet packets no longer convert float32 to float64 upon assignment to nodes.
143
144Doctests have been updated to also work with NumPy >= 1.14,
145
146Indexing conventions have been updated to avoid FutureWarnings in NumPy 1.15.
147
148
149Other changes
150=============
151
152Python 3.7 is now officially supported.
153
154
155Authors
156=======
157
158* 0-tree +
159* Jacopo Antonello +
160* Matthew Brett +
161* Saket Choudhary +
162* Michael V. DePalatis +
163* Daniel Goertzen +
164* Ralf Gommers
165* Mark Harfouche +
166* John Kirkham +
167* Dawid Laszuk +
168* Gregory R. Lee
169* Michel Pelletier +
170* Balint Reczey +
171* SylvainLan +
172* Daniele Tricoli
173* Kai Wohlfahrt
174
175A total of 16 people contributed to this release.
176People with a "+" by their names contributed a patch for the first time.
177This list of names is automatically generated, and may not be fully complete.
178
179
180Issues closed for v1.0.0
181------------------------
182
183The following 15 issues were closed for this release.
184
185* `#405 <https://github.com/PyWavelets/pywt/issues/405>`__: New warning appearing
186* `#397 <https://github.com/PyWavelets/pywt/issues/397>`__: Make pip install work if numpy is not yet installed
187* `#396 <https://github.com/PyWavelets/pywt/issues/396>`__: Allow more levels in wavedec
188* `#386 <https://github.com/PyWavelets/pywt/issues/386>`__: Improve documentation for cwt
189* `#396 <https://github.com/PyWavelets/pywt/issues/396>`__: Allow more levels in wavedec
190* `#368 <https://github.com/PyWavelets/pywt/issues/368>`__: Bug in ISWT2 for non-rectangular arrays
191* `#363 <https://github.com/PyWavelets/pywt/issues/363>`__: Crash threading swt2
192* `#357 <https://github.com/PyWavelets/pywt/issues/357>`__: reconstruction from array_to_coeff and waverec
193* `#352 <https://github.com/PyWavelets/pywt/issues/352>`__: FYI: PyWavelet does not correctly declare setup.py dependency...
194* `#338 <https://github.com/PyWavelets/pywt/issues/338>`__: upcoef - TypeError: No matching signature found
195* `#335 <https://github.com/PyWavelets/pywt/issues/335>`__: Build issue: PyWavelets does not install from sdist
196* `#333 <https://github.com/PyWavelets/pywt/issues/333>`__: user-friendly error messages regarding discrete vs. continuous...
197* `#326 <https://github.com/PyWavelets/pywt/issues/326>`__: Allow complex dtype of input
198* `#316 <https://github.com/PyWavelets/pywt/issues/316>`__: Test fail in some architectures
199* `#312 <https://github.com/PyWavelets/pywt/issues/312>`__: Documentation should suggest using the default conda channel
200* `#308 <https://github.com/PyWavelets/pywt/issues/308>`__: incorporate bandwidths into CWT wavelet names for families `cmor`,...
201* `#306 <https://github.com/PyWavelets/pywt/issues/306>`__: dwt_max_levels not enough documentation
202* `#302 <https://github.com/PyWavelets/pywt/issues/302>`__: Can't remove cA and then reconstruct
203* `#290 <https://github.com/PyWavelets/pywt/issues/290>`__: idwtn should treat coefficients set to None as zeros
204* `#288 <https://github.com/PyWavelets/pywt/issues/288>`__: RuntimeErrors and segfaults from swt2() in threaded environments
205
206Pull requests for v1.0.0
207------------------------
208
209A total of 53 pull requests were merged for this release.
210
211* `#248 <https://github.com/PyWavelets/pywt/pull/248>`__: DOC: sync PyWavelets main descriptions.
212* `#249 <https://github.com/PyWavelets/pywt/pull/249>`__: Add pyqtgraph demo for plotting wavelets
213* `#254 <https://github.com/PyWavelets/pywt/pull/254>`__: DOC: fix rendering of wavelist docstring
214* `#255 <https://github.com/PyWavelets/pywt/pull/255>`__: ENH: improve iswt performance
215* `#256 <https://github.com/PyWavelets/pywt/pull/256>`__: ENH: add iswtn (n-dimensional inverse SWT)
216* `#257 <https://github.com/PyWavelets/pywt/pull/257>`__: s/addional/additional/
217* `#260 <https://github.com/PyWavelets/pywt/pull/260>`__: TST: test OS X build on TravisCI. Closes gh-75.
218* `#262 <https://github.com/PyWavelets/pywt/pull/262>`__: avoid some compiler warnings
219* `#263 <https://github.com/PyWavelets/pywt/pull/263>`__: MAINT: better exception message for Wavelet('continuous_familyname')
220* `#264 <https://github.com/PyWavelets/pywt/pull/264>`__: add ASV (continued)
221* `#265 <https://github.com/PyWavelets/pywt/pull/265>`__: MAINT: fix more compiler warnings
222* `#269 <https://github.com/PyWavelets/pywt/pull/269>`__: allow string input in dwt_max_level
223* `#270 <https://github.com/PyWavelets/pywt/pull/270>`__: DOC: update ISWT documentation
224* `#272 <https://github.com/PyWavelets/pywt/pull/272>`__: allow separate wavelet/mode for each axis in routines based on...
225* `#273 <https://github.com/PyWavelets/pywt/pull/273>`__: fix non-integer index error
226* `#275 <https://github.com/PyWavelets/pywt/pull/275>`__: ENH: use single precision routines for half-precision inputs
227* `#276 <https://github.com/PyWavelets/pywt/pull/276>`__: update wp_scalogram demo work with matplotlib 2.0
228* `#285 <https://github.com/PyWavelets/pywt/pull/285>`__: Fix spelling typo
229* `#286 <https://github.com/PyWavelets/pywt/pull/286>`__: MAINT: Package the license file
230* `#291 <https://github.com/PyWavelets/pywt/pull/291>`__: idwtn should allow coefficients to be set as None
231* `#292 <https://github.com/PyWavelets/pywt/pull/292>`__: MAINT: ensure tests are included in wheels
232* `#294 <https://github.com/PyWavelets/pywt/pull/294>`__: FIX: shape adjustment in waverec should not assume a transform...
233* `#299 <https://github.com/PyWavelets/pywt/pull/299>`__: DOC: update outdated scipy-user email address
234* `#300 <https://github.com/PyWavelets/pywt/pull/300>`__: ENH: compiling with C99 support (non-MSVC only)
235* `#303 <https://github.com/PyWavelets/pywt/pull/303>`__: DOC: better document how to handle omitted coefficients in multilevel...
236* `#309 <https://github.com/PyWavelets/pywt/pull/309>`__: Document how max levels are determined for multilevel DWT and...
237* `#310 <https://github.com/PyWavelets/pywt/pull/310>`__: parse CWT wavelet names for parameters
238* `#314 <https://github.com/PyWavelets/pywt/pull/314>`__: TST: Explicity align data records in test_byte_offset()
239* `#317 <https://github.com/PyWavelets/pywt/pull/317>`__: TST: specify rtol and atol for assert_allclose calls in test_swt_decomposition
240* `#320 <https://github.com/PyWavelets/pywt/pull/320>`__: Suggest using default conda channel to install
241* `#321 <https://github.com/PyWavelets/pywt/pull/321>`__: BLD: add pyproject.toml file (PEP 518 support).
242* `#322 <https://github.com/PyWavelets/pywt/pull/322>`__: support soft thresholding of complex valued data
243* `#331 <https://github.com/PyWavelets/pywt/pull/331>`__: Rename to CONTRIBUTING.rst
244* `#337 <https://github.com/PyWavelets/pywt/pull/337>`__: provide a more helpful error message for wrong wavelet type
245* `#339 <https://github.com/PyWavelets/pywt/pull/339>`__: check for wrong number of dimensions in upcoef and downcoef
246* `#340 <https://github.com/PyWavelets/pywt/pull/340>`__: DOC: fix broken link to Airspeed Velocity documentation
247* `#344 <https://github.com/PyWavelets/pywt/pull/344>`__: force legacy numpy repr for doctests
248* `#349 <https://github.com/PyWavelets/pywt/pull/349>`__: test case for CWT with complex input
249* `#350 <https://github.com/PyWavelets/pywt/pull/350>`__: better document the size requirements for swt/swt2/swtn
250* `#351 <https://github.com/PyWavelets/pywt/pull/351>`__: Add two new antisymmetric edge modes
251* `#353 <https://github.com/PyWavelets/pywt/pull/353>`__: DOC: add citation info to the front page of the docs.
252* `#354 <https://github.com/PyWavelets/pywt/pull/354>`__: add firm (semi-soft) and non-negative garotte thresholding
253* `#355 <https://github.com/PyWavelets/pywt/pull/355>`__: swt(): inference of level=None to depend on axis
254* `#356 <https://github.com/PyWavelets/pywt/pull/356>`__: fix: default level in `wavedec2` and `wavedecn` can be too conservative
255* `#360 <https://github.com/PyWavelets/pywt/pull/360>`__: fix Continuous spelling
256* `#361 <https://github.com/PyWavelets/pywt/pull/361>`__: AttributeError when using coeffs_to_array
257* `#362 <https://github.com/PyWavelets/pywt/pull/362>`__: Fix spelling of continuous globally
258* `#364 <https://github.com/PyWavelets/pywt/pull/364>`__: DOC: Explicitly print wavelet name for invalid wavelets
259* `#367 <https://github.com/PyWavelets/pywt/pull/367>`__: fix segfault related to parallel SWT
260* `#369 <https://github.com/PyWavelets/pywt/pull/369>`__: remove iswt2's restriction on non-square inputs
261* `#376 <https://github.com/PyWavelets/pywt/pull/376>`__: add common 1d synthetic signals
262* `#377 <https://github.com/PyWavelets/pywt/pull/377>`__: minor update to demo_signals
263* `#378 <https://github.com/PyWavelets/pywt/pull/378>`__: numpy: 1.15 multiindexing warning. targetted fix
264* `#380 <https://github.com/PyWavelets/pywt/pull/380>`__: BLD: fix doc build on ReadTheDocs, need matplotlib for plots...
265* `#381 <https://github.com/PyWavelets/pywt/pull/381>`__: Fix corner case for small scales in CWT
266* `#382 <https://github.com/PyWavelets/pywt/pull/382>`__: avoid FutureWarnings related to multiindexing in Numpy1.15
267* `#383 <https://github.com/PyWavelets/pywt/pull/383>`__: adding Community guidelines
268* `#384 <https://github.com/PyWavelets/pywt/pull/384>`__: swap swt2 coefficient order (and remove FutureWarnings)
269* `#387 <https://github.com/PyWavelets/pywt/pull/387>`__: improve CWT docs
270* `#390 <https://github.com/PyWavelets/pywt/pull/390>`__: MAINT: update Python version support. Closes gh-385.
271* `#391 <https://github.com/PyWavelets/pywt/pull/391>`__: fix broken link in documentation
272* `#392 <https://github.com/PyWavelets/pywt/pull/392>`__: do not force float64 dtype on assignment to Node, Node2D
273* `#398 <https://github.com/PyWavelets/pywt/pull/398>`__: MAINT: update .gitignore for files generated during build.
274* `#401 <https://github.com/PyWavelets/pywt/pull/401>`__: Fix failing numpy 1.9.3 build on Travis CI
275* `#403 <https://github.com/PyWavelets/pywt/pull/403>`__: Change ValueError to UserWarning when level is > dwt_max_level
276* `#404 <https://github.com/PyWavelets/pywt/pull/404>`__: BLD: fix ReadTheDocs build. Outdated NumPy gave a conflict with MPL.
277* `#410 <https://github.com/PyWavelets/pywt/pull/410>`__: DOC: rewrite docs front page
278* `#413 <https://github.com/PyWavelets/pywt/pull/413>`__: add wavelets.pybytes.com disclaimer
279