
    e4                        d dl mZ d dl mZ ddlZddlmZmZmZ ddlZddl	Z	ddl
Z
ddlZdZ G d d          Z G d	 d
          Z ej        d e                      Zd Ze	j        d             Zg dZdZd Z G d d          Zd/dZd Z G d d          Zd Zd Zd Zd Zd Zd Z d Z!d0d!Z"d0d"Z#d1d$Z$d1d%Z%d2d&Z&d2d'Z'd3d(Z(d3d)Z)d4d*Z*d5d+Z+d5d,Z,d6d-Z-d6d.Z.dS )7   )_pydfti)_float_utils    N)takesqrtproda^  
This module implements interfaces mimicing `scipy.fft` module.

It also provides DftiBackend class which can be used to set mkl_fft to be used
via `scipy.fft` namespace.

:Example:
    import scipy.fft
    import mkl_fft._scipy_fft_backend as be
    # Set mkl_fft to be used as backend of SciPy's FFT functions.
    scipy.fft.set_global_backend(be)
c                        e Zd Zd Zd Zd ZdS )_cpu_max_threads_countc                 "    d | _         d | _        d S N)	cpu_countmax_threads_countselfs    :lib/python3.11/site-packages/mkl_fft/_scipy_fft_backend.py__init__z_cpu_max_threads_count.__init__4   s    !%    c                 T    | j         |                                 }|| _         | j         S r   )r   get_max_threads_count)r   max_threadss     r   get_cpu_countz$_cpu_max_threads_count.get_cpu_count8   s*    >!4466K(DN~r   c                 N    | j         t          j                    | _         | j         S r   )r   mklget_max_threadsr   s    r   r   z,_cpu_max_threads_count.get_max_threads_count>   s%    !)%(%8%:%:D"%%r   N)__name__
__module____qualname__r   r   r    r   r   r
   r
   3   sA        & & &  & & & & &r   r
   c                   L    e Zd ZddZed             Zej        d             ZdS )_workers_dataNc                     |r|| _         n%t                                                      | _         t          j        | j                   | _         d S r   )workers_r
   r   operatorindexr   workerss     r   r   z_workers_data.__init__F   sD     	E#DMM244BBDDDM t}55r   c                     | j         S r   )r"   r   s    r   r&   z_workers_data.workersM   s
    }r   c                 8    t          j        |          | _        d S r   )r#   r$   	workerks_)r   workers_vals     r   r&   z_workers_data.workersQ   s    !44r   r   )r   r   r   r   propertyr&   setterr   r   r   r    r    E   s`        6 6 6 6   X ^5 5 ^5 5 5r   r    scipy_backend_workers)defaultc                  >    t                                           j        S )z5Gets the number of workers used by mkl_fft by default)_workers_global_settingsgetr&   r   r   r   get_workersr2   Y   s    #''))11r   c              #   *  K   t          j        |           }d}	 t          |          }t                              |          }dV  |rt                              |           dS t          # |rt                              |           nt          w xY w)zDSet the value of workers used by default, returns the previous valueN)r#   r$   r    r0   setreset
ValueError)	n_workersnwtokennew_wds       r   set_workersr;   ^   s       
		"	"BEr""(,,V44 	$**511111  	$**51111s   -A, ,&B)fftifftfft2ifft2fftnifftnrfftirfftrfft2irfft2rfftnirfftnr2   r;   DftiBackendnumpy.scipy.fftc                 r    t                                          | j        d          }|t          S  ||i |S zFetch registered UA function.Nglobalsr1   r   NotImplementedmethodargskwargsfns       r   __ua_function__rT   t   s;    	v	-	-B	z2tvr   c                   (    e Zd ZdZed             ZdS )rH   rI   c                 r    t                                          | j        d          }|t          S  ||i |S rK   rL   rO   s       r   rT   zDftiBackend.__ua_function__~   s=     YY]]6?D11:!!r4"6"""r   N)r   r   r   __ua_domain__staticmethodrT   r   r   r   rH   rH   |   s2        %M# # \# # #r   rH   c                    |/d}|t          | j                  }nt          | j        |          }nd}t          |          }|+t          t          t	          |           d                    }t	          |          t	          |          k    rt          d          |r|r| j        |d                  dz
  dz  |d<   ||fS )Nr   r   z&Shape and axes have different lengths.   )listshaper   rangelenr6   )asaxesinvreal	shapelesss        r   _cook_nd_argsre      s    y	<QWAAQWd##AA	QA|E3q66'1%%&&
