
    bi                       d dl mZ d dlZd dlZd dlmZ d dlZ	 d dlZd dl	Zd dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d	Zd
Zd Zd Zd Zd Zd ZeeeeeedZddZ eej@                  j@                        Z  eej@                  jB                        Z! eej@                  jD                        Z" eej@                  jF                        Z# eej@                  jH                        Z$ eej@                  jJ                        Z% eej@                  jL                        Z& eej@                  jN                        Z' eej@                  jP                        Z( eej@                  jR                        Z) eej@                  jT                        Z* eej@                  jV                        Z+ eej@                  jX                        Z, eej@                  jZ                        Z-d Z. eej@                        dd       Z/ eej@                        dd       Z0ddZ1 eej@                        dd       Z2 eej@                        dd       Z3y# e
$ r dZY >w xY w)    )annotationsN)Sequence)asarray)concatenate)arange)NUMPY_GE_200)derived_fromskip_doctestzDask array only supports taking an FFT along an axis that 
has a single chunk. An FFT operation was tried on axis %s 
which has chunks %s. To change the array's chunks use dask.Array.rechunk.z
    Wrapping of %s

    The axis along which the FFT is applied must have only one chunk. To change
    the array's chunking use dask.Array.rechunk.

    The %s docstring follows below:

    c                    || j                   S t        | j                         }t        |      D ]  \  }}||   f||<    |S )z*For computing the output chunks of [i]fft*chunkslist	enumerate)asaxesr   iaxiss         I/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/dask/array/fft.py_fft_out_chunksr   '   sH    yxx!((^FT? 4!wtM    c                    ||D cg c]  }| j                   |   d    }}t        |      }|d   dz  dz   |d<   t        | j                         }t        |      D ]  \  }}||   f||<    |S c c}w )z(For computing the output chunks of rfft*r         r   r   r   r   r   r   r   s         r   _rfft_out_chunksr   1   s    y+/04QXXd^A00QAbEQJNAbE!((^FT? 4!wtM 1s   A.c                    |-|D cg c]  }| j                   |   d    }}d|d   dz
  z  |d<   t        | j                         }t        |      D ]  \  }}||   f||<    |S c c}w )z)For computing the output chunks of irfft*r   r   r   r   r   r   s         r   _irfft_out_chunksr   =   sy    y+/04QXXd^A00QrUQY"!((^FT? 4!wtM 1s   A#c                    t        |      dk(  sJ |d   }|d| j                  |   d   dz
  z  g}|d   }t        | j                        }|f||<   |S Nr   r   r   lenr   r   )r   r   r   r   nr   s         r   _hfft_out_chunksr%   H   se    t9>>7Dy!((4.#a'()	!A!((^F4F4LMr   c                    t        |      dk(  sJ |d   }|| j                  |   d   g}nt        |      dk(  sJ |d   }t        | j                        }|dz  dk(  r	|dz  dz   }n|dz   dz  }|f||<   |S r!   r"   )r   r   r   r   r$   r   ms          r   _ihfft_out_chunksr(   W   s    t9>>7DyXXd^A1v{{	!A!((^F1uz!VqLUqL4F4LMr   )fftifftrfftirffthfftihfftc                   	 t         E j                  j                  d      r*|s(t        j                  d j
                   dt                j
                  	 t        j                  d         	d 	fd	}j                  d      r|dfd	}t        j                         } j
                  }|j
                  d	z   |z   } j                  Kt        d
|fz  z  |_        |xj                   j                  z  c_        t!        |j                        |_        ||_        |S # t        $ r t        dz        w xY w)a|  Wrap 1D, 2D, and ND real and complex FFT functions

    Takes a function that behaves like ``numpy.fft`` functions and
    a specified kind to match it to that are named after the functions
    in the ``numpy.fft`` API.

    Supported kinds include:

        * fft
        * fft2
        * fftn
        * ifft
        * ifft2
        * ifftn
        * rfft
        * rfft2
        * rfftn
        * irfft
        * irfft2
        * irfftn
        * hfft
        * ihfft

    Examples
    --------
    >>> import dask.array.fft as dff
    >>> parallel_fft = dff.fft_wrap(np.fft.fft)
    >>> parallel_ifft = dff.fft_wrap(np.fft.ifft)
    zscipy.fftpackz	Function z from `scipy.fftpack` does not match NumPy's API and is considered legacy. Please use `scipy.fft` instead. To suppress this warning and allow usage, set `allow_fftpack=True`. Support for `scipy.fftpack` will be deprecated in future releases.2nzGiven unknown `kind` %s.c                v   t        |       } |j                  d      rd}nj                  d      r_|t        t        | j                              }nlt
        rt        j                  dt               t        t        t        |                  }n.d}n+t        t        |            t        |      k  rt        d      }|Dt        j                  | j                  dz  | j                        }	  |||	      j                  }|D ]>  }t        | j                   |         d
