
    tf                       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         X/var/www/html/software/conda/envs/higlass/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         N t         j                  j                  u rt        d       t         j                  j                  u rt        d       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's `rfft` doesn't match the NumPy API.z,SciPy's `irfft` doesn't match the NumPy API.2nzGiven unknown `kind` %s.c                p   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      
}|Ct        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   r   r)   r   r5   r   )r   endswithtuplerangendimr   warningswarnDeprecationWarningr#   set
ValueErrornponesr5   	TypeErrorr   chunk_error
map_blocks)r   r   r   _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4::  	QI188I&'1, 	188I;N/O!OPP	Q aD)4y==<4T!WD	qtAt9Dq||HItI6&II  0!&)//0s   4F F54F5r)   c                4    d }||f}d }||f} | ||      S N )r   r$   r   r   r   _funcs        r   rL   zfft_wrap.<locals>.func   s5    A}DDwAt$$r   .r   NN)scipyfftpackr+   r?   r,   __name___out_chunk_fnsrstripKeyErrorr7   inspect	getmodule__doc__fft_preambler
   )	rI   rJ   r5   rL   func_mod	func_namefunc_fullnamerP   rK   s	   ```    @@r   fft_wrapr`   v   s9   < u}})))JKK,,,KLL|  <%dkk$&78+J +JZ }}U		%   *H!!I%%+i7M##qM+;';<(((#DLL1DMKM  <3d:;;<s   )D6 6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_blockre      s<    	AaAEa<AQJAHr   c                    t        |       } t        |      }t        | t        |      }|j                  t        t        | |      S )Nr6   )r5   r$   rc   )intfloat_arangerD   re   r$   rc   r   rd   s       r   fftfreqrk      s9    AAaAv.A<<eqA<>>r   c                r    t        |       } t        |      }t        | dz  dz   t        |      }|| |z  z  }|S )Nr   r   r6   )rg   rh   ri   rj   s       r   rfftfreqrm     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   r9   r:   
isinstancer   shaperg   slicer8   _concatenater#   r   rechunk)	xr   inverseyr   r$   n_2lrd   s	            r   _fftshift_helperry     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   ru   ry   rt   r   s     r   fftshiftr~   .  s    AD%88r   c                    t        | |d      S )NTr{   r|   r}   s     r   	ifftshiftr   3  s    AD$77r   rR   )g      ?auto)NFrN   )4
__future__r   rY   r;   collections.abcr   numpyr@   rS   scipy.fftpackImportErrordask.array.corer   r   rr   dask.array.creationr   ri   dask.array.numpy_compatr   
dask.utilsr	   r
   rC   r\   r   r   r   r%   r(   rV   r`   r)   fft2fftnr*   ifft2ifftnr+   rfft2rfftnr,   irfft2irfftnr-   r.   re   rk   rm   ry   r~   r   rO   r   r   <module>r      s   "   $  $ 7 1 0 1 	, nb rvvzz	"&&--	 	"&&--	  bff? ? bff 6 bff9 9 bff8 8Q	  Es   I I! I!