Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
151 commits
Select commit Hold shift + click to select a range
b8be637
WIP: ENH: fft: array API support [Design 4]
lucascolley Jul 16, 2023
96dec74
MAINT: use npbasic instead of pfft
lucascolley Jul 18, 2023
cfc5265
ENH: xp for `init_nd_shape_and_axes`
lucascolley Jul 18, 2023
c27b516
ENH: `xp` and `device` keywords for `fftfreq` and `rfftfreq`
lucascolley Jul 19, 2023
82e84df
TST: `test_identity` in `TestFFT1D`
lucascolley Jul 20, 2023
8e2d9c5
TST: `test_identity` working with cupy
lucascolley Jul 20, 2023
ea0075e
TST: standard fns in `test_numpy.py`
lucascolley Jul 21, 2023
02bf620
ENH: `ValueError`'s in `_basic.py`
lucascolley Jul 21, 2023
c09f1f3
MAINT: `test_numpy.py` renamed to `test_basic.py`
lucascolley Jul 21, 2023
092db64
ENH: `xp` added to `_fftlog.py`
lucascolley Jul 22, 2023
cf5dcdb
MAINT: minor docstring improvements
lucascolley Jul 22, 2023
27dd21d
MAINT: add `.` to error msg
lucascolley Jul 22, 2023
22ffbcb
ENH: `fftfreq` and `rfftfreq` with `device` exception
lucascolley Jul 22, 2023
0eaf77f
MAINT: remove unnecessary imports
lucascolley Jul 22, 2023
1482b8d
MAINT: added keyword args
lucascolley Jul 22, 2023
0964cfb
ENH: change `norm` to correct default value
lucascolley Jul 22, 2023
c90fa5d
MAINT: remove redundant `is not False`
lucascolley Jul 22, 2023
15c398e
ENH: `is_numpy` helper added
lucascolley Jul 24, 2023
bafb6f5
MAINT: remove unnecessary fns from `_fftlog.py`
lucascolley Jul 24, 2023
677f7b1
ENH: use `is_numpy` in `_basic.py`
lucascolley Jul 24, 2023
e39efee
MAINT/TST: fftlog tests switched to `_fftlog_np.py` for now
lucascolley Jul 24, 2023
09ff62c
TST: namespace preservation
lucascolley Jul 24, 2023
4a85dd5
`fftfreq`: `xp=None` and remove exception for `device`
lucascolley Jul 25, 2023
99b8832
MAINT: move `_assert_matching_namespace` to `_array_api.py`
lucascolley Jul 25, 2023
4721ce0
ENH: add `set_assert_allclose`
lucascolley Jul 25, 2023
38b8428
MAINT: remove unnecessary import
lucascolley Jul 25, 2023
6824a77
TST: `test_fft_n` array API compatible
lucascolley Jul 25, 2023
5fd4dad
ENH: `fftfreq` now passing `device` to `xp`
lucascolley Jul 25, 2023
656f747
CI: let some CI run on my fork
lucascolley Jul 25, 2023
3140309
MAINT: remove unnecessary import
lucascolley Jul 27, 2023
147c8c3
CI: stop some worklows on my fork
lucascolley Jul 27, 2023
efbbcbc
TST: `TestNamespaces` added to `test_basic.py`
lucascolley Jul 27, 2023
87c7097
TST: `test_basic.py` now uses `@skip_if_array_api_gpu`
lucascolley Jul 27, 2023
bc5c9c7
TST: `fft1` reverted to `np` version
lucascolley Jul 27, 2023
ea9a157
TST: revert tests with non-standard fns to `@skip_if_array_api`
lucascolley Jul 27, 2023
3c7c883
BUG: fix issues with `sqrt` of `int`s
lucascolley Jul 27, 2023
3eb08cd
BUG: add `dtype=float64` to fix `sqrt` exceptions
lucascolley Jul 27, 2023
d72e485
MAINT: remove erroneous style change
lucascolley Jul 27, 2023
5af7777
MAINT: reduce number of lines for `xp.asarray` calls
lucascolley Jul 27, 2023
7b4b9ce
BUG: fix return structure of `_init_nd_shape_and_axes`
lucascolley Jul 28, 2023
576d764
TST: skip more non-standard fns tests
lucascolley Jul 28, 2023
3bd3155
TST: `Test_init_nd_shape_and_axes` array API compatible
lucascolley Jul 28, 2023
d6f2907
TST: skip more non-standard fns tests
lucascolley Jul 28, 2023
d770a5b
TST: skip some fns only on GPU
lucascolley Jul 28, 2023
fbed725
MAINT: revert `test_dtypes` changes
lucascolley Jul 28, 2023
0764c55
BUG: fix `set_assert_allclose` for `xp=None`
lucascolley Jul 28, 2023
4ff5909
TST: only skip on GPU for `test_axes`
lucascolley Jul 28, 2023
9c4df0e
TST: remove `set_assert_allclose` for fns skipped on GPU
lucascolley Jul 28, 2023
1a210d7
TST: `TestFFTThreadSafe` array API compatible
lucascolley Jul 28, 2023
d7b936a
TST: remove unnecessary GPU skip
lucascolley Jul 28, 2023
f5bc71a
TST: `test_fftlog.py` array API compatible
lucascolley Jul 28, 2023
1a81819
TST: most of `tets_real_transforms.py` array API compatible
lucascolley Jul 29, 2023
fe8fa04
TST: added pytorch case in `set_assert_allclose`
lucascolley Jul 29, 2023
397f9d1
BUG: add `.copy()` to pass pytorch tests
lucascolley Jul 29, 2023
1b7a122
TST/MAINT: use `size` helper from array-api-compat
lucascolley Jul 29, 2023
d3b1d05
TST: add pytorch case for `test_fft_n`
lucascolley Jul 29, 2023
be89ec2
TST: `test_identity` pytorch compatible
lucascolley Jul 29, 2023
94a2da5
TST/BUG: fix dtype issues in `test_hfft`
lucascolley Jul 29, 2023
307a3ed
TST: add missing `xp.asarray`s
lucascolley Jul 29, 2023
c010c7b
TST: `TestFFTThreadSafe` pytorch compatible
lucascolley Jul 29, 2023
7e0a39a
ENH: handle `xp=None` case for `fftfreq` and `rfftfreq`
lucascolley Jul 30, 2023
2e10b49
MAINT: import `size` from `_array_api` instead of `array_api_compat`
lucascolley Jul 30, 2023
43974d8
TST: remove unnecessary skips in `test_multithreading.py`
lucascolley Jul 30, 2023
ec77650
MAINT/TST: use `xp.linalg`
lucascolley Jul 30, 2023
b5cf63c
TST/BUG: revert to `assert_array_almost_equal` in `test_dtypes`
lucascolley Jul 30, 2023
e395a33
TST: change `linalg.norm` to `linalg.vector_norm`
lucascolley Jul 30, 2023
2f0bd40
TST: change `rtol` from `1e-11` to `1e-12`
lucascolley Jul 30, 2023
e597d85
TST: exceptions for unsupported params
lucascolley Jul 30, 2023
4352792
STY: comments cleanup
lucascolley Jul 30, 2023
2484b80
TST: skip tests on `torch` backend where it is incompatible
lucascolley Jul 31, 2023
4626d2c
TST: remove `torch` skips where it breaks with `parametrize`
lucascolley Jul 31, 2023
df80b91
MAINT: move basic docstrings and rename to `uarray`
lucascolley Aug 1, 2023
9112619
MAINT: revert to original order of `basic` functions
lucascolley Aug 1, 2023
fb911bc
MAINT: move docstrings to new file for `helper`
lucascolley Aug 1, 2023
2e6813f
MAINT: use `==` instead of `in`
lucascolley Aug 1, 2023
7c6c2af
TST: change `rtol` to `1e-10` to let `test_identity` pass
lucascolley Aug 1, 2023
42b76e6
TST: skip some multithreading tests for array API
lucascolley Aug 1, 2023
7d71b3e
MAINT: merge `helper` files into one and get docstrings from numpy
lucascolley Aug 1, 2023
ac1141a
MAINT: `realtransforms` move docstrings to new files and rename `np` …
lucascolley Aug 1, 2023
f77b902
MAINT: `fftlog` move docstrings to new file
lucascolley Aug 1, 2023
14c4ecb
TST/STY: `xfails`s for pytorch and modify comments
lucascolley Aug 1, 2023
4e467ac
BUG: correct import location for fht docstrings
lucascolley Aug 1, 2023
f1e63ab
MAINT: change `is_numpy` to just check for the compat version
lucascolley Aug 1, 2023
bd3447f
STY: PEP8 clean-up
lucascolley Aug 1, 2023
c909dfd
BUG: fix circular import issue with `fftlog`
lucascolley Aug 1, 2023
3a1222a
CI: remove workflow comment for my fork
lucascolley Aug 1, 2023
5f45410
Merge branch 'main' into 'fft_array_api'
lucascolley Aug 1, 2023
f7277ed
BUG: avoid `device` for `xp=np` in `fftfreq` and `rfftfreq`
lucascolley Aug 2, 2023
c558d40
TST: adjust tolerance so tests pass
lucascolley Aug 2, 2023
55622bc
TST: make `test_dtypes` array API compatible
lucascolley Aug 2, 2023
e9222cd
TST: add tests for new helper fns
lucascolley Aug 2, 2023
2cb6268
MAINT: comments to explain `uarray` dispatch structure
lucascolley Aug 2, 2023
a097d91
MAINT: use `elif` in `test_helper.py`
lucascolley Aug 2, 2023
49a1676
MAINT: change the use of `xp` in unrelated comments
lucascolley Aug 3, 2023
5466d04
MAINT/TST: avoid extra imports with `xp.testing`
lucascolley Aug 3, 2023
564a9bd
TST: skip `TestFFTThreadSafe` on GPU
lucascolley Aug 5, 2023
46d43e0
Merge branch 'main' into fft_array_api
lucascolley Aug 7, 2023
4168f8c
STY: PEP 257 in `_fftlog_np.py`
lucascolley Aug 8, 2023
4a1faa7
STY: more PEP 257
lucascolley Aug 8, 2023
ad8cbe9
MAINT: use `copy` utility from #19014
lucascolley Aug 10, 2023
08a47dc
Merge branch 'main' into fft_array_api
lucascolley Aug 18, 2023
dbbc1e9
MAINT: move `set_assert_allclose` to `_lib._array_api.py`
lucascolley Aug 24, 2023
e73cf27
MAINT: refactor `_basic.py` with execute helpers
lucascolley Aug 24, 2023
e43b8ba
Merge branch 'main' into fft_array_api
lucascolley Aug 24, 2023
9890300
DOC/MAINT: include example from #19129 in renamed file
lucascolley Aug 29, 2023
6b36494
Merge branch 'main' into fft_array_api
lucascolley Aug 29, 2023
c648e35
TST/MAINT: remove unnecessary `xp_test` and gpu skip
lucascolley Aug 29, 2023
88ae151
MAINT: remove unnecessary `xp_test`
lucascolley Aug 30, 2023
939f723
BUG: fix issue in `_execute_nD` in `_basic.py`
rgommers Sep 1, 2023
98f6d9d
TST: rework 1-D fft/rfft/hfft tests for array API
rgommers Sep 1, 2023
7057899
MAINT: refactor fft `_execute_1D/nD`
rgommers Sep 1, 2023
a889b7d
MAINT: refactor real transforms with `execute` fns
lucascolley Sep 1, 2023
1c12ae7
Merge branch 'main' into fft_array_api
lucascolley Sep 4, 2023
6da65af
TST: replace `xfail`s with skips
lucascolley Sep 4, 2023
2262fbe
Merge branch 'main' into fft_array_api
lucascolley Sep 5, 2023
80f6f8f
MAINT: use `assert_close` and `assert_equal`
lucascolley Sep 5, 2023
7eed157
MAINT: remove `set_assert_allclose`
lucascolley Sep 5, 2023
20cfa33
Merge branch 'main' into fft_array_api
lucascolley Sep 7, 2023
4f5691a
MAINT: remove `_exectute_1D`
lucascolley Sep 8, 2023
c33fae8
TST: remove `skip_if_array_api` markers
lucascolley Sep 8, 2023
527a0a4
STY: clean-up
lucascolley Sep 11, 2023
5ff5615
MAINT: refactor `test_axes_*`
lucascolley Sep 11, 2023
61eceff
ENH: array-agnostic `fftlog`
lucascolley Sep 11, 2023
ee682eb
MAINT: refactor `fftlog` with `from_uarray` parameter
lucascolley Sep 11, 2023
3e70cc4
MAINT/STY: clean-up
lucascolley Sep 11, 2023
a113893
MAINT: remove unnecessary `copy` from `fftlog`
lucascolley Sep 11, 2023
0e2a4d3
MAINT: refactor and clean up `_realtransforms`
lucascolley Sep 11, 2023
283419a
STY: revert `realtransforms` docstring changes
lucascolley Sep 11, 2023
719a7b1
MAINT: remove more unnecessary `copy`s from `realtransforms`
lucascolley Sep 11, 2023
dee321b
STY: lint to 88 char line length
lucascolley Sep 11, 2023
0a2abf8
MAINT: move `fftlog` backend to a separate file
lucascolley Sep 11, 2023
07c6dec
MAINT: import array assertions as future names
lucascolley Sep 11, 2023
17bf785
Merge remote-tracking branch 'upstream/main' into fft_array_api
lucascolley Sep 11, 2023
b0248e2
MAINT: update imports for gh-19186
lucascolley Sep 11, 2023
d3a9d87
TST/MAINT: modify tests to satisfy stricter assertions
lucascolley Sep 12, 2023
5d6de96
MAINT/BUG: refactor to fix custom uarray backends
lucascolley Sep 12, 2023
23bffb7
TST/BUG: check that the mock backend implements the public scipy API
lucascolley Sep 12, 2023
65684db
MAINT: improve comments for `_basic_backend`
lucascolley Sep 14, 2023
ea36a04
MAINT: allow `overwite_x` to be dropped
lucascolley Sep 16, 2023
a158634
MAINT: move singular transform checks to `fhtcoeff`
lucascolley Sep 16, 2023
291b9d7
MAINT: check `device` is `None` when not supported
lucascolley Sep 16, 2023
4eef6be
MAINT: replace slicing with `flip`
lucascolley Sep 16, 2023
5f68e8c
BUG: use `kwargs` in basic backend to be compatible with standard
lucascolley Sep 16, 2023
aed9f82
MAINT: revert `_init_nd_shape_and_axes` to returning lists
lucascolley Sep 16, 2023
dda7057
MAINT: lint
lucascolley Sep 16, 2023
5002220
Merge branch 'main' into fft_array_api
rgommers Sep 18, 2023
b7e817a
CI: add scipy.fft to the submodules tested in the array API CI job
rgommers Sep 18, 2023
14cd806
MAINT: update `_init_nd_shape_and_axes` return types and tests
rgommers Sep 18, 2023
6ee7a89
STY: fix linter complaint
rgommers Sep 18, 2023
8994857
DOC: update fftfreq/rfftfreq docs
lucascolley Sep 18, 2023
2befe78
TST: fix fftfreq/rfftfreq tests for torch-cuda
rgommers Sep 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/array_api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,5 +85,6 @@ jobs:
export SCIPY_USE_PROPACK=1
# expand as new modules are added
# --array-api-backend == -b
python dev.py --no-build test -b pytorch -b numpy -b numpy.array_api -s cluster -- --durations 10 --timeout=60
python dev.py --no-build test -b pytorch -b numpy -b numpy.array_api -s cluster -- --durations 3 --timeout=60
python dev.py --no-build test -b pytorch -b numpy -b numpy.array_api -s fft -- --durations 3 --timeout=60
python dev.py --no-build test --array-api-backend all --tests scipy/_lib/tests/test_array_api.py
6 changes: 2 additions & 4 deletions scipy/fft/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,10 @@
rfft, irfft, rfft2, irfft2, rfftn, irfftn,
hfft, ihfft, hfft2, ihfft2, hfftn, ihfftn)
from ._realtransforms import dct, idct, dst, idst, dctn, idctn, dstn, idstn
from ._fftlog import fhtoffset
from ._fftlog_multimethods import fht, ifht
from ._helper import next_fast_len
from ._fftlog import fht, ifht, fhtoffset
from ._helper import next_fast_len, fftfreq, rfftfreq, fftshift, ifftshift
from ._backend import (set_backend, skip_backend, set_global_backend,
register_backend)
from numpy.fft import fftfreq, rfftfreq, fftshift, ifftshift
from ._pocketfft.helper import set_workers, get_workers

