a
    tDf81                     @  s  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mZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ e
eejfej  eeejfej! eeejfej" eeejfej# eej$j%ej$j# eeejfe eej$j%e eejd8ddZ&e
ej$j%d9ddZ'eej$j%d:ddZ(e)de
)de)de)de)ddd Z*e)de
)ddd Z+e)de
)de)de)ddd Z,e)de
)ddd Z-dd Z.eej$j%d d! Z/eeejfd"d# Z0d$d% Z1d&d'd(d)Z2eeejfd*d+ Z3d,d- Z4G d.d/ d/eZ5eejd0d1 Z6G d2d3 d3e5Z7ed4d5e5d6d7Z8e89d5e7  dS );    )annotationsN)chunk)Array)
concatenate_lookupdivide_lookupeinsum_lookupempty_lookupnannumel_lookupnumel_lookuppercentile_lookuptensordot_lookupto_cupy_dispatchto_numpy_dispatch)divide)	ma_divide_percentile)CreationDispatchDaskBackendEntrypointlinearc                 C  s   t | ||S Nr   )aqmethod r   `/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/dask/array/backends.py
percentile#   s    r   c                 C  s`   t jj| |d}dd | D }tdd |D r8td|r\t |}t|dkr\|d |_|S )	N)axisc                 S  s   g | ]}t |d r|jqS )
fill_value)hasattrr   ).0ir   r   r   
<listcomp>+       z _concatenate.<locals>.<listcomp>c                 s  s   | ]}t |tjV  qd S r   )
isinstancenpndarray)r    fr   r   r   	<genexpr>,   r#   z_concatenate.<locals>.<genexpr>zADask doesn't support masked array's with non-scalar `fill_value`s   r   )r%   maconcatenateany
ValueErroruniquelenr   )Zarraysr   outZfill_valuesr   r   r   _concatenate(   s    

r1      c                   s2  zt | W n0 ty<   tt| dttd|Y n
0 |\zt}tW n tyv   gd}Y n0 zt}tW n ty   gd}Y n0 | j | j}|j|j}d}||krd}nlt|D ]b} |  |  krd} q@| dk r"|  |7  < | dk r܈|  |7  < q|sNtdfddt|D }	|	 }
d}D ]}| | 9 }qtd|f} fd	d|	D }fd
dt|D }	|	 }d}D ]}|| 9 }q|df}fdd|	D }| |
	|}||	|}t
j||}|	|| S )Nr   r)   TFzshape-mismatch for sumc                   s   g | ]}| vr|qS r   r   r    k)axes_ar   r   r"   f   r#   z_tensordot.<locals>.<listcomp>c                   s   g | ]} | qS r   r   r    r   )as_r   r   r"   l   r#   c                   s   g | ]}| vr|qS r   r   r3   )axes_br   r   r"   n   r#   c                   s   g | ]} | qS r   r   r7   )bsr   r   r"   t   r#   )iter	TypeErrorlistranger/   shapendimr-   Z	transposeZreshaper%   r*   dot)r   baxesnanbZndaZndbequalr4   notinZ	newaxes_aZN2r   Z
newshape_aZoldaZ	newaxes_bZ
newshape_bZoldbatZbtresr   )r8   r5   r9   r:   r   
_tensordot8   sj    

rJ   cupyc                    s   dd l  t j j t j j t jt t	 jt
 t jt t j fdd} ttj fdd}t j fdd}d S )Nr   c                   s    j | fi |S r   )ZasnumpydatakwargsrK   r   r   cupy_to_numpy   s    z$register_cupy.<locals>.cupy_to_numpyc                   s    j | fi |S r   )ZasarrayrL   rO   r   r   numpy_to_cupy   s    z$register_cupy.<locals>.numpy_to_cupyc                    s(   | dd  | dd   j| i |S )NZcastingorder)popeinsum)argsrN   rO   r   r   _cupy_einsum   s    z#register_cupy.<locals>._cupy_einsum)rK   r   registerr&   r+   r   	tensordotr   r   r
   _numel_arrayliker	   	_nannumelr   r   r%   r   )rP   rQ   rV   r   rO   r   register_cupy|   s    


