a
    _$a(                     @   s  d dl mZ d dl mZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZmZm Z  ddl!m"Z# ddl$Z$G dd	 d	Z%e% Z&g d
Z'dZ(e) Z*dd Z+dd Z,dd Z-d5ddZ.dd Z/dd Z0G dd dZ1e,ejd6ddZe,ej2d7ddZ2e,ej3d8d!d"Z3e,ej4d9d#d$Z4e,ej5d:d%d&Z5e,ej6d;d'd(Z6e,ej7d<d)d*Z7e,ej8d=d+d,Z8e,ej9d>d-d.Z9e,ej:d?d/d0Z:e,ej;d@d1d2Z;e,ej<dAd3d4Z<dS )B   )_pydfti)_float_utils    N)dctidctdstidstdctnidctndstnidstnhfft2ihfft2hfftnihfftnfftshift	ifftshiftfftfreqrfftfreqget_workersset_workers)arrayasarrayshape	conjugatetakesqrtprod)	cpu_countc                   @   s$   e Zd Zdd Zdd Zdd ZdS )_cpu_max_threads_countc                 C   s   d | _ d | _d S N)r   max_threads_countself r$   9lib/python3.9/site-packages/mkl_fft/_scipy_fft_backend.py__init__.   s    z_cpu_max_threads_count.__init__c                 C   s>   |   }| jd u r8t | _| j|kr8td| j| | jS )Nzos.cpu_count() returned value of {} greater than mkl.get_max_threads()'s value of {}. Using negative values of worker option may amount to requesting more threads than Intel(R) MKL can acommodate.)get_max_threads_countr   os_cpu_countwarningswarnformat)r#   Zmax_threadsr$   r$   r%   get_cpu_count2   s    

z$_cpu_max_threads_count.get_cpu_countc                 C   s   | j d u rt | _ | j S r    )r!   mklZget_max_threadsr"   r$   r$   r%   r'   >   s    

z,_cpu_max_threads_count.get_max_threads_countN)__name__
__module____qualname__r&   r,   r'   r$   r$   r$   r%   r   -   s   r   )!fftifftfft2ifft2fftnifftnrfftirfftrfft2irfft2rfftnirfftnZhfftZihfftr   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   Znext_fast_lenznumpy.scipy.fftc                 C   s&   t | d}|du rtS ||i |S )zFetch registered UA function.N)__implementedgetNotImplemented)methodargskwargsfnr$   r$   r%   __ua_function__R   s    rD   c                    s    fdd}|S )zEDecorator adds function to the dictionary of implemented UA functionsc                    s   | t  < | S r    )r=   )func
scipy_funcr$   r%   inner\   s    z_implements.<locals>.innerr$   )rG   rH   r$   rF   r%   _implementsZ   s    rI   c                 C   s   | dvrt d|  | d uS )N)NZorthoz1Invalid norm value %s, should be None or "ortho".)
ValueError)normr$   r$   r%   _unitaryc   s
    rL   c                 C   s   |d u r.d}|d u r t | j}q2t| j|}nd}t |}|d u rVt tt| d}t|t|krntd|r|r| j|d  d d |d< ||fS )Nr   r   z&Shape and axes have different lengths.   )listr   r   rangelenrJ   )asaxesZinvrealZ	shapelessr$   r$   r%   _cook_nd_argsj   s    rU   c                    s*   | j  |d u r| jS t fdd|D S )Nc                    s   g | ]} | qS r$   r$   ).0ZairS   r$   r%   