1vvTABBB ,9 ,b"Q&!+"d7Nr   c                 .   | t                                           j        S t          j        |           }|dk    rt          d          |dk     rEt          j                    }||dz   z  }|dk    r$t          d                    | |                     |S )ztHandle conversion of workers to a positive number of threads in the
    same way as scipy.fft.helpers._workers.
    Nr   z"Number of workers must not be zeror   z<workers value out of range; got {}, must not be less than {})	r0   r1   r&   r#   r$   r6   osr   format)w_wubs      r   _workers_to_num_threadsrl      s     	y'++--55			B
a=>>>
Q\^^
b1f77 --3VAs^^= = =Ir   c                        e Zd Zd Zd Zd ZdS )Workersc                 <    || _         t          |          | _        d S r   )r&   rl   	n_threadsr%   s     r   r   zWorkers.__init__   s    099r   c                     	 t          j        | j                  | _        d S #  t	          d                    | j        | j                            xY w)Nz8Class argument {} result in invalid number of threads {})r   set_num_threads_localrp   prev_num_threadsr6   rh   r&   r   s    r   	__enter__zWorkers.__enter__   sT    	~$'$=dn$M$MD!!!	~W^^_c_kmqm{||}}}s	   " /Ac                 8    t          j        | j                   d S r   )r   rr   rs   )r   rQ   s     r   __exit__zWorkers.__exit__   s    !$"788888r   N)r   r   r   r   rt   rv   r   r   r   rn   rn      sD        : : :~ ~ ~9 9 9 9 9r   rn   c                 R    | dvr"t          d                    |                     d S )N)NorthoforwardbackwardzHInvalid norm value {} should be None, "ortho", "forward", or "backward".)r6   rh   )norms    r   _check_normr|      s;    99989?G G 	G :9r   c                 0    | d S t          d|  d          )Nz&Passing a precomputed plan with value=z is currently not supported)NotImplementedError)plans    r   _check_planr      s,    |
RRRR  r   c                 (    | r| n|}|dk    rd|z  ndS )Nr   r   r   )nra   nns      r   _frwd_sc_1dr      s%    QB771R44!r   c                     | | n||t          fd|D                       }nt                    }|dk    rd|z  ndS )Nc                      g | ]
}|         S r   r   ).0aisss     r   
<listcomp>z_frwd_sc_nd.<locals>.<listcomp>   s    )))b2b6)))r   r   r   )r   )ra   rb   x_shaper   r   s       @r   _frwd_sc_ndr      s[    mB))))D)))**"XX771R44!r   c                 <    t          t          | |                    S r   )r   r   )r   ra   s     r   _ortho_sc_1dr      s    Aq!!"""r   c                     | dv rd}n=| dk    rt          ||          }n&| dk    rt          ||          }nt          |            |S NNrz         ?ry   rx   )r   r   r|   )r{   r   ra   fscs       r   _compute_1d_forward_scaler      s^    !!!			!Q	1a  DJr   c                     | dv rd}nL| dk    rt          |||          }n4| dk    rt          t          |||                    }nt          |            |S r   )r   r   r|   )r{   ra   rb   r   r   s        r   _compute_nd_forward_scaler      sj    !!!			!T7++	;q$0011DJr   rZ   Fc                 L   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          |||j        |                   }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S N)r   axisoverwrite_xforward_scale)
r   $__supported_array_or_not_implementedr6   rN   r   r]   r   rn   r   r<   
r`   r   r   r{   r   r&   r   xr   outputs
             r   r<   r<      s	   =a@@   N
#D!QWT]
;
;C			 \ \Q!$KWZ[[[\ \ \ \ \ \ \ \ \ \ \ \ \ \ \M    ++3BB Bc                 L   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          |||j        |                   }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S r   )
r   r   r6   rN   r   r]   r   rn   r   r=   r   s
             r   r=   r=     s	   =a@@   N
#D!QWT]
;
;C			 ] ]a14[X[\\\] ] ] ] ] ] ] ] ] ] ] ] ] ] ]Mr   rZ   c                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||j                  }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S N)r]   rb   r   r   
r   r   r6   rN   r   r]   r   rn   r   r@   
r`   ra   rb   r{   r   r&   r   r   r   r   s
             r   r>   r>        =a@@   N
#D!T17
;
;C			 a aaqt\_```a a a a a a a a a a a a a a aM    ++.BBBc                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||j                  }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S r   
r   r   r6   rN   r   r]   r   rn   r   rA   r   s
             r   r?   r?        =a@@   N
#D!T17
;
;C			 b bq+]`aaab b b b b b b b b b b b b b bMr   c                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||j                  }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S r   r   r   s
             r   r@   r@   ,  r   r   c                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||j                  }t          |           t          |          5  t          j	        |||||          }	d d d            n# 1 swxY w Y   |	S r   r   r   s
             r   rA   rA   :  r   r   c                 J   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          |||j        |                   }t          |           t          |          5  t          j	        ||||          }d d d            n# 1 swxY w Y   |S )Nr   r   r   )