r[   Zcupyxc               
     s|   ddl m}  zddl m m W n. tyN } ztd|W Y d }~n
d }~0 0 d fdd	}t| | t| t d S )Nr   )spmatrixhstackvstackz>Stacking of sparse arrays requires at least CuPy version 8.0.0c                   s4   |dkr| S |dkr  | S d| }t |d S )Nr   r)   zECan only concatenate cupy sparse matrices for axis in {0, 1}.  Got %s)r-   Lr   msgr]   r   r   _concat_cupy_sparse   s    z+register_cupyx.<locals>._concat_cupy_sparse)r   )	Zcupyx.scipy.sparser\   r^   r_   ImportErrorr   rW   r   _tensordot_scipy_sparse)r\   erc   r   r]   r   register_cupyx   s    rg   sparsec                  C  sH   dd l } t| j| j t| j| j t| jt t	| jt
 d S )Nr   )rh   r   rW   ZCOOr+   r   rX   r
   _numel_ndarrayr	   _nannumel_sparse)rh   r   r   r   register_sparse   s
    rk   scipyc                    s:   dd l  d fdd	} t jj|  t jjt d S )Nr   c                   s<   |dkr j | S |dkr( j | S d| }t|d S )Nr   r)   zFCan only concatenate scipy sparse matrices for axis in {0, 1}.  Got %s)rh   r_   r^   r-   r`   rl   r   r   r1      s    z+register_scipy_sparse.<locals>._concatenate)r   )Zscipy.sparser   rW   rh   r\   r   re   )r1   r   rm   r   register_scipy_sparse   s    rn   c                 C  s   | j |j   krdksn J t|d t|d   krBdksHn J |d \}|d \}|dv rl|dv spJ | j| |j| ksJ |dkr|dkr| j| S |dkr|dkr| j|j S |dkr|dkr| | S |dkr|dkr| |j S d S )Nr2   r   r)   )r   r)   )r@   r/   r?   T)r   rB   rC   Za_axisZb_axisr   r   r   re      s    *


re   c                 K  s   t jt| fi |S )z'Numel implementation for masked arrays.)r   sumr%   Z	ones_likexrN   r   r   r   _numel_masked   s    rs   c                 K  s   t | fddi|S )zJNumel implementation for arrays that want to return numel of type ndarray.coerce_np_ndarrayT_numelrq   r   r   r   ri      s    ri   c                 K  s   t | fddi|S )zKNumel implementation for arrays that want to return numel of the same type.rt   Fru   rq   r   r   r   rY      s    rY   bool)rt   c                   s,  | j |dd}|dd |dtj} du rtj|d}|du rN|S |rjtjdt ||dS tj| |dt |d	S t t	t
fs g tfd
d D }|du rt	 fddttD }n t	 fddttD }|rttj||d|S tj| |||d	S dS )a	  
    A reduction to count the number of elements.

    This has an additional kwarg in coerce_np_ndarray, which determines
    whether to ensure that the resulting array is a numpy.ndarray, or whether
    we allow it to be other array types via `np.full_like`.
    keepdimsFr   Ndtype)ry   )r)   )r?   r   ry   )r?   ry   c                 3  s   | ]} | V  qd S r   r   r    Zdim)r?   r   r   r(     r#   z_numel.<locals>.<genexpr>Tc                 3  s"   | ]}| vr| nd V  qdS )r)   Nr   rz   r   r?   r   r   r(     s   c                 3  s   | ]}| vr| V  qd S r   r   rz   r{   r   r   r(     r#   )r?   getr%   float64prodfullr/   Z	full_liker$   tupler=   mathr>   Zbroadcast_toarray)rr   rt   rN   rx   ry   r~   Z	new_shaper   r{   r   rv      s,    

 rv   c                 K  s   t jt|  fi |S )z;A reduction to count the number of elements, excluding nans)r   rp   r%   isnanrq   r   r   r   rZ   %  s    rZ   c                 K  s&   t | fi |}t|dr"| S |S )a  
    A reduction to count the number of elements in a sparse array, excluding nans.
    This will in general result in a dense matrix with an unpredictable fill value.
    So make it official and convert it to dense.

    https://github.com/dask/dask/issues/7169
    todense)rZ   r   r   )rr   rN   nr   r   r   rj   +  s    rj   c                   @  s   e Zd ZdZedd Zedd Zeddddd	Zedddd
dZ	edddddZ
edddddZeddddddZdS )ArrayBackendEntrypointzjDask-Array version of ``DaskBackendEntrypoint``

    See Also
    --------
    NumpyBackendEntrypoint
    c                 C  s   t dS )zReturn the backend-specific RandomState class

        For example, the 'numpy' backend simply returns
        ``numpy.random.RandomState``.
        NNotImplementedErrorselfr   r   r   RandomStateA  s    z"ArrayBackendEntrypoint.RandomStatec                 C  s   t dS )z$Return the default BitGenerator typeNr   r   r   r   r   default_bit_generatorJ  s    z,ArrayBackendEntrypoint.default_bit_generatorN)ry   metac                K  s   t dS )ztCreate an array of ones

        Returns a new array having a specified shape and filled
        with ones.
        Nr   r?   ry   r   rN   r   r   r   onesO  s    zArrayBackendEntrypoint.onesc                K  s   t dS )zvCreate an array of zeros

        Returns a new array having a specified shape and filled
        with zeros.
        Nr   r   r   r   r   zerosX  s    zArrayBackendEntrypoint.zerosc                K  s   t dS )z`Create an empty array

        Returns an uninitialized array having a specified shape.
        Nr   r   r   r   r   emptya  s    zArrayBackendEntrypoint.emptyc                K  s   t dS )zCreate a uniformly filled array

        Returns a new array having a specified shape and filled
        with fill_value.
        Nr   )r?   r   ry   r   rN   r   r   r   r   i  s    zArrayBackendEntrypoint.fullr)   c               K  s   t dS )zCreate an ascending or descending array

        Returns evenly spaced values within the half-open interval
        ``[start, stop)`` as a one-dimensional array.
        Nr   )startstopstepry   r   rN   r   r   r   aranger  s    zArrayBackendEntrypoint.arange)Nr)   )__name__
