Hi all, Given that a few people were surprised that SciPy master now has a pybind11 dependency and asked if it was discussed on this list (to which I didn't have an immediate answer), replying to this thread with a more explicit subject. On Tue, Jun 11, 2019 at 4:21 AM Ralf Gommers <ralf.gommers@gmail.com> wrote:
On Mon, Jun 10, 2019 at 4:22 PM Peter Bell <PeterBell10@live.co.uk> wrote:
Following on from some of the discussion surrounding my backend proposal and the discussion on gh-10175 <https://github.com/scipy/scipy/issues/10175>; I’ve been working on adding a new scipy.fft submodule. This is now working, tested, documented and ready for review in gh-10238 <https://github.com/scipy/scipy/pull/10238>.
The new submodule is almost a drop-in replacement for numpy.fft and scipy.fftpack, with a few exceptions:
- Does not include NumPy’s Hermitian transforms (hfft, ihfft) (but would be simple to add) - Uses numpy’s conventions for rfft (complex array) instead of fftpack’s (complex values packed into a real array) - Convolutions and pseudo-differential operators from fftpack are not included
The new submodule adds pocketfft to implement the normal FFTs (not yet DCT and DST) which adds several new features beyond scipy.fftpack:
- long double transforms - multi-dimensional real FFTs (rfftn) - Orthonormal transforms (norm=’ortho’ argument) - Bluestein’s algorithm to avoid the worst case O(n^2) complexity of FFTPACK
A few implementation details worth noting:
- Unlike NumPy’s version of pocketfft, this is C++ and uses templates to supporting the different floating point types - pocketfft also uses pybind11 which both adds a new build-time dependency and requires C++11. I believe this is the first use of C++11 in SciPy.
I've looked into this a little more. Compiler support for pybind11 is given in https://github.com/pybind/pybind11#supported-compilers.
MSVC 2015 Update 3 seems compatible with the lowest version we need as far as I can tell (Python 3.5/3.6 require MSVC 14.0 == 2015; the "Update 3" part should be fine).
GCC 4.8 is already the minimum we need today I believe.
Minimum Clang versions needed are from 2013, so that's fine too.
For Intel compilers a version from 2016 is needed. I think we're fine requiring a more recent version of the Intel compilers.
For more exotic platforms, recent enough GCC versions will also do the job. So good to go I think.
So far pybind11 seems to have worked fine, except that it's not yet documented in all our build instructions (there's open PRs for this though, it's just waiting for Matt's larger devdocs overhaul), and that we seem to require a fairly recent version of pybind11. If there's any other missing docs or concerns, please bring them up here. Cheers, Ralf
- pocketfft has optional support for multithreading using OpenMP but this is currently disabled (and not compiled in at all).