k7  st        t"        || j                   |   fz          | ||      }|||f}j                  d      r|d n|d   }	|d n|d   }
|
|	|f} | j$                  g|||dS # t        $ r  |      j                  }Y w xY w)N2)r   r$   z^DeprecationWarning: `axes` should not be `None` if `s` is not `None` (Deprecated in NumPy 2.0))r   zDuplicate axes not allowed.)   )dtype)r   normr   r)   r   r5   r   )r   endswithtuplerangendimr   warningswarnDeprecationWarningr#   set
ValueErrornponesr5   	TypeErrorr   chunk_error
map_blocks)r   r   r   r6   _dtypesample	each_axisr   argsr   r$   r5   fft_funckindout_chunk_fns              r   funczfft_wrap.<locals>.func   s   AJ<}}S!s#9 qvv/D# M.
 !s1v/D3t9~D	) !>??>WWQVVd]!'':F0!&t$?EE  	QI188I&'1, 	188I;N/O!OPP	Q aD)4==<4T!WD	qtAtT?Dq||HItI6&II  0!&)//0s   4F F87F8r)   c                6    d }||f}d }||f} | |||      S N )r   r$   r   r6   r   r   _funcs         r   rM   zfft_wrap.<locals>.func   s7    A}DDwAtT**r   .r   )NNN)scipy
__module__
startswithr<   r=   __name__FutureWarning_out_chunk_fnsrstripKeyErrorr@   r8   inspect	getmodule__doc__fft_preambler
   )
rJ   rK   r5   allow_fftpackrM   func_mod	func_namefunc_fullnamerQ   rL   s
   ```     @@r   fft_wraprc   v   s?   < ))/:  1 12 38 8
 " |  <%dkk$&78+J +JZ }}U		+   *H!!I%%+i7M##qM+;';<(((#DLL1DMKM  <3d:;;<s    D- -Ec                b    | j                         }|| |dz   dz  k\  xx   |z  cc<   |||z  z  }|S )Nr   r   )copy)r   r$   drs       r   _fftfreq_blockrh      s<    	AaAEa<AQJAHr   c                    t        |       } t        |      }t        | t        |      }|j                  t        t        | |      S )Nr7   )r5   r$   rf   )intfloat_arangerE   rh   r$   rf   r   rg   s       r   fftfreqrn     s9    AAaAv.A<<eqA<>>r   c                r    t        |       } t        |      }t        | dz  dz   t        |      }|| |z  z  }|S )Nr   r   r7   )rj   rk   rl   rm   s       r   rfftfreqrp     s<    AAaAQ
%7AQJAHr   c                2   |t        t        | j                              }nt        |t              s|f}| }|D ]  }|j
                  |   }|t        |du       z   dz  }|j                  t        d       gz  }t        d |      ||<   t        |      }|j                  t        d       gz  }t        |d       ||<   t        |      }t        ||   ||   g|      }t        | j                  |         dk(  s|j                  || j                  |   i      } |S )NFr   )r   r   )r   r:   r;   
isinstancer   shaperj   slicer9   _concatenater#   r   rechunk)	xr   inverseyr   r$   n_2lrg   s	            r   _fftshift_helperr|     s   |E!&&M"h'w	A ,GGAJ3w%'((Q.FFeDk]"T3!!HFFeDk]"S$!!H!A$!A.qxx{q 		1ahhqk*+A," Hr   c                    t        | |d      S )NFr   rx   r|   rw   r   s     r   fftshiftr   6  s    AD%88r   c                    t        | |d      S )NTr~   r   r   s     r   	ifftshiftr   ;  s    AD$77r   )NNF)g      ?auto)NFrO   )4
__future__r   r[   r<   collections.abcr   numpyrA   rS   scipy.fftpackImportErrordask.array.corer   r   ru   dask.array.creationr   rl   dask.array.numpy_compatr   
dask.utilsr	   r
   rD   r^   r   r   r   r%   r(   rX   rc   r)   fft2fftnr*   ifft2ifftnr+   rfft2rfftnr,   irfft2irfftnr-   r.   rh   rn   rp   r|   r   r   rP   r   r   <module>r      s   "   $  $ 7 1 0 1 	, vr rvvzz	"&&--	 	"&&--	  bff? ? bff 6 bff9 9 bff8 8a	  Es   I I! I!