
    uki[                    $   d dl mZ d dlmZ d dlZd dlmZ d dlZd dlZ	d dl
mZ d dl
mZ d dlmZmZmZ d dlmZm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 ddgZ G d dej:                        Zd!dZ ed      d"d       Z d Z!d Z"d Z#d Z$d Z%d Z& ed      d        Z'd Z(d Z)d  Z* ed      Z+e+jY                  e!       e+j[                  e$        ej\                  e+e%        ej^                  e+e)       e*ej`                  e+<   y)#    )annotations)SequenceN)partial)dispatch)dtypes)jitlinear_transposeShapeDtypeStruct)	Primitiveis_constant_shape)ad)batching)mlir)lax)hlofftfft_pc                  &    e Zd ZdZdZ	 dZ	 dZ	 dZy)FftTypez)Describes which FFT operation to perform.r            N)__name__
__module____qualname____doc__FFTIFFTRFFTIRFFT     K/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/jax/_src/lax/fft.pyr   r   '   s%    -	##	
$#	
$ 
% r"   r   c                    | dv rt         j                  S | dv rt         j                  S | dv rt         j                  S | dv rt         j                  S t        d|  d      )N)r   r   )ifftr   )rfftr   )irfftr    zUnknown FFT type '')r   r   r   r   r    
ValueError)ss    r#   _str_to_fft_typer+   7   sb    .;;<<<<==
)!A.
//r"   )r   r   )static_argnumsc                <   t        |t              rt        |      }n"t        |t              r|}nt	        d| d      |t        j
                  k(  r]t        j                  |       rt        d      t        j                  | t        j                  t        j                  |                   } n<t        j                  | t        j                  t        j                  |                   } t        |      dk(  r| S t!        |      }t"        j%                  | ||      S )NzUnknown FFT type value 'r(   z*only real valued inputs supported for rfftr   fft_typefft_lengths)