r   r   r6   rN   r   r]   r   rn   r   
rfft_numpy)	r`   r   r   r{   r&   r   r   r   r   s	            r   rB   rB   H  s   =a@@   N
#D!QWT]
;
;C			 J J#ASIIIJ J J J J J J J J J J J J J JMs    ++3BBBc                 x   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S |r|nd|j        |         dz
  z  }t          |||j        |                   }t          |           t          |          5  t          j	        ||||          }	d d d            n# 1 swxY w Y   |	S )Nr[   r   r   )
r   r   r6   rN   r]   r   r   rn   r   irfft_numpy)
r`   r   r   r{   r&   r   r   r   r   r   s
             r   rC   rC   V  s$   =a@@   N	(Qa(B
#D"agdm
<
<C			 K K$Q!$cJJJK K K K K K K K K K K K K K KMs    ++
B//B36B3c                    | dv rd}n| dk    r-t          ||||          \  }}t          |||j                  }nO| dk    r:t          ||||          \  }}t          t          |||j                            }nt	          |            |||fS )Nr   r   ry   rc   rx   )re   r   r]   r   r|   )r{   ra   rb   r   rc   r   s         r   "_compute_nd_forward_scale_for_rfftr   e  s    !!!			1dG<<<4!T17++	1dG<<<4;q$0011DdC<r   c                 >   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||          \  }}}t          |           t          |          5  t          j        ||||          }d d d            n# 1 swxY w Y   |S Nr   	r   r   r6   rN   r   r   rn   r   rfftn_numpy	r`   ra   rb   r{   r&   r   r   r   r   s	            r   rD   rD   s  	   =a@@   N5dAtQGGLAtS			 D D$Q4sCCCD D D D D D D D D D D D D D DM    ++-BBBc                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||d          \  }}}t          |           t          |          5  t          j        ||||          }d d d            n# 1 swxY w Y   |S NTr   r   	r   r   r6   rN   r   r   rn   r   irfftn_numpyr   s	            r   rE   rE        =a@@   N5dAtQPTUUULAtS			 E E%aDDDDE E E E E E E E E E E E E E EM    ++/BBBc                 >   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||          \  }}}t          |           t          |          5  t          j        ||||          }d d d            n# 1 swxY w Y   |S r   r   r   s	            r   rF   rF     r   r   c                 B   	 t          j        |           }n# t          $ r
 t          cY S w xY w|t          u r|S t	          ||||d          \  }}}t          |           t          |          5  t          j        ||||          }d d d            n# 1 swxY w Y   |S r   r   r   s	            r   rG   rG     r   r   )NNr   )NrZ   NFNN)Nr   NFNN)NNNFNN)NrZ   NNN)F)Nr   NNN)NNNNN)/ r   r   r   
numpy.corer   r   r   contextvars
contextlibr#   rg   __doc__r
   r    
ContextVarr0   r2   contextmanagerr;   __all__rW   rT   rH   re   rl   rn   r|   r   r   r   r   r   r   r<   r=   r>   r?   r@   rA   rB   rC   r   rD   rE   rF   rG   r   r   r   <module>r      s:  6             



 ) ) ) ) ) ) ) ) ) )          				& & & & & & & &$5 5 5 5 5 5 5 5" 2;12IS`S`SbSbccc 2 2 2
   8 8 8 "  # # # # # # # #   &  $9 9 9 9 9 9 9 9 G G G  " " "
" " "# # #	 	 		 	 	                                         r   