o
    Nrf81                     @  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)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   \/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/dask/array/backends.py
percentile#   s   r   c                 C  s`   t jj| |d}dd | D }tdd |D rt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>+   s    z _concatenate.<locals>.<listcomp>c                 s  s    | ]	}t |tjV  qd S r   )
isinstancenpndarray)r    fr   r   r   	<genexpr>,   s    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   

r0      c                   s&  zt | W n ty   tt| dttd|Y nw |\z
t}tW n ty;   gd}Y nw z
t}tW n tyT   gd}Y nw | j | j}|j|j}d}||krjd}n3t|D ].} |  |  krd} n| dk r|  |7  < | dk r|  |7  < qn|stdfddt|D }	|	 }
d}D ]}| | 9 }qd|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                      g | ]}| vr|qS r   r   r    k)axes_ar   r   r"   f       z_tensordot.<locals>.<listcomp>c                      g | ]} | qS r   r   r    r   )as_r   r   r"   l       c                   r2   r   r   r3   )axes_br   r   r"   n   r6   c                   r8   r   r   r9   )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   )r:   r5   r<   r=   r   
_tensordot8   sr   rM   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                       j | fi |S r   )ZasnumpydatakwargsrN   r   r   cupy_to_numpy      z$register_cupy.<locals>.cupy_to_numpyc                   rO   r   )ZasarrayrP   rS   r   r   numpy_to_cupy   rU   z$register_cupy.<locals>.numpy_to_cupyc                    s(   | dd  | dd   j| i |S )NZcastingorder)popeinsum)argsrR   rS   r   r   _cupy_einsum   s   z#register_cupy.<locals>._cupy_einsum)rN   r   registerr%   r*   r   	tensordotr   r   r
   _numel_arrayliker	   	_nannumelr   r   r$   r   )rT   rV   r[   r   rS   r   register_cupy|   s   


r`   Zcupyxc               
     sp   ddl m}  z
ddl m m W n ty! } ztd|d }~ww 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                   s0   |dkr| S |dkr | S d| }t |)Nr   r(   zECan only concatenate cupy sparse matrices for axis in {0, 1}.  Got %s)r,   Lr   msgrb   r   r   _concat_cupy_sparse   s   z+register_cupyx.<locals>._concat_cupy_sparser   )	Zcupyx.scipy.sparsera   rc   rd   ImportErrorr   r\   r   _tensordot_scipy_sparse)ra   erh   r   rb   r   register_cupyx   s   rm   sparsec                  C  sH   dd l } t| j| j t| j| j t| jt t	| jt
 d S )Nr   )rn   r   r\   ZCOOr*   r   r]   r
   _numel_ndarrayr	   _nannumel_sparse)rn   r   r   r   register_sparse   s
   rq   scipyc                    s:   dd l  d fdd	} t jj|  t jjt d S )Nr   c                   s8   |dkr
 j | S |dkr j | S d| }t|)Nr   r(   zFCan only concatenate scipy sparse matrices for axis in {0, 1}.  Got %s)rn   rd   rc   r,   re   rr   r   r   r0      s   z+register_scipy_sparse.<locals>._concatenateri   )Zscipy.sparser   r\   rn   ra   r   rk   )r0   r   rs   r   register_scipy_sparse   s   rt   c                 C  s   | j |j   krdksJ  J t|d t|d   kr#dks&J  J |d \}|d \}|dv r8|dv s:J | j| |j| ksFJ |dkrS|dkrS| j| S |dkra|dkra| j|j S |dkrm|dkrm| | S |dkrz|dkr|| |j S d S d S )Nr1   r   r(   )r   r(   )rC   r.   rB   T)r   rE   rF   Za_axisZb_axisr   r   r   rk      s    ,



rk   c                 K  s   t jt| fi |S )z'Numel implementation for masked arrays.)r   sumr$   Z	ones_likexrR   r   r   r   _numel_masked   s   ry   c                 K     t | fddi|S )zJNumel implementation for arrays that want to return numel of type ndarray.coerce_np_ndarrayT_numelrw   r   r   r   ro      s   ro   c                 K  rz   )zKNumel implementation for arrays that want to return numel of the same type.r{   Fr|   rw   r   r   r   r^      s   r^   r{   boolc                   s&  | j |dd}|dd |dtj} du rBtj|d}|du r'|S |r5tjdt ||dS tj| |dt |d	S t t	t
fsL g tfd
d D }|du rmt	 fddttD }nt	 fddttD }|rttj||d|S tj| |||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)r   )r(   )rB   r   r   )rB   r   c                 3  s    | ]} | V  qd S r   r   r    dim)rB   r   r   r'     s    z_numel.<locals>.<genexpr>Tc                 3  s$    | ]}| vr| nd V  qdS )r(   Nr   r   r   rB   r   r   r'     s    
c                 3  s     | ]}| vr| V  qd S r   r   r   r   r   r   r'     s    )rB   getr$   Zfloat64prodfullr.   Z	full_liker#   tupler@   mathrA   Zbroadcast_toarray)rx   r{   rR   r   r   r   Z	new_shaper   r   r   r}      s,   

 r}   c                 K  s   t jt|  fi |S )z;A reduction to count the number of elements, excluding nans)r   rv   r$   isnanrw   r   r   r   r_   %  s   r_   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)r_   r   r   )rx   rR   nr   r   r   rp   +  s   rp   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     t )zReturn the backend-specific RandomState class

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

        Returns a new array having a specified shape and filled
        with ones.
        r   rB   r   r   rR   r   r   r   onesO  r   zArrayBackendEntrypoint.onesc                K  r   )zvCreate an array of zeros

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

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

        Returns a new array having a specified shape and filled
        with fill_value.
        r   )rB   r   r   r   rR   r   r   r   r   i  r   zArrayBackendEntrypoint.fullr(   c               K  r   )zCreate an ascending or descending array

        Returns evenly spaced values within the half-open interval
        ``[start, stop)`` as a one-dimensional array.
        r   )startstopstepr   r   rR   r   r   r   aranger  r   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   rP   r   r   r   to_numpy_dispatch_from_numpy|     r   c                   @  s>   e Zd Zedd Ze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  r   z*NumpyBackendEntrypoint.to_backend_dispatchrQ   r   c                 K  s(   t |jtjr	|S |j|  fi |S r   )r#   _metar$   r%   Z
map_blocksr   )r   rQ   rR   r   r   r   
to_backend  s   z!NumpyBackendEntrypoint.to_backendc                 C     t jjS r   )r$   randomr   r   r   r   r   r        z"NumpyBackendEntrypoint.RandomStatec                 C  r   r   )r$   r   ZPCG64r   r   r   r   r     r   z,NumpyBackendEntrypoint.default_bit_generatorN)rQ   r   )	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   ri   )r1   )r{   r~   ):
__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   r\   objectr%   r*   r]   rY   r   r)   Zmasked_arrayr   r0   rM   Zregister_lazyr`   rm   rq   rt   rk   ry   ro   r^   r}   r_   rp   r   r   r   r   Zregister_backendr   r   r   r   <module>   sz    0
C


(

C