__all__ = [
Expand Down
11 changes: 7 additions & 4 deletions scipy/fft/_backend.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import scipy._lib.uarray as ua
from . import _fftlog
from . import _pocketfft
from . import _basic_backend
from . import _realtransforms_backend
from . import _fftlog_backend


class _ScipyBackend:
Expand All @@ -17,9 +18,11 @@ class _ScipyBackend:
@staticmethod
def __ua_function__(method, args, kwargs):

fn = getattr(_pocketfft, method.__name__, None)
fn = getattr(_basic_backend, method.__name__, None)
if fn is None:
fn = getattr(_fftlog, method.__name__, None)
fn = getattr(_realtransforms_backend, method.__name__, None)
if fn is None:
fn = getattr(_fftlog_backend, method.__name__, None)
if fn is None:
return NotImplemented
return fn(*args, **kwargs)
Expand Down
190 changes: 190 additions & 0 deletions scipy/fft/_basic_backend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
from scipy._lib._array_api import array_namespace, is_numpy
from . import _pocketfft
import numpy as np


def arg_err_msg(param):
return f'Providing {param!r} is only supported for numpy arrays.'


def _validate_fft_args(workers, plan, norm):
if workers is not None:
raise ValueError(arg_err_msg("workers"))
if plan is not None:
raise ValueError(arg_err_msg("plan"))
if norm is None:
norm = 'backward'
return norm


def _execute(func_str, pocketfft_func, x, **kwargs):
xp = array_namespace(x)
# pocketfft is used whenever SCIPY_ARRAY_API is not set,
# or x is a NumPy array or array-like.
# When SCIPY_ARRAY_API is set, we try to use xp.fft for CuPy arrays,
# PyTorch arrays and other array API standard supporting objects.
# If xp.fft does not exist, we attempt to convert to np and back to use pocketfft.
if is_numpy(xp):
return pocketfft_func(x, **kwargs)

try:
s = kwargs["n"]
except KeyError:
s = kwargs["s"]
try:
axes = kwargs["axis"]
except KeyError:
axes = kwargs["axes"]
norm = kwargs["norm"]
workers = kwargs["workers"]
plan = kwargs["plan"]

norm = _validate_fft_args(workers, plan, norm)
if hasattr(xp, 'fft'):
xp_func = getattr(xp.fft, func_str)
return xp_func(x, s, axes, norm=norm)

x = np.asarray(x)
y = pocketfft_func(x, s, axes, norm=norm)
return xp.asarray(y)


def fft(x, n=None, axis=-1, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('fft', _pocketfft.fft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def ifft(x, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, *,
plan=None):
return _execute('ifft', _pocketfft.ifft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def rfft(x, n=None, axis=-1, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('rfft', _pocketfft.rfft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def irfft(x, n=None, axis=-1, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('irfft', _pocketfft.irfft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def hfft(x, n=None, axis=-1, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('hfft', _pocketfft.hfft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def ihfft(x, n=None, axis=-1, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('ihfft', _pocketfft.ihfft, x, n=n, axis=axis, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def fftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('fftn', _pocketfft.fftn, x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)



def ifftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('ifftn', _pocketfft.ifftn, x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def fft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.fft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def ifft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.ifft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def rfftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('rfftn', _pocketfft.rfftn, x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def rfft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.rfft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def irfftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
return _execute('irfftn', _pocketfft.irfftn, x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x, workers=workers, plan=plan)


def irfft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.irfft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def hfftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.hfftn(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def hfft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.hfft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def ihfftn(x, s=None, axes=None, norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.ihfftn(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)


def ihfft2(x, s=None, axes=(-2, -1), norm=None,
overwrite_x=False, workers=None, *, plan=None):
xp = array_namespace(x)
x = np.asarray(x)
y = _pocketfft.ihfft2(x, s=s, axes=axes, norm=norm,
overwrite_x=overwrite_x,
workers=workers, plan=plan)
return xp.asarray(y)
Loading