<listcomp>       z_tot_size.<locals>.<listcomp>)r   sizer   )xrT   r$   rW   r%   	_tot_size}   s    r\   c                 C   s`   | du rt  S t| }|dkr&td|dk r\|t d 7 }|dkr\td| t  |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 be nonzeror   z<workers value out of range; got {}, must not be less than {})r   intrJ   _hardware_countsr,   r+   )wZ_wr$   r$   r%   _workers_to_num_threads   s    
r`   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )Workersc                 C   s   || _ t|| _d S r    )workersr`   	n_threads)r#   rb   r$   r$   r%   r&      s    zWorkers.__init__c                 C   s8   zt | j| _W n    td| j| jY n0 d S )Nz8Class argument {} result in invalid number of threads {})r-   set_num_threads_localrc   prev_num_threadsrJ   r+   rb   r"   r$   r$   r%   	__enter__   s    zWorkers.__enter__c                 G   s   t | j d S r    )r-   rd   re   )r#   rA   r$   r$   r%   __exit__   s    zWorkers.__exit__N)r.   r/   r0   r&   rf   rg   r$   r$   r$   r%   ra      s   ra   rM   Fc                 C   sf   t | }t|" tj||||d}W d    n1 s:0    Y  t|rb|dt|j|  9 }|S )Nnaxisoverwrite_xr   )r   __upcast_float16_arrayra   r   r1   rL   r   r   rR   ri   rj   rK   rk   rb   r[   outputr$   r$   r%   r1      s    

0r1   c                 C   sb   t | }t|" tj||||d}W d    n1 s:0    Y  t|r^|t|j| 9 }|S )Nrh   )r   rl   ra   r   r2   rL   r   r   rm   r$   r$   r%   r2      s    

0r2   rM   c           
      C   s|   t | }t|" tj||||d}W d    n1 s:0    Y  t|rxd}|D ]}	|dt|j|	  9 }qT||9 }|S N)r   rT   rk   r   )r   rl   ra   r   r5   rL   r   r   )
rR   rS   rT   rK   rk   rb   r[   rn   factorrj   r$   r$   r%   r3      s    

0r3   c                 C   s   t | }t|" tj||||d}W d    n1 s:0    Y  t|rd}|d u rbt|jn|}	|	D ]}
|t|j	|
 9 }qj||9 }|S rq   
r   rl   ra   r   r6   rL   rP   ndimr   r   rR   rS   rT   rK   rk   rb   r[   rn   rr   Z_axesrj   r$   r$   r%   r4      s    

0r4   c                 C   s   t | }t|" tj||||d}W d    n1 s:0    Y  t|rd}|d u rbt|jn|}	|	D ]}
|dt|j	|
  9 }qj||9 }|S rq   )
r   rl   ra   r   r5   rL   rP   rt   r   r   ru   r$   r$   r%   r5      s    

0r5   c                 C   s   t | }t|" tj||||d}W d    n1 s:0    Y  t|rd}|d u rbt|jn|}	|	D ]}
|t|j	|
 9 }qj||9 }|S rq   rs   ru   r$   r$   r%   r6      s    

0r6   c                 C   s   t | }t|}t |}|r:|d u r:t|}|j| }t|  tj|||d}W d    n1 sh0    Y  |r|dt	| 9 }|S )Nri   rj   r   )
r   rl   rL   __downcast_float128_arrayr   r   ra   r   Z
rfft_numpyr   )rR   ri   rj   rK   rb   r[   unitaryrn   r$   r$   r%   r7      s    



.r7   c                 C   sj   t | }t |}t|  tj|||d}W d    n1 sB0    Y  t|rf|t|j| 9 }|S )Nrv   )	r   rl   rw   ra   r   Zirfft_numpyrL   r   r   )rR   ri   rj   rK   rb   r[   rn   r$   r$   r%   r8      s    


.r8   c                 C   s$   t | }t | }t|||||S r    )r   rl   rw   r;   rR   rS   rT   rK   rb   r[   r$   r$   r%   r9   
  s    

r9   c                 C   s$   t | }t |}t|||||S r    )r   rl   rw   r<   ry   r$   r$   r%   r:     s    

r:   c           	      C   s   t |}t| }t|}|r8t|}t|||\}}t| t|||}W d    n1 sd0    Y  |rt	t||j
d}|dt| 9 }|S )N)dtyper   )rL   r   rl   rw   r   rU   ra   r   Zrfftn_numpyr   rz   r   )	rR   rS   rT   rK   rb   rx   r[   rn   Zn_totr$   r$   r%   r;     s    


,r;   c                 C   sh   t | }t |}t| t|||}W d    n1 s@0    Y  t|rd|tt||9 }|S r    )	r   rl   rw   ra   r   Zirfftn_numpyrL   r   r\   )rR   rS   rT   rK   rb   r[   rn   r$   r$   r%   r<   (  s    


,r<   )NNr   )NrM   NFN)NrM   NFN)Nro   NFN)Nro   NFN)NNNFN)NNNFN)NrM   NN)NrM   NN)Nro   NN)Nro   NN)NNNN)NNNN)= r   r   r-   Z	scipy.fftr1   Z_fftr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   Z
numpy.corer   r   r   r   r   r   r   osr   r(   r)   r   r^   __all__Z__ua_domain__dictr=   rD   rI   rL   rU   r\   r`   ra   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r$   r$   r$   r%   <module>   sV   P$	
		