isinstancestrr+   r   	TypeErrorr   npiscomplexobjr)   r   convert_element_typer   to_inexact_dtypedtypeto_complex_dtypelentupler   bind)xr/   r0   typs       r#   r   r   C   s    #
8
$C(G$
C
.xj:
;;GLL	qCDD  F$;$;FLLO$LMA  F$;$;FLLO$LMAHk"+	A	==r"   c                <    t        j                  t        | ||      S )Nr.   )r   apply_primitiver   )r=   r/   r0   s      r#   	_fft_implrA   X   s    		!	!%X;	WWr"   c                    t        j                  d|       t        j                  dt         j                        z   j                  S )Nr!   )r4   zeros	complex64r8   r8   s    r#   <lambda>rF   [   s+    U 3bhhr2<<6P PWW r"   c                @    t        j                  |       j                  S N)r4   finfor8   rE   s    r#   rF   rF   \   s    BHHUO11 r"   c                   t        |      | j                  kD  rt        d| j                   d| d      |t        j
                  k(  r| j                  t        j                  t        j                  fvrt        d| j                         | j                  t        |       d  |k7  rt        d| j                   d|       | j                  d t        |        |d d z   |d   dz  d	z   fz   }t        | j                        }nZ|t        j                  k(  rt        j                  | j                  t        j                        st        d
| j                         | j                  t        |       d |d d k7  rt        d| j                   d|      | j                  d t        |        |z   }t        | j                        }nt        j                  | j                  t        j                        st        d| j                         | j                  t        |       d  |k7  rt        d| j                   d|       | j                  }| j                  }| j                  ||| j                         S )NzFFT input shape z< must have at least as many input dimensions as fft_lengths .z+RFFT input must be float32 or float64, got zRFFT input shape z/ minor dimensions must be equal to fft_lengths r   r   z1IRFFT input must be complex64 or complex128, got zIRFFT input shape zS minor dimensions must be equal to all except the last fft_length, got fft_lengths=z/FFT input must be complex64 or complex128, got )shaper8   vma)r:   ndimr)   rM   r   r   r8   r4   float32float64_complex_dtyper    
issubdtypecomplexfloating_real_dtypeupdaterN   )r=   r/   r0   rM   r8   s        r#   fft_abstract_evalrW   ^   sk   
'y 177Bm1F G Gwwrzz2::..DQWWINOOwwK  !"k1*177) 411<? @ @WW's;''(;s+;;B1$q(*+E177#E7== ==""4"45J''$ % %wwK  $CR(88+AGG9 5&$( ) ) GG&c+&&'+5E E==""4"45H''$ % %wwK  !"k1)!'' 311<? @ @GGEGGE	
U	66r"   c                   t        |      st        d      t        j                  |t        j                  j                  |j                        t        j                  |            j                  gS )NzZShape polymorphism for FFT with non-constant fft_length is not implemented for TPU and GPU)
r   NotImplementedErrorr   FftOpFftTypeAttrgetnamer   dense_int_arrayresult)ctxr=   r/   r0   s       r#   _fft_loweringra      sV    	;	'
z
{{	ii3??&&x}}5$$[13396
 r"   c                `    t        | t        j                  |      }|d   }|dd |dz  dz   f   S )NrL   .r   r   )r   r   r   )r=   r0   yns       r#   _naive_rfftre      s8    	!W[[+&!"o!	
3
!Q$(
?	r"   r   c                D   | j                   d t        |        |z   }t        |t        | j                              }t        t        t        |      |      } ||       \  }|j                  t        | j                        k(  sJ |j                  | j                  f       |S )N)r0   )rM   r:   r
   rU   r8   r	   r   re   )tr0   dummy_shapedummy_primal	transposer_   s         r#   _rfft_transposerk      s     *#k**+k9+!+{177/CD,k{3\C)aL'&	QWW-	-Fagg/FF	-	-r"   c           	     h   t        | t        j                  |      }|j                  d   }|d   dz  }t	        t
        j                  | |j                        }t        j                   |dd       |d|dz
  |z   f       |dd|z
  f      gd	
      }dt        j                  |      z  }|t        j                  |t        |j                  dz
              z  |z  }|j                  t        | j                        k(  sJ |j                  | j                  f       t        j                  |      S )NrL   r   rE   g      ?)r   )rM   g       @r   r   )	dimension)r   r   r   rM   r   r   	full_liker8   concatenatemathprodexpand_dimsrangerO   rR   conj)	rg   r0   r=   rd   is_oddfullmaskscaleouts	            r#   _irfft_transposerz      s   
 
!W\\;'!ggbk!r?Q&		1$	CtCA()CF
}%' 	
$
 dii$
$%eAFFQJ&7881<#	nQWW-	-C		177/CC	- 
#r"   c                    |t         j                  k(  rt        | |      }|fS |t         j                  k(  rt	        | |      }|fS t        | ||      }|fS rH   )r   r   rk   r    rz   r   )rg   operandr/   r0   r_   s        r#   _fft_transpose_ruler}      s]    Q,F
 
.	 7== a-F 
. Hk*F	.r"   c                ^    | \  }|\  }t        j                  ||d      }t        |||      dfS )Nr   )r   moveaxisr   )batched_args
batch_dimsr/   r0   r=   bds         r#   _fft_batching_ruler      s8    "!#"2q!!	Q+	&	))r"   )r*   r2   returnr   )r/   zFftType | strr0   zSequence[int])1
__future__r   collections.abcr   enum	functoolsr   rp   numpyr4   jax._srcr   r   jax._src.apir   r	   r
   jax._src.corer   r   jax._src.interpretersr   r   r   jax._src.laxr   jax._src.lib.mlir.dialectsr   __all__IntEnumr   r+   r   rA   rR   rU   rW   ra   re   rk   rz   r}   r   r   def_impldef_abstract_evalregister_lowering
deflinear2primitive_batchersr!   r"   r#   <module>r      s   # $       @ @ 6 $ * &  * 	
!dll ! 
0 F> >(X X1 7D
 A ** 	% y    ) *   um , e( )%7  E "r"   