__module____qualname____doc__propertyr   r   staticmethodr   r   r   r   r   r   r   r   r   r   9  s   

r   c                 K  s   | S r   r   rL   r   r   r   to_numpy_dispatch_from_numpy|  s    r   c                   @  sB   e Zd Zedd ZeddddZedd Zed	d
 ZdS )NumpyBackendEntrypointc                 C  s   t S r   )r   )clsr   r   r   to_backend_dispatch  s    z*NumpyBackendEntrypoint.to_backend_dispatchr   )rM   c                 K  s(   t |jtjr|S |j|  fi |S r   )r$   Z_metar%   r&   Z
map_blocksr   )r   rM   rN   r   r   r   
to_backend  s    z!NumpyBackendEntrypoint.to_backendc                 C  s   t jjS r   )r%   randomr   r   r   r   r   r     s    z"NumpyBackendEntrypoint.RandomStatec                 C  s   t jjS r   )r%   r   ZPCG64r   r   r   r   r     s    z,NumpyBackendEntrypoint.default_bit_generatorN)	r   r   r   classmethodr   r   r   r   r   r   r   r   r   r     s   

r   r   numpyarray_creation_dispatch)module_namedefaultZentrypoint_classname)r   )r   )r2   ):
__future__r   r   r   r%   Z
dask.arrayr   Zdask.array.corer   Zdask.array.dispatchr   r   r   r   r	   r
   r   r   r   r   Zdask.array.numpy_compatr   Z	np_divider   Zdask.array.percentiler   Zdask.backendsr   r   rW   objectr&   r+   rX   rT   r   r*   Zmasked_arrayr   r1   rJ   Zregister_lazyr[   rg   rk   rn   re   rs   ri   rY   rv   rZ   rj   r   r   r   r   Zregister_backendr   r   r   r   <module>   sx   0
C

(